Jenkins简介
Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象的展示项目构建的趋势和稳定性。
如何配置
配置路线大体可以参考《Jenkins持续集成入门到精通》.pdf
链接:https://pan.baidu.com/s/1lGq0D1NhojqTaqLBnF8LPw 提取码:6666
虚拟机安装Jenkins
因为Jenkins是java语言写的,所以首先在208机器上配置jdk,版本为11,然后下载配置Jenkins,maven,Git,完全按照《Jenkins持续集成入门到精通》上的可能会有版本过老导致Jenkins上面的可下载插件不兼容的问题,这个时候可以下载新的Jenkins配置一下就可以解决。
详细配置可参考:《Jenkins持续集成入门到精通》中Jenkins安装和持续集成环境配置
Jenkins凭证管理
《Jenkins持续集成入门到精通》上面是集成gitlab,集成云效跟教程里的效果一样,具体操作:
一、点击红框处
二、
三、
四、
五、在下面具体配置:
类型我们一般选择HTTPS账户密码类型的或者ssh类型的(在项目中我是用的HTTPS类型的)
范围默认就行
用户名和密码需要填写(取自云效)
1、点击个人设置
2、设置账户密码
3、回到第五步,将账户密码设置上去点击创建即可。
ID、描述可以不写
六、至此,你的就会保存,同时生成唯一标识。
测试凭证是否通过:可继续参考 《Jenkins持续集成入门到精通》-> 持续集成环境(4)
Maven配置
参考**《Jenkins持续集成入门到精通》-> 持续集成环境(5)-Maven安装和配置**
pipeline流水线
在此次平台建设过程中,我们需要对项目进行CICD,可以使用流水线来对项目进行自动拉取,构建,部署。
pipeline使用方式可直接参考:《Jenkins持续集成入门到精通》->Jenkins项目构建类型(4)-Pipeline流水线项目构建
具体使用
下面我利用Jenkins结合ns-service-support-user微服务进行持续集成部署操作。
第一步、部署前,需要在项目中添加相关依赖以及文件。
1、springboot项目打包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.6</version>
</plugin>
2、添加dockerfile-maven-plugin依赖,添加此依赖后,可以通过dockerfile编译生成镜像
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
<PRO_NAME>${project.build.finalName}</PRO_NAME>
</buildArgs>
</configuration>
</plugin>
3、当前项目根目录添加dockerfile文件(把当前项目jar包生成docker镜像)
FROM openjdk:11
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
COPY ./lib/skywalking-agent.jar ./lib/skywalking-agent.jar
EXPOSE 8098
ENTRYPOINT ["java","-javaagent:./lib/skywalking-agent.jar","-Dskywalking.agent.service_name=","-Dskywalking.collector.backend_service=192.168.192.168.xxx.xxx:11800","-jar","/app.jar"]
4、当前项目根目录添加Jenkinsfile文件对应Jenkins流水线
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
echo "拉取完成"
}
stage('编译构建') {
def code = sh (
script: "docker ps | grep ${Microservices}",
returnStatus: true
)
// code 为0 代表 grep 找到 了 ${Microservices} 相关 的 container
if (code==0){
//首先停止并删除一个容器x
sh ("docker ps -f name=${Microservices} -q | xargs --no-run-if-empty docker container kill")
sh ("docker ps -f name=192.168.xxx.xxx:5000/${Microservices} -q | xargs --no-run-if-empty docker container kill")
sh ("sleep 10s")
sh ("docker container ls -a -f name=${Microservices} -q | xargs -r docker container rm -f")
sh ("docker container ls -a -f name=192.168.xxx.xxx:5000/${Microservices} -q | xargs -r docker container rm -f")
sh ("sleep 10s")
//删除镜像
// sh ("docker rmi ${Microservices}")
sh ("docker rmi -f 192.168.xxx.xxx:5000/${Microservices}")
}
//调用当前微服务dockerfile
sh label: '', script: 'mvn clean package -e -X -U dockerfile:build'
sh "/mydata/hostmachine_jenkins/version/version_up.sh ${Microservices} ${NEW_VERSION}"
def PROJECT_VERSION = readFile "/mydata/hostmachine_jenkins/version/${Microservices}"
// def NEW_VERSION="${PROJECT_VERSION}"
//将当前进镜像名修改为192.168.192.168.xxx.xxx:5000/${Microservices}:${NEW_VERSION}
sh ("docker tag ${Microservices}:latest 192.168.192.168.xxx.xxx:5000/${Microservices}:${PROJECT_VERSION}")
//push到私有仓库中
sh ("docker push 192.168.192.168.xxx.xxx:5000/${Microservices}:${PROJECT_VERSION}")
echo "构建完成"
}
stage('部署上线'){
//sh "docker run -d --net=swarm-test --name ${Microservices} -p ${port}:${port} ${Microservices}"
//sh ("docker stack deploy --compose-file=/mydata/hostmachine_jenkins/jenkins_deploy.yml api")
def PROJECT_VERSION = readFile "/mydata/hostmachine_jenkins/version/${Microservices}"
//按行读取
def lines = PROJECT_VERSION.split("\n")[0]
echo "$lines"
sh "docker service update --image 192.168.192.168.xxx.xxx:5000/${Microservices}:${lines} qa_${Microservices}"
echo "部署完成"
sh ("sleep 10s")
sh ("java -jar /mydata/hostmachine_jenkins/dingding.jar jenkins ${deployer}在${publishTime}将${Microservices}模块更新至${lines},部署已完成")
}
}
新建任务,选择流水线项目
创建完毕会跳到configuration配置界面,点击流水线,
定义选择pipeline script from SCM
Repository URL复制云效上项目的HTTPS
Credentials选择之前创建的全局凭证
指定分支写上你需要用的
继续往下滑,会看到脚本路径这个参数,这个就是对应你项目上的Jenkinsfile文件
继续
点击General,选择参数化构建过程并点击添加参数
添加凭据参数
添加选项参数(这个只针对当前项目其实可以在项目中写死就够了)
添加文本参数
添加选项参数(同样只针对当前项目可以写死)
添加port,对应项目中的port
添加部署人员,方便知道当前是谁部署了项目
添加时间参数,对应钉钉消息提示
添加版本号,手动输入更迭版本号
以上的参数就是对应的Jenkinsfile文件中的${***},当点击构建的时候对应的参数就会映射到Jenkinsfile文件中。
构建触发器,作用是自动出发构建项目
使用方式请直接参考:《Jenkins持续集成入门到精通》->Jenkins项目构建细节(1)-常用的构建触发器
设置好后,可以先点击应用然后保存
进入自己创建的项目,界面如下:
点击build with parameter,选择或者填写对应的参数
PROJECT_VERSION项目版本号参数如果不知道上一个版本,我们可以到portainer中查看对应的服务后缀,此后缀就是对应的当前正在运行的项目版本号。
此时PROJECT_VERSION可以设为1.0.5
所有参数设置好后,点击开始构建按钮,等待他构建完成
正常情况下会全流程走完,如下:
可以悬停在对应位置并点击logs查看当前流程的日志
或者可以点击console output查看全流程日志
验证:
部署成功会有消息提醒
这个时候看portainer中的服务列表,可以看到服务正在运行,而且版本已经从1.0.4升级到1.0.5了
访问当前服务的验证接口,查看是否能正常访问
异常情况会在某个阶段爆红,这时候就需要查看日志定位具体报错位置具体解决了
笔记:
添加定时任务脚本:/mydata/hostmachine_jenkins/images_clean.sh(208位置),定时每天10/12/14三个时间段清除虚悬镜像以及当前项目之前版本未使用的镜像
添加版本自增脚本:/mydata/hostmachine_jenkins/version_up1.sh(208位置),当点击部署的时候,自动增加当前项目版本号,并且对部署的服务进行版本号赋值。