前言:該系列文章,圍繞持續集成:Jenkins+Docker+K8S相關組件,實現自動化管理源碼編譯、打包、鏡像構建、部署等操作;本篇文章主要描述Pipeline流水線用法。
一、Webhook原理
Pipeline流水線任務通常情況下都是自動觸發的,在Git倉庫中配置源碼改動后通知的地址即可。
例如在Gitee倉庫中,基於WebHook的配置,可以在向倉庫push代碼后,自動回調預先設定的請求地址,從而觸發代碼更新后的打包動作,基本流程如下:
這里涉及到兩個核心配置:
- Gitee回調:即倉庫接收到push請求后的通知地址;在倉庫管理的
WebHooks
選項中; - Jenkins流程:編寫流水線任務,處理代碼提交后的自動化流程;這里需要Jenkins地址可以在外網訪問,網上的組件很多,自行選擇搭建即可;
注意:可以先隨意設置回調地址,在請求日志中直接拷貝請求參數,在postman中去觸發Jenkins任務,這樣在測試時會方便很多。
這里結合Gitee的幫助文檔,去分析不同push動作的參數標識,可以判斷分支的創建、推送、刪除等操作,例如:
"after": "1c50471k92owjuh37dsadfs76ae06b79b6b66c57",
"before": "0000000000000000000000000000000000000000",
創建分支:before字符都是0;刪除分支:after字符都是0;
二、流水線配置
1、插件安裝
在Jenkins插件管理中,安裝Generic-Webhook-Trigger
插件,流水線pipeline
相關組件在Jenkins初始化的時候已經安裝了。
2、創建流水線
新建Item,輸入任務名稱,選擇pipeline
選項即可:
選擇Webhook選項,頁面提示了觸發的方式。
3、觸發流水線
http://用戶名:密碼@JENKINS_URL/generic-webhook-trigger/invoke
基於如上方式通過認證,觸發流水線執行,會生成任務日志,即流程是通順的。
三、Pipeline語法
1、結構語法
- triggers:基於hook模式觸發流水線任務;
- environment:聲明全局通用的環境變量;
- stages:定義任務步驟,即流程分段處理;
- post.always:最終執行的動作;
常規流程中的整體結構如下:
pipeline {
agent any
triggers {}
environment {}
stages {}
post { always {}}
}
把各個節點下的腳本配置進去,就會生成一個自動化的流水線任務。注意這里不勾選使用Groovy沙盒
選項。
2、參數解析
這里說的參數解析是指,Gitee通過hook機制請求Jenkins服務攜帶的參數,這里主要解析post參數即可,解析方式看說明:
這里從hook回調的參數中選了幾個流程中使用的參數,下面看具體解析方式,在上圖中點擊新增:
{
"ref":"refs/heads/master",
"repository":{
"name":"butte-auto-parent",
"git_http_url":"倉庫地址-URL"
},
"head_commit":{
"committer":{
"user_name":"提交人名稱",
}
},
"before":"277bf91ba85996da6c",
"after":"178d56ae06b79b6b66c"
}
把上述參數依次做好配置即可,這樣在工作流中就可以使用這些參數。
3、觸發器節點
這里即triggers
模塊配置,核心作用是加載觸發流程的一些參數,后續在腳本中使用,其他相關配置按需選擇即可,注意這里的參數需要在上個步驟中配置:
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,
// 打印請求參數
// printPostContent: true
)
}
4、環境變量
聲明一些全局的環境變量,也可以直接定義,在流程中用${變量}
的方式引用:
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
}
這里根據hook請求參數,解析出分支的操作類型:是否創建、是否刪除、是否主干分支,以及定義一個is_success
流程是否成功的標識。
5、分段流程
這里主要分為五個步驟:解析數據、拉取分支、處理Pom文件、分支推送、項目打包;
stages {
// 解析倉庫信息
stage('Parse') {
steps {
echo "倉庫分支 : ${branch} \n倉庫名稱 : ${repository_name} \n倉庫地址 : ${repository_git_url} \n提交用戶 : ${committer_name}"
script {
if ("true".equals(is_master_branch)) {
echo "保護分支 : ${branch}"
}
if ("true".equals(is_create_branch)) {
echo "創建分支 : ${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文件內容
def pom = readMavenPom file: 'pom.xml'
def version = "${pom.version}"
def encode = pom.getProperties().get("project.build.sourceEncoding")
echo "Pom版本 : "+ version
echo "Pom編碼 : "+ encode
def devVersion = "${branch}-"+version
def jarName = "${branch}-"+version+".jar"
echo "Now版本 : "+ devVersion
echo "Jar名稱 : "+ jarName
// 修改Pom文件內容
// pom.getProperties().put("dev.version","${devVersion}".trim().toString())
// writeMavenPom file: 'pom.xml', model: pom
echo "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
}
}
}
}
- 解析數據:解析並輸出部分參數信息;
- 拉取分支:結合Git命令,拉取分支代碼;
- 處理Pom文件:對pom文件的讀取和修改;
- 分支推送:結合Git命令,推送分支代碼;
- 項目打包:結合Mvn命令,完成項目打包;
注意:這里在本地測試流程時,並沒有推送代碼;在項目打包完成后,結合shell腳本完成服務的啟動發布。
6、消息通知
在流程的最后,識別任務的執行標識is_success
,通知相關人員是否打包成功,這里的通知方式可以選擇郵件或者其他API推送的通知類型,不過多描述:
post {
always {
script {
echo "notify : ${committer_name} , pipeline is success : ${is_success}"
}
}
}
7、執行日志
完成上面pipeline
流水線腳本開發后,通過postman工具不斷發送請求,完成腳本調試:
這里也可以點擊流程里的不同模塊,查看該模塊下的日志信息:
說明:完整的pipeline
腳本內容放在末尾的Gitee開源倉庫中,有需要的自行獲取。
同系列推薦:
四、源代碼地址
GitEE·地址
https://gitee.com/cicadasmile/butte-auto-parent
Wiki·地址
https://gitee.com/cicadasmile/butte-java-note