當(dāng)有大量的pipeline項(xiàng)目構(gòu)建任務(wù),有很多代碼是重復(fù)的,這時(shí)需要提取和復(fù)用共同的邏輯无切。
其實(shí)pipeline本質(zhì)就是一個(gè)Groovy腳本,所以可以在pipeline中自定義函數(shù)丐枉,并使用Groovy語(yǔ)言自帶的特性哆键。
比如下面的Jenkinsfile,我們自定義了一個(gè) createVersion 函數(shù)瘦锹,并使用了內(nèi)置的Date類籍嘹。
pipeline {
agent any
stages {
stage ('build') {
steps {
// 輸出 201907-4
echo "${createVersion(BUILD_NUMBER)}"
}
}
}
}
def createVersion(String BUILD_NUMBER) {
return new Date().format('yyyyMM') + "-${BUILD_NUMBER}"
}
還有一種更優(yōu)雅的寫法,將變量定義在environment內(nèi)
pipeline {
agent any
environment {
_version = createVersion()
}
stages {
stage ('build') {
steps {
echo "${_version}"
}
}
}
}
def createVersion() {
return new Date().format('yyyyMM') + "-${env.BUILD_NUMBER}"
}
使用共享庫(kù)
大致流程:
- 新建個(gè)Groovy倉(cāng)庫(kù)弯院,里面包含共享庫(kù)代碼
這里已經(jīng)建好 jenkins-shared-library辱士,文件結(jié)構(gòu)如下:
vars 目錄下的全局變量可以直接在pipeline中使用,即當(dāng)寫sayHello('world')
听绳,實(shí)際調(diào)用的是sayHello.groovy
中的call函數(shù)
src 目錄是標(biāo)準(zhǔn)的Java源碼結(jié)構(gòu)颂碘,目錄中的類被稱為類庫(kù)(Library class),而 @Library('global-shared-library@master')
就是一次性靜態(tài)加載src目錄下所有代碼到classpath中椅挣。
src目錄中的類头岔,可以使用Groovy中的@Grab注解,自動(dòng)下載第三方依賴包
- Jenkins 管理后臺(tái)配置倉(cāng)庫(kù)地址和版本等
進(jìn)入 Jenkins 的Manage Jenkins -> Configure System -> Global Pipeline Libraries 配置頁(yè)面
- Jenkins 項(xiàng)目的pipeline中引入共享庫(kù)(可以指定倉(cāng)庫(kù)版本和具體class)
新建一pipeline類型的job鼠证。
Pipeline內(nèi)容如下:
@Library('global-shared-library@master') _
pipeline {
agent any
environment {
_version = createVersion()
}
stages {
stage ('build') {
steps {
script {
def util = new com.mafeifan.Utils()
def version = util.createVersion("${BUILD_NUMBER}")
echo "${version}"
sayHello 'yes'
echo "${_version}"
}
}
}
}
}
def createVersion() {
return new Date().format('yyyyMM') + "-${env.BUILD_NUMBER}"
}
查看構(gòu)建日志峡竣,發(fā)現(xiàn)Jenkins首先拉取共享庫(kù)代碼,執(zhí)行成功量九。
使用共享庫(kù)實(shí)現(xiàn)Pipeline模板
// vars/generatePipeline.groovy
def call(String lang) {
if (lang == 'go') {
pipeline {
agent any
stages {
stage ('set go path') {
steps {
echo "GO path is ready"
}
}
}
}
} else if (lang == 'java') {
pipeline {
agent any
stages {
stage ('clean install') {
steps {
sh "mvn clean install"
}
}
}
}
}
// 其他語(yǔ)言
}
使用時(shí)适掰,Jenkinsfile 只有兩行
@Library['global-shared-library'] _
generatePipeline('go')
如果大多數(shù)項(xiàng)目都是標(biāo)準(zhǔn)化的,可以利用共享庫(kù)的pipeline模塊技術(shù)來(lái)降低維護(hù)成本荠列。
這里只是拋磚引玉类浪,想寫出更強(qiáng)大的共享庫(kù)需要多了解Groovy。
優(yōu)先考慮使用自定義函數(shù)弯予,如果此函數(shù)出現(xiàn)在了至少三個(gè)項(xiàng)目中戚宦,考慮移到共享庫(kù)里,當(dāng)發(fā)現(xiàn)項(xiàng)目的pipeline非常相似锈嫩,考慮使用pipeline模塊受楼。