簡介
Jenkin的多分支流水線,允許Jenkinsfile與需要 Jenkins 構建的應用程序代碼放在一起,然後 Jenkins 從源代碼管理系統中檢出 Jenkinsfile 文件作爲流水線項目構建過程的一部分並接着執行你的流水線。
Jenkins這種構建方式正是“誰構建,誰運行”DevOps理念的一種體現。
由於流水線代碼(特別是腳本式流水線)是使用類似 Groovy 的語法編寫的,因此我們要想學習需要了解Groovy的語法。
目錄結構
共享庫的目錄結構如下:
(root)
+- src # Groovy source files
| +- org
| +- foo
| +- Bar.groovy # for org.foo.Bar class
+- vars
| +- foo.groovy # for global 'foo' variable
| +- foo.txt # help for 'foo' variable
+- resources # resource files (external libraries only)
| +- org
| +- foo
| +- bar.json # static helper data for org.foo.Bar
- src 目錄應該看起來像標準的 Java 源目錄結構。當執行流水線時,該目錄被添加到類路徑下。
- vars 目錄定義可從流水線訪問的全局變量的腳本。 每個 *.groovy 文件的基名應該是一個 Groovy (~ Java) 標識符, 通常是 camelCased。 匹配 *.txt, 如果存在, 可以包含文檔, 通過系統的配置標記格式化從處理 (所以可能是 HTML, Markdown 等,雖然 txt 擴展是必需的)。
- resources 目錄允許從外部庫中使用 libraryResource 步驟來加載有關的非 Groovy 文件。 目前,內部庫不支持該特性。
注意:初次使用src、resources目錄可以爲空,我們可以在vars中定義腳本,使用call方法實現功能。
全局共享庫
Manage Jenkins » Configure System » Global Pipeline Libraries 可以配置許多全局共享庫。
系統中的任何流水線都可以使用這些庫中實現的功能。
使用類庫
標記爲 Load implicitly 的共享庫允許流水線立即使用任何此庫定義的類或全局變量。爲了訪問其他共享庫, Jenkinsfile 需要使用 @Library 註解。
在此我們將共享庫託管在git上,在jenkins中設置如下:
- 使用“shared-library”命名
- 默認使用master分支調用
Jenkinsfile 需要使用 @Library 註解, 指定庫的名字:
#調用共享庫的默認master分支
@Library('my-shared-library') _
#使用test分直的共享庫,也可使用tag等區分
@Library('my-shared-library@test') _
部署使用
1.定義pipeline共享庫
└── pipeline-shared-library
├── README.en.md
├── README.md
├── resources
├── src
└── vars
└── helloworld.groovy
由於初步使用,resources和src我們都只保留項目結構,但設置爲空;只在vars中設置腳本即可,並定義call方法,通過允許訪問全局變量實現相關功能。
#遵循groovy語法
cat vars/helloworld.groovy
def call(String s = "groovy") {
echo "Hello, $s."
}
2.流水線調用
在項目中定義Jenkinsfile文件,通過聲明式流水線調用共享庫。
其中需要使用“@Library(‘shared-library’) _”來引入共享庫。
#cat Jenkinsfile
@Library('shared-library') _
pipeline {
options {
ansiColor('xterm')
timestamps()
}
agent {
label 'docker-slave-java'
}
stages {
stage('test測試') {
when {}
steps {
script {
println "import shared-library"
result = helloworld 'test'
println result
}
}
}
post {
unstable {
emailext (
body: """項目名稱:${JOB_NAME}\n構建編號:${BUILD_NUMBER}\n構建日誌:${BUILD_URL}console""",
subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Unstable!',
to: '[email protected]',
from: '[email protected]'
)
}
success {
emailext (
body: """項目名稱:${JOB_NAME}\n構建編號:${BUILD_NUMBER}\n構建日誌:${BUILD_URL}console""",
subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Successful!',
to: '[email protected]',
from: '[email protected]'
)
}
failure {
emailext (
body: """項目名稱:${JOB_NAME}\n構建編號:${BUILD_NUMBER}\n構建日誌:${BUILD_URL}console""",
subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Failure!',
to: '[email protected]',
from: '[email protected]'
)
}
}
}
應用項目在jenkins上使用多分支流水線,通過when當test分支更新時,“測試環境部署”步驟才執行,最後將構建結果以郵件的形式通知。
注意:聲明式流水線不允許在script
指令之外使用全局變量。
3.執行過程
通過多分支流水線,可以將項目的多個分支在同一個jenkins任務中管理,避免了一個分支對應一個任務。如下圖所示:docker-test-java3項目,分master/test/develop分支分別管理。
如下圖所示,在流水線中“測試環境部署”中的操作已經調用共享庫方法,打印出對應消息。
注意:在流水線構建任務中,BlueOcean 可以引導用戶通過直觀的、可視化的過程來創建Pipeline,從而使Pipeline的創建更加簡單。而且Blue Ocean 與普通界面相比,屏蔽了部分輸出,只展示 Pipeline中需要關注的地方, 簡化異常處理。
總結
Jenkins擴展共享庫是真正意義上的流水線即代碼,通過共享庫可以實現多個項目之間共享流水線,有助於減少冗餘並保持代碼乾淨整潔。
在CI/CD過程中,引入擴展共享庫使管理過程更加靈活,重新定義了運維和開發之前的協作方式。但是groovy對於運維人員上手操作需要一定時間,而對於java開發人員卻是天作之合。也正是這個原因,我也是對擴展共享庫做了簡單的介紹,更高級的使用需深入研究。