自动化集成:Pipeline流水语法详解
前言:該系列文章,圍繞持續(xù)集成:Jenkins+Docker+K8S相關(guān)組件,實(shí)現(xiàn)自動(dòng)化管理源碼編譯、打包、鏡像構(gòu)建、部署等操作;本篇文章主要描述Pipeline流水線用法。
一、Webhook原理
Pipeline流水線任務(wù)通常情況下都是自動(dòng)觸發(fā)的,在Git倉庫中配置源碼改動(dòng)后通知的地址即可。
例如在Gitee倉庫中,基于WebHook的配置,可以在向倉庫push代碼后,自動(dòng)回調(diào)預(yù)先設(shè)定的請(qǐng)求地址,從而觸發(fā)代碼更新后的打包動(dòng)作,基本流程如下:
這里涉及到兩個(gè)核心配置:
- Gitee回調(diào):即倉庫接收到push請(qǐng)求后的通知地址;在倉庫管理的WebHooks選項(xiàng)中;
- Jenkins流程:編寫流水線任務(wù),處理代碼提交后的自動(dòng)化流程;這里需要Jenkins地址可以在外網(wǎng)訪問,網(wǎng)上的組件很多,自行選擇搭建即可;
注意:可以先隨意設(shè)置回調(diào)地址,在請(qǐng)求日志中直接拷貝請(qǐng)求參數(shù),在postman中去觸發(fā)Jenkins任務(wù),這樣在測試時(shí)會(huì)方便很多。
這里結(jié)合Gitee的幫助文檔,去分析不同push動(dòng)作的參數(shù)標(biāo)識(shí),可以判斷分支的創(chuàng)建、推送、刪除等操作,例如:
"after": "1c50471k92owjuh37dsadfs76ae06b79b6b66c57", "before": "0000000000000000000000000000000000000000",創(chuàng)建分支:before字符都是0;刪除分支:after字符都是0;
二、流水線配置
1、插件安裝
在Jenkins插件管理中,安裝Generic-Webhook-Trigger插件,流水線pipeline相關(guān)組件在Jenkins初始化的時(shí)候已經(jīng)安裝了。
2、創(chuàng)建流水線
新建Item,輸入任務(wù)名稱,選擇pipeline選項(xiàng)即可:
選擇Webhook選項(xiàng),頁面提示了觸發(fā)的方式。
3、觸發(fā)流水線
http://用戶名:密碼@JENKINS_URL/generic-webhook-trigger/invoke基于如上方式通過認(rèn)證,觸發(fā)流水線執(zhí)行,會(huì)生成任務(wù)日志,即流程是通順的。
三、Pipeline語法
1、結(jié)構(gòu)語法
- triggers:基于hook模式觸發(fā)流水線任務(wù);
- environment:聲明全局通用的環(huán)境變量;
- stages:定義任務(wù)步驟,即流程分段處理;
- post.always:最終執(zhí)行的動(dòng)作;
常規(guī)流程中的整體結(jié)構(gòu)如下:
pipeline {agent anytriggers {}environment {}stages {}post { always {}} }把各個(gè)節(jié)點(diǎn)下的腳本配置進(jìn)去,就會(huì)生成一個(gè)自動(dòng)化的流水線任務(wù)。注意這里不勾選使用Groovy沙盒選項(xiàng)。
2、參數(shù)解析
這里說的參數(shù)解析是指,Gitee通過hook機(jī)制請(qǐng)求Jenkins服務(wù)攜帶的參數(shù),這里主要解析post參數(shù)即可,解析方式看說明:
這里從hook回調(diào)的參數(shù)中選了幾個(gè)流程中使用的參數(shù),下面看具體解析方式,在上圖中點(diǎn)擊新增:
{"ref":"refs/heads/master","repository":{"name":"butte-auto-parent","git_http_url":"倉庫地址-URL"},"head_commit":{"committer":{"user_name":"提交人名稱",}},"before":"277bf91ba85996da6c","after":"178d56ae06b79b6b66c" }把上述參數(shù)依次做好配置即可,這樣在工作流中就可以使用這些參數(shù)。
3、觸發(fā)器節(jié)點(diǎn)
這里即triggers模塊配置,核心作用是加載觸發(fā)流程的一些參數(shù),后續(xù)在腳本中使用,其他相關(guān)配置按需選擇即可,注意這里的參數(shù)需要在上個(gè)步驟中配置:
triggers {GenericTrigger(genericVariables: [[key: 'ref', value: '$.ref'],[key: 'repository_name', value: '$.repository.name'],[key: 'repository_git_url', value: '$.repository.git_http_url'],[key: 'committer_name', value: '$.head_commit.committer.user_name'],[key: 'before', value: '$.before'],[key: 'after', value: '$.after']],// causeString: ' Triggered on $ref' ,// printContributedVariables: true,// 打印請(qǐng)求參數(shù)// printPostContent: true) }4、環(huán)境變量
聲明一些全局的環(huán)境變量,也可以直接定義,在流程中用${變量}的方式引用:
environment {branch = env.ref.split("/")[2].trim()is_master_branch = "master".equals(branch)is_create_branch = env.before.replace('0','').trim().equals("")is_delete_branch = env.after.replace('0','').trim().equals("")is_success = false }這里根據(jù)hook請(qǐng)求參數(shù),解析出分支的操作類型:是否創(chuàng)建、是否刪除、是否主干分支,以及定義一個(gè)is_success流程是否成功的標(biāo)識(shí)。
5、分段流程
這里主要分為五個(gè)步驟:解析數(shù)據(jù)、拉取分支、處理Pom文件、分支推送、項(xiàng)目打包;
stages {// 解析倉庫信息stage('Parse') {steps {echo "倉庫分支 : ${branch} \n倉庫名稱 : ${repository_name} \n倉庫地址 : ${repository_git_url} \n提交用戶 : ${committer_name}"script {if ("true".equals(is_master_branch)) {echo "保護(hù)分支 : ${branch}"}if ("true".equals(is_create_branch)) {echo "創(chuàng)建分支 : ${branch}"}if ("true".equals(is_delete_branch)) {echo "刪除分支 : ${branch}"}}}}// 拉取倉庫分支stage('GitPull') {steps {script {if ("false".equals(is_delete_branch)) {echo "拉取分支 : ${branch}"git branch: "${branch}",url: "${repository_git_url}"}}}}// 解析倉庫Pom文件stage('MvnPom') {steps {script {// 解析Pom文件內(nèi)容def pom = readMavenPom file: 'pom.xml'def version = "${pom.version}"def encode = pom.getProperties().get("project.build.sourceEncoding")echo "Pom版本 : "+ versionecho "Pom編碼 : "+ encodedef devVersion = "${branch}-"+versiondef jarName = "${branch}-"+version+".jar"echo "Now版本 : "+ devVersionecho "Jar名稱 : "+ jarName// 修改Pom文件內(nèi)容// pom.getProperties().put("dev.version","${devVersion}".trim().toString())// writeMavenPom file: 'pom.xml', model: pomecho "update pom success"}}}// 推送倉庫分支stage('GitPush') {steps {script {echo "git push success"}}}// 本地打包流程stage('Package') {steps {script {sh 'mvn clean package -Dmaven.test.skip=true'is_success = true}}} }- 解析數(shù)據(jù):解析并輸出部分參數(shù)信息;
- 拉取分支:結(jié)合Git命令,拉取分支代碼;
- 處理Pom文件:對(duì)pom文件的讀取和修改;
- 分支推送:結(jié)合Git命令,推送分支代碼;
- 項(xiàng)目打包:結(jié)合Mvn命令,完成項(xiàng)目打包;
注意:這里在本地測試流程時(shí),并沒有推送代碼;在項(xiàng)目打包完成后,結(jié)合shell腳本完成服務(wù)的啟動(dòng)發(fā)布。
6、消息通知
在流程的最后,識(shí)別任務(wù)的執(zhí)行標(biāo)識(shí)is_success,通知相關(guān)人員是否打包成功,這里的通知方式可以選擇郵件或者其他API推送的通知類型,不過多描述:
post {always {script {echo "notify : ${committer_name} , pipeline is success : ${is_success}"}} }7、執(zhí)行日志
完成上面pipeline流水線腳本開發(fā)后,通過postman工具不斷發(fā)送請(qǐng)求,完成腳本調(diào)試:
這里也可以點(diǎn)擊流程里的不同模塊,查看該模塊下的日志信息:
說明:完整的pipeline腳本內(nèi)容放在末尾的Gitee開源倉庫中,有需要的自行獲取。
同系列推薦:
- Jenkins管理工具詳解
- 分布式服務(wù)部署發(fā)布
- 微服務(wù)灰度發(fā)布原理
- 服務(wù)自動(dòng)化部署和管理
- 微服務(wù)組件二次淺封裝
四、源代碼地址
GitEE·地址 https://gitee.com/cicadasmile/butte-auto-parent Wiki·地址 https://gitee.com/cicadasmile/butte-java-note總結(jié)
以上是生活随笔為你收集整理的自动化集成:Pipeline流水语法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Unix/Linux下文件基本操作[zt
- 下一篇: 快速撑握C#知识点之变量,类型及类型转换
