Jenkins pipeline jenkinsfile的兩種寫作方式,聲明式和腳本式。
為什么需要pipeline?
在多年前Jenkins成為最流行的持續集成服務器的Jenkins 1.x時代,所有的新功能都是通過安裝插件來增強,所有的配置都是通過網頁界面來實現的。
在Jenkins邁入2.x的時代,為了跟隨時代的步伐(everything is code),Jenkins引入了配置及代碼的概念。用代碼來表示流程是為了版本控制和自動化的方便,使得配置跟源代碼一樣可重現,更加容易地支持多分支開發部署。 具體地來說,就是Jenkins引入了pipeline的概念,可以使用groovy來編寫Jenkinsfile。
為什么兩種實現pipeline的方式呢?
真的是看戲的不嫌事大,同一功能兩種實現,很多用戶也會被搞迷吧。下面咱們就來捋一捋這個發展過程。
Jenkins是使用Java實現的,所以在很早的時候就引入了groovy作為DSL,管理員可以使用groovy來實現一些自動化和高級的管理功能。因為groovy引擎已經集成到Jenkins,所以在pipeline一開始很自然就使用groovy來編寫Jenkinsfile。
但是groovy畢竟是一種語言,對於沒有太多編程經驗的小白這個學習曲線有點太陡峭。這個時候聲明式的pipeline就出現了,主要是為了降低入門的難度。
作為Jenkins用戶該如何選擇呢?
- 聲明式pipeline鼓勵聲明式編程模型,比較適合沒有編程經驗的初學者。
- 腳本式pipeline,是基於groovy的DSL語言實現的,為Jenkins用戶提供了大量的靈活性性和可擴展性。
- 聲明式pipeline會得到越來越多的官方支持,可以使用Visual Pipeline Editor來編輯和驗證聲明式pipeline。
- 如果實在是聲明式語法還沒有支持的功能,還可以在聲明式里直接調用腳本。
所以推薦新手從聲明式pipeline開始。
聲明式pipeline:
https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline
腳本式pipeline:
https://jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline
下面我們分別來個例子來初步感受下,看看你更喜歡哪種?
聲明式pipeline
pipeline {
agent any
stages {
stage('Example Build') {
steps {
echo 'Hello World'
}
}
stage('Example Deploy') {
when {
branch 'production'
environment name: 'DEPLOY_TO', value: 'production'
}
steps {
echo 'Deploying'
}
}
}
}
腳本式pipeline
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
聲明式pipeline里調用腳本式語法
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
script {
def browsers = ['chrome', 'firefox']
for (int i = 0; i < browsers.size(); ++i) {
echo "Testing the ${browsers[i]} browser"
}
}
}
}
}
}
參考:
https://stackoverflow.com/questions/43484979/jenkins-scripted-pipeline-or-declarative-pipeline
https://medium.com/@brianrthompson/scripted-vs-declarative-pipelines-which-to-choose-c6af403f1e97