云原生DevOps:Jenkins流水线
Posted 是Dream呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生DevOps:Jenkins流水线相关的知识,希望对你有一定的参考价值。
@TOC
之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。
Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。
所以Pipeline相对自由风格或者其他的项目风格更容易操作。
二、 Jenkins流水线任务
1. 构建Jenkins流水线任务
-
构建任务
构建Jenkins流水线任务
-
生成Groovy脚本
Hello World脚本生成 -
构建后查看视图
构建后查看视图
2. Groovy脚本
-
Groovy脚本基础语法
// 所有脚本命令包含在pipeline中 pipeline // 指定任务在哪个节点执行(Jenkins支持分布式) agent any // 配置全局环境,指定变量名=变量值信息 environment host = 192.168.11.11 // 存放所有任务的合集 stages // 单个任务 stage(任务1) // 实现任务的具体流程 steps echo do something // 单个任务 stage(任务2) // 实现任务的具体流程 steps echo do something // ……
-
编写例子测试
pipeline agent any // 存放所有任务的合集 stages stage(拉取Git代码) steps echo 拉取Git代码 stage(检测代码质量) steps echo 检测代码质量 stage(构建代码) steps echo 构建代码 stage(制作自定义镜像并发布Harbor) steps echo 制作自定义镜像并发布Harbor stage(基于Harbor部署工程) steps echo 基于Harbor部署工程
配置Grovvy脚本 -
查看效果
查看效果
[Ps:涉及到特定脚本,Jenkins给予了充足的提示,可以自动生成命令]()
生成命令位置 |
---|
3.Jenkinsfile实现
Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取项目并且获取项目中Jenkinsfile文件对项目进行构建
-
配置pipeline
配置pipeline -
准备Jenkinsfile
准备Jenkinsfile文件 -
测试效果
测试效果
三、Jenkins流水线任务实现
1. 参数化构建
添加参数化构建,方便选择不的项目版本
Git参数化构建 |
---|
2. 拉取Git代码
通过流水线语法生成Checkout代码的脚本
语法生成 |
---|
pipeline
agent any
stages
stage(拉取Git代码)
steps
checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
3. 构建代码
通过脚本执行mvn的构建命令
pipeline
agent any
stages
stage(拉取Git代码)
steps
checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
stage(构建代码)
steps
sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests
4. 代码质量检测
通过脚本执行sonar-scanner命令即可
pipeline
agent any
stages
stage(拉取Git代码)
steps
checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]])
stage(构建代码)
steps
sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests
stage(检测代码质量)
steps
sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa
5. 制作自定义镜像并发布
-
生成自定义镜像脚本
pipeline agent any environment harborHost = 192.168.11.11:80 harborRepo = repository harborUser = DevOps harborPasswd = P@ssw0rd // 存放所有任务的合集 stages stage(拉取Git代码) steps checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]]) stage(构建代码) steps sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests stage(检测代码质量) steps sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa stage(制作自定义镜像并发布Harbor) steps sh cp ./target/*.jar ./docker/ cd ./docker docker build -t $JOB_NAME:$tag ./ sh docker login -u $harborUser -p $harborPasswd $harborHost docker tag $JOB_NAME:$tag $harborHost/$harborRepo/$JOB_NAME:$tag docker push $harborHost/$harborRepo/$JOB_NAME:$tag
-
生成Publish Over SSH脚本
pipeline agent any environment harborHost = 192.168.11.11:80 harborRepo = repository harborUser = DevOps harborPasswd = P@ssw0rd // 存放所有任务的合集 stages stage(拉取Git代码) steps checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/test.git]]]) stage(构建代码) steps sh /var/jenkins_home/maven/bin/mvn clean package -DskipTests docker stage(检测代码质量) steps sh /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=7d66af4b39cfe4f52ac0a915d4c9d5c513207098 stage(制作自定义镜像并发布Harbor) steps sh cp ./target/*.jar ./docker/ cd ./docker docker build -t $JOB_NAME:$tag ./ sh docker login -u $harborUser -p $harborPasswd $harborHost docker tag $JOB_NAME:$tag $harborHost/$harborRepo/$JOB_NAME:$tag docker push $harborHost/$harborRepo/$JOB_NAME:$tag stage(目标服务器拉取镜像并运行) steps sshPublisher(publishers: [sshPublisherDesc(configName: testEnvironment, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port ", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ]+, remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: )], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
四、 Jenkins流水线整合钉钉
在程序部署成功后,可以通过钉钉的机器人及时向群众发送部署的最终结果通知
-
安装插件
安装插件 最终或获取到Webhook信息
https://oapi.dingtalk.com/robot/send?access_token=kej4ehkj34gjhg34jh5bh5jb34hj53b4
-
系统配置添加钉钉通知
配置钉钉通知 -
任务中追加流水线配置
pipeline agent any environment sonarLogin = 2bab7bf7d5af25e2c2ca2f178af2c3c55c64d5d8 harborUser = admin harborPassword = Harbor12345 harborHost = 192.168.11.12:8888 harborRepo = repository stages stage(拉取Git代码) steps checkout([$class: GitSCM, branches: [[name: $tag]], extensions: [], userRemoteConfigs: [[url: http://49.233.115.171:8929/root/lsx.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.sources=./ -Dsonar.projectname=$JOB_NAME -Dsonar.projectKey=$JOB_NAME -Dsonar.java.binaries=target/ -Dsonar.login=$sonarLogin stage(制作自定义镜像) steps sh cd docker mv ../target/*.jar ./ docker build -t $JOB_NAME:$tag . stage(推送自定义镜像) steps sh docker login -u $harborUser -p $harborPassword $harborHost docker tag $JOB_NAME:$tag $harborHost/$harborRepo/$JOB_NAME:$tag docker push $harborHost/$harborRepo/$JOB_NAME:$tag stage(通知目标服务器) steps sshPublisher(publishers: [sshPublisherDesc(configName: centos-docker, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ]+, remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: )], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) post success dingtalk ( robot: Jenkins-DingDing, type:MARKDOWN, title: "success: $JOB_NAME", text: ["- 成功构建:$JOB_NAME项目!\\n- 版本:$tag\\n- 持续时间:$currentBuild.durationString\\n- 任务:#$JOB_NAME"] ) failure dingtalk ( robot: Jenkins-DingDing, type:MARKDOWN, title: "fail: $JOB_NAME", text: ["- 失败构建:$JOB_NAME项目!\\n- 版本:$tag\\n- 持续时间:$currentBuild.durationString\\n- 任务:#$JOB_NAME"] )
-
查看效果
钉钉通知效果
以上是关于云原生DevOps:Jenkins流水线的主要内容,如果未能解决你的问题,请参考以下文章
[云原生专题-62]:Kubesphere云治理-DevOps-持续集成与pipeline自动上云工具Jenkins
视野数科借助 SAE + Jenkins 打造云原生 DevOps,运维效率提升 60%