本文通過簡單的pipeline的實例和詳細的講解,能夠學習基本pipeline的groovy用法,然后開始實現自己的pipeline job。
翻譯和修改自:https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
文章來自:http://www.ciandcd.com
文中的代碼來自可以從github下載: https://github.com/ciandcd
1. 安裝java,maven,配置jenkins
安裝java和maven:
#install java jdk
sudo apt-get update
sudo apt-get install default-jdk
#install maven in ubuntu
sudo apt-get update
sudo apt-get install maven
#setting for maven
~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
#testing maven
/usr/share/maven/bin/mvn -v
Apache Maven 3.3.9
Maven home: /usr/share/maven
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.4.0-24-generic", arch: "amd64", family: "unix"
在jenkins的global tool configuration里配置環境變量
2. 創建簡單的pipeline job
groovy代碼如下:
node {
git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
def mvnHome = tool 'M3'
sh "${mvnHome}/bin/mvn -B verify"
}
上面的代碼實現了從github checkout源代碼,然后通過maven來構建, 代碼中包含了測試用例,有可能會隨機的失敗, 如果有測試用例失敗,則整個pipeline job將會標記為失敗。
如果是windows系統,需要修改為bat "${mvnHome}\\bin\\mvn -B verify"。
groovy的node用來選擇運行的機器,只要node還有可用的executor,node里的step任務將會在選中的機器上運行,且會在選中的機器上創建workspace。
許多的step必須在node里執行,例如git,sh等必須在node環境里執行。
不像用戶定義的函數,pipeline step總是接受命名參數,括號可以省略,也可以使用標准的groovy語法傳入map作為參數,例如等價用法:
git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
git url: 'https://github.com/jglick/simple-maven-project-with-tests.git', branch: 'master'
git([url: 'https://github.com/jglick/simple-maven-project-with-tests.git', branch: 'master'])
如果只有一個強制的參數,則可以省略參數名字,如下兩種等價效果:
sh 'echo hello'
sh([script: 'echo hello'])
def可以定義groovy變量,tool可以檢查指定名字的工具是否存在且可以訪問,在雙引號里使用變量,變量將會被替換為真實的值:
def mvnHome = tool 'M3'
"${mvnHome}/bin/mvn -B verify"
3. 環境變量的使用
最簡單的使用工具的方式是將工具路徑加入到PATH中,通過env可以修改node對應機器的環境變量,后面的steps可以看到環境變量的修改。
node {
git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
def mvnHome = tool 'M3'
env.PATH = "${mvnHome}/bin:${env.PATH}"
sh 'mvn -B verify'
}
jenkins的job有一些內置的默認的環境變量,可以通過http://jenkins-server/job/javahelloworld/pipeline-syntax/globals來查看job默認的環境變量。 如下:
BRANCH_NAME
CHANGE_ID
CHANGE_URL
CHANGE_TITLE
CHANGE_AUTHOR
CHANGE_AUTHOR_DISPLAY_NAME
CHANGE_AUTHOR_EMAIL
CHANGE_TARGET
BUILD_NUMBER
BUILD_ID
BUILD_DISPLAY_NAME
JOB_NAME
JOB_BASE_NAME
BUILD_TAG
EXECUTOR_NUMBER
NODE_NAME
NODE_LABELS
WORKSPACE
JENKINS_HOME
JENKINS_URL
BUILD_URL
JOB_URL
例如你可以在node中的step中使用env.BUILD_TAG。
同樣地,如果你使用參數化build,則同名的參數在groovy里可以使用。
4. 記錄測試結果和構建產物
當有測試用例失敗的時候,你可能需要保存失敗的用例結果和構建產物用於人工排查錯誤。
node {
git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
def mvnHome = tool 'M3'
sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify"
step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar', fingerprint: true])
step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml'])
}
上面的例子中,-Dmaven.test.failure.ignore將忽略測試用例的失敗,jenkins將正常執行后面的step然后退出。
上面的兩個step調用相當於調用傳統的jenkins的steps將構建產物和測試結構保存。
以下兩個是等價作用,第一個是簡寫:
git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
checkout scm: [$class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[url: 'https://github.com/jglick/simple-maven-project-with-tests']]
5. slave機器的選擇、
groovy中通過node的參數labels來選擇slave,用法跟jenkins1里的一樣,我們需要先定義jenkins node,且給jenkins node定義label,然后在groovy里使用node加label來選擇slave。
例如如下node選擇同時定義了unix和64bit的slave。
node('unix && 64bit') { // as before }
6. 暫停pipeline
新建pipeline job,修改groovy腳本如下:
node {
git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
def mvnHome = tool 'M3'
sh "${mvnHome}/bin/mvn -B -Dmaven.test.failure.ignore verify"
input 'save artifacts and unit results?'
// rest as before
step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar', fingerprint: true])
step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml'])
}
在job的運行頁面可以看到
然后點擊proceed,pipelinejob就繼續執行了。貌似job console output中的 proceed/Abort連接點了沒有用。必須要要點擊pause for input的proceed/abort按鈕才可以。

7. 分配workspace
當node執行steps的時候會自動分配workspace,用於checkout代碼,運行命令和其他任務。在step執行的時候workspace是被lock的,workspace只能同時被一個build使用。如果多個build需要使用同一個node的workspace,新的workspace將會被自動分配。
例如你同時運行你的同一個job兩次,則第二個job log中可以看到使用了不同的workspace:
Running on <yourslavename> in /<slaveroot>/workspace/<jobname>@2
並行的job如果在新的workspace,則需要重新checkout代碼,可以查看job log來證實。
下一節將學習更復雜的groovy用法。