1 、Jenkins流水線任務(wù)介紹
之前采用Jenkins的自由風(fēng)格構(gòu)建的項目,每個步驟流程都要通過不同的方式設(shè)置,并且構(gòu)建過程中整體流程是不可見的,無法確認(rèn)每個流程花費的時間,并且問題不方便定位問題。
Jenkins的Pipeline可以讓項目的發(fā)布整體流程可視化,明確執(zhí)行的階段,可以快速的定位問題。并且整個項目的生命周期可以通過一個Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在項目中維護(hù)。
所以Pipeline相對自由風(fēng)格或者其他的項目風(fēng)格更容易操作。
2、 Jenkins流水線任務(wù)
2.1、 構(gòu)建Jenkins流水線任務(wù)
-
構(gòu)建任務(wù)
構(gòu)建Jenkins流水線任務(wù) -
生成Groovy腳本
Hello World腳本生成 -
構(gòu)建后查看視圖
構(gòu)建后查看視圖
2.2、 Groovy腳本
-
Groovy腳本基礎(chǔ)語法
// 所有腳本命令包含在pipeline{}中 pipeline { // 指定任務(wù)在哪個節(jié)點執(zhí)行(Jenkins支持分布式) agent any // 配置全局環(huán)境,指定變量名=變量值信息 environment{ host = '192.168.117.112' } // 存放所有任務(wù)的合集 stages { // 單個任務(wù) stage('任務(wù)1') { // 實現(xiàn)任務(wù)的具體流程 steps { echo 'do something' } } // 單個任務(wù) stage('任務(wù)2') { // 實現(xiàn)任務(wù)的具體流程 steps { echo 'do something' } } // …… } } -
編寫例子測試
pipeline { agent any // 存放所有任務(wù)的合集 stages { stage('拉取Git代碼') { steps { echo '拉取Git代碼' } } stage('檢測代碼質(zhì)量') { steps { echo '檢測代碼質(zhì)量' } } stage('構(gòu)建代碼') { steps { echo '構(gòu)建代碼' } } stage('制作自定義鏡像并發(fā)布Harbor') { steps { echo '制作自定義鏡像并發(fā)布Harbor' } } stage('基于Harbor部署工程') { steps { echo '基于Harbor部署工程' } } } }配置Grovvy腳本 -
查看效果
查看效果
Ps:涉及到特定腳本,Jenkins給予了充足的提示,可以自動生成命令
| 生成命令位置 |
|---|
![]() |
2.3、 Jenkinsfile實現(xiàn)
Jenkinsfile方式需要將腳本內(nèi)容編寫到項目中的Jenkinsfile文件中,每次構(gòu)建會自動拉取項目并且獲取項目中Jenkinsfile文件對項目進(jìn)行構(gòu)建
-
配置pipeline
配置pipeline -
準(zhǔn)備Jenkinsfile
準(zhǔn)備Jenkinsfile文件 -
測試效果
測試效果
3、 Jenkins流水線任務(wù)實現(xiàn)
3.1、 參數(shù)化構(gòu)建
添加參數(shù)化構(gòu)建,方便選擇不的項目版本
| Git參數(shù)化構(gòu)建 |
|---|
![]() |
3.2、 拉取Git代碼
通過流水線語法生成Checkout代碼的腳本
| 語法生成 |
|---|
![]() |
![]() |
將*/master更改為標(biāo)簽${tag}
pipeline {
agent any
stages {
stage('拉取Git代碼') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
}
}
}
}
3.3、 構(gòu)建代碼
通過腳本執(zhí)行mvn的構(gòu)建命令
pipeline {
agent any
stages {
stage('拉取Git代碼') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
}
}
stage('構(gòu)建代碼') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
}
}
3.4、 代碼質(zhì)量檢測
通過腳本執(zhí)行sonar-scanner命令即可
pipeline {
agent any
stages {
stage('拉取Git代碼') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
}
}
stage('構(gòu)建代碼') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
stage('檢測代碼質(zhì)量') {
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'
}
}
}
}
3.5、 制作自定義鏡像并發(fā)布
- 生成自定義鏡像腳本
pipeline {
agent any
environment{
harborHost = '192.168.117.112:80'
harborRepo = 'repo'
harborUser = 'admin'
harborPasswd = 'Harbor12345'
}
// 存放所有任務(wù)的合集
stages {
stage('拉取Git代碼') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
}
}
stage('構(gòu)建代碼') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
stage('檢測代碼質(zhì)量') {
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('制作自定義鏡像并發(fā)布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.117.112:80'
harborRepo = 'repo'
harborUser = 'admin'
harborPasswd = 'Harbor12345'
}
stages {
stage('拉取Git代碼') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
}
}
stage('構(gòu)建代碼') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
stage('檢測代碼質(zhì)量') {
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=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f'
}
}
stage('制作自定義鏡像并發(fā)布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('目標(biāo)服務(wù)器拉取鏡像并運行') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
4、 Jenkins流水線整合釘釘
在程序部署成功后,可以通過釘釘?shù)臋C器人及時向群眾發(fā)送部署的最終結(jié)果通知
-
安裝插件
安裝插件 -
釘釘內(nèi)部創(chuàng)建群組并構(gòu)建機器人
釘釘內(nèi)部創(chuàng)建群組并構(gòu)建機器人 最終或獲取到Webhook信息
https://oapi.dingtalk.com/robot/send?access_token=bf92a9c16c58bf6244cedebca6175eb38b6aa47e833f0de830993d995ce080cb
-
系統(tǒng)配置添加釘釘通知
配置釘釘通知
- 任務(wù)中追加流水線配置
pipeline {
agent any
environment{
harborHost = '192.168.117.112:80'
harborRepo = 'repo'
harborUser = 'admin'
harborPasswd = 'Harbor12345'
}
stages {
stage('拉取Git代碼') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.117.111:8929/root/devopsdemo.git']]])
}
}
stage('構(gòu)建代碼') {
steps {
sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
}
}
stage('檢測代碼質(zhì)量') {
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=dc4cbe2bca153ad1baf5adba7e02ddd2288ef53f'
}
}
stage('制作自定義鏡像并發(fā)布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('目標(biāo)服務(wù)器拉取鏡像并運行') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborHost $harborRepo $JOB_NAME $tag $container_port $host_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: ["- 成功構(gòu)建:${JOB_NAME}項目!\n- 版本:${tag}\n- 持續(xù)時間:${currentBuild.durationString}\n- 任務(wù):#${JOB_NAME}"]
)
}
failure {
dingtalk (
robot: 'Jenkins-DingDing',
type:'MARKDOWN',
title: "fail: ${JOB_NAME}",
text: ["- 失敗構(gòu)建:${JOB_NAME}項目!\n- 版本:${tag}\n- 持續(xù)時間:${currentBuild.durationString}\n- 任務(wù):#${JOB_NAME}"]
)
}
}
}
-
查看效果
釘釘通知效果
5、 Jenkins流水線從GitLab拉取腳本
5.1、流水線使用SCM

5.2、創(chuàng)建Jenkinsfile

5.3、編寫腳本

效果


















