Loading... # 一、简要描述 **这里要实现自动化的一个CI操作,也就是开发人员Push代码到Git仓库后**,**Jenkins会自动的构建项目,将最新的提交点代码构建并进行打包部署,这里区别去上述的CD操作,CD操作需要基于某个版本进行部署,而这里每次都是将最新的提交点集成到主干上并测试。** # 二、自动化CI ## 1、安装Gitlab插件 ### 1.1、系统管理->插件管理  ### 1.2、搜索安装Gitlab插件  ## 2、配置Gitlab系统配置 ### 2.1、系统管理->系统配置  ### 2.2、配置Gitlab相关信息  ## 3、Jenkins管理后台创建一个任务和配置项目信息 ### 3.1、创建一个Jenkins部署任务  ### 3.2、配置构建触发器  ### 3.3、配置任务流水线信息   ## 4、配置Gitlab相关信息 ### 4.1、允许本地网络访问web hooks  ### 4.2、配置项目工程web hooks信息   ### 4.3、Gitlab推送一条事件,测试构建   ### 4.4、在Jenkins任务详情查看构建  ## 5、修改Springboot工程中的Jenkinsfile文件和k8s yml部署文件 ### 5.1、修改Jenkinsfile文件 ``` // 所有的脚本命令都放在pipeline中 pipeline { // 指定任务再哪个集群节点中执行 agent any // 声明全局变量,方便后面使用 environment { // harbor用户名 harborUserName = 'DevOps' // harbor密码 harborPassword = 'Dev12345' // harbor地址 harborAddress = '192.168.95.131:9020' // harbor项目名 harborRepo = 'repos' } stages { stage ('拉取git仓库代码') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'b62b7b20-3b03-46e7-8f8b-09ab5efe0f12', url: 'http://192.168.95.130:8929/root/jenkins-publish-demo.git']]]) } } stage ('通过maven构建项目') { steps { sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests' } } stage ('通过Sonarqube做质量检测') { steps { sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.source=./ -Dsonar.java.binaries=./target/ -Dsonar.login=c8483abbf03c0fd4212ffce2c1e93c5ae8cd65bd' } } stage ('通过Docker制作自定义镜像') { steps { sh '''cp -rf target/*.jar docker/ docker build -t ${JOB_NAME}:latest docker/''' } } stage ('将自定义镜像推送到Harbor') { steps { sh '''docker login -u ${harborUserName} -p ${harborPassword} ${harborAddress} docker tag ${JOB_NAME}:latest ${harborAddress}/${harborRepo}/${JOB_NAME}:latest docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest''' } } stage ('将yml文件传到k8s-master上') { steps { sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.95.101-k8s-master', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'jenkins-publish-demo.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) } } stage ('远程执行k8s-master的kubectl命令') { steps { sh '''ssh root@192.168.95.101 kubectl apply -f /usr/local/deploy/k8s/jenkins-publish-demo.yml ssh root@192.168.95.101 kubectl rollout restart deployment jenkins-publish-demo-deployment -n test''' } } } post { // 构建成功通知 success { dingtalk ( robot: 'Dingding-robot', type: 'MARKDOWN', title: "success: ${JOB_NAME}", text: ["- 构建成功: ${JOB_NAME}项目!\n- 版本: latest\n" + "- 持续时间: ${currentBuild.durationString}\n- 任务:#${JOB_NAME}"] ) } // 构建失败通知 failure { dingtalk ( robot: 'Dingding-robot', type: 'MARKDOWN', title: "fail: ${JOB_NAME}", text: ["- 构建失败: ${JOB_NAME}项目!\n- 版本: latest\n" + "- 持续时间: ${currentBuild.durationString}\n- 任务:#${JOB_NAME}"] ) } } } ``` #### 5.1.1、修改替换\$ {tag}变量的地方 * Git仓库代码 ${tag}$tag 替换为 */master * 涉及镜像版本的地方 ${tag}$tag替换为 latest    #### 5.1.2、修改 '远程执行k8s-master的kubectl命令' 流水线部分 **ssh root@192.168.95.101 kubectl rollout restart deployment jenkins-publish-demo-deployment -n test** **增加每次滚动、重启k8s中的deployment服务,因为Springboot工程yml部署文件没有变化,k8s默认是不会重新滚动重启部署k8s中的deployment服务,会导致Jenkins的镜像打包成功了,服务没有重新部署,部署不会生效的问题。** **因为yml配置文件没有改变时,每次不会重新加载,这样会导致Pod中的容器不会动态更新,这里需要使用kubectl的rollout restart命令滚动更新**  ### 5.2、修改k8s yml部署文件,拉取镜像版本为latest  ## 6、提交修改的文件到Gitlab仓库  ## 7、提交之后,自动触发Jenkins构建部署任务 ### 7.1、查看任务构建日志   ### 7.2、查看kuboard管理后台,运行的服务  ## 8、整体测试自动化CI ### 8.1、修改Springboot 工程的测试代码,并且提交到Gitlab仓库  ### 8.2、提交成功之后,Jenkins后台查看构建任务  ### 8.3、在kuboard查看构建的部署的pod服务  ### 8.4、在浏览器中访问部署的服务 **ip加端口的方式访问服务:****http://192.168.95.101:30778/sayHello** **域名加端口的方式访问:****http://nginx.flygo.tech:30778/sayHello**   最后修改:2025 年 06 月 25 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏