Multibranch Pipeline Job 應(yīng)該是最常見的了蒿涎。非常適用于一個項目中哀托,不同分支對于不同構(gòu)建任務(wù)。
之前的做法:項目代碼的每個分支有維護單獨的Jenkinsfile劳秋,這樣不但麻煩而且冗余仓手。
我們知道pipeline流水線由若干個stage階段組成,其實stage中支持寫when指令玻淑,即根據(jù)條件執(zhí)行這個stage嗽冒。
when 支持的條件有 branch, environment, express, not, anyOf, allOf
具體使用可參見官方文檔
下面是個使用when
選項優(yōu)化后的Jenkinsfile
,所有分支使用一份Jenkinsfile即可:
有幾點細節(jié)說下:
-
changset
是提交中的變更的文件列表补履,這里項目中即包含后臺PHP代碼也包含前端的 JS 和 CSS文件添坊,只有當提交中包含了JS或CSS文件才觸發(fā)npm run build
,加速構(gòu)建箫锤,因為如果提交了 PHP 文件贬蛙,沒有必要構(gòu)建前端資源
when {
anyOf {
// 是 ant 路徑寫法
changeset "**/*.js"
changeset "**/*.css"
}
}
如果兩次push代碼間隔很短,有可能造成同時出現(xiàn)多個的
npm run build
谚攒,為避免這種情況加上了disableConcurrentBuilds()
通過使用when, 只有往master分支提交代碼才觸發(fā)郵件step阳准,post指令也可以寫在stage中
默認情況下,stage內(nèi)的所有代碼都將在指定的Jenkins agent上執(zhí)行馏臭,when指令提供 beforeAgent選項野蝇,當他的值為true時,只有符合when條件時才會進入該Jenkins agent括儒,這樣就避免的沒有必要的工作空間的分配
// https://jenkins.io/zh/doc/book/pipeline/syntax
pipeline {
agent {
// 在Docker容器里跑Job绕沈,跑完Jenkins會自動刪除容器
docker {
image 'node:8.15.0-alpine'
}
}
// 避免 npm install 報權(quán)限問題
environment {
HOME = '.'
_EMAIL_TO='mafeifan@qq.com'
}
options {
// 不允許同時執(zhí)行流水線, 防止同時訪問共享資源等
disableConcurrentBuilds()
// 顯示具體的構(gòu)建流程時間戳
timestamps()
}
stages {
// 只有修改 JS 或 CSS 資源文件才觸發(fā) Build 步驟
stage('Build') {
when {
anyOf {
changeset "**/*.js"
changeset "**/*.css"
}
}
steps {
sh 'npm install'
sh 'npm run build'
}
}
// 只有觸發(fā) Master 分支才發(fā)郵件
stage('Master') {
when {
beforeAgent true
branch 'master'
}
steps {
echo 'master branch'
}
post {
always {
configFileProvider([configFile(fileId: 'email-groovy-template-cn', targetLocation: 'email.html', variable: 'content')]) {
script {
template = readFile encoding: 'UTF-8', file: "${content}"
emailext(
to: "${env._EMAIL_TO}",
subject: "Job [${env.JOB_NAME}] - Status: ${currentBuild.result?: 'success'}",
body: """${template}"""
)
}
}
}
}
}
stage('Staging') {
when {
beforeAgent true
branch 'staging'
}
steps {
echo 'This is staging branch'
}
}
stage('Develop') {
when {
beforeAgent true
branch 'develop'
}
steps {
echo 'This is develop branch'
}
}
}
}