jenkins2 pipeline插件的10個最佳實踐

jenkins pipeline的10個最佳實踐。java

文章來自:http://www.ciandcd.com
文中的代碼來自能夠從github下載: https://github.com/ciandcdnode

翻譯自:https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugingit

 

1. 使用最新的jenkins pipeline插件Jenkins Pipeline suite of plugins, 而不使用舊的相似功能插件,例如不使用舊的build pipeline plugin 或者舊的buildflow plugin。github

新的pipeline插件是徹底不一樣於舊的插件,新的pipeline job不一樣於舊的freestyle job,新的pipeline job能夠不受jenkins master重啓的影響,能夠暫停重啓。 新的pipeline job還能夠實現更復雜的持續發佈流程。web

更多pipeline的學習,能夠參考 https://jenkins.io/solutions/pipeline/app

 

2.  經過groovy腳本實現pipelineide

使用groovy實現的pipeline流程,能夠將對應的groovy腳本存儲在文件Jenkinsfile, 且實現與源代碼一塊兒的版本控制。工具

Jenkinsfile與源代碼一塊兒版本控制,使得整個pipeline流程和源代碼一塊兒可重現。 經過Jenkinsfile實現的pipeline job,能夠更容易地支持多個分支multi-branch, 更容易地支持組織和團隊(GitHub organiztion and BitBucket Team)裏的多個項目。學習

最好在groovy腳本Jenkinsfile的第一行增長#!groovy​, 使得各類ide工具或web page可以支持groovy的語法高亮。ui

 

3. 儘量地在stage裏實現全部的任務

全部pipeline裏非配置的任務最好在stage塊裏實現。經過stage使得pipeline裏全部的任務被組織爲多個stage,每一個stage都是一組相關的任務。

例如:

stage 'build'

//build

stage 'test'

//test

pipeline view 插件使得 pipeline的stage的view和monitor更加的清楚。

 

4. 全部資源消耗的操做都應該放到node上執行

默認地,Jenkinsfile裏的腳本在jenkins master上執行,若是資源消耗的操做都在master上執行的話將影響jenkins master的運行。 因此任何資源消耗的操做都應該放到node中被分佈到agent上執行,例如從git server clone代碼,java代碼的編譯等都應該在node中執行。

stage 'build'
node{
    checkout scm
    sh 'mvn clean install'
}

 

5. 儘量地使用parallel來使得任務並行地執行

將任務並行後,使得整個job的流程更夠更快地完成,開發人員可以更早地獲得結果。

parallel 'shifting':{
    //everything
}, 'left':{
    //I can
}

對於unit的並行執行,能夠查看插件Parallel Test Executor plugin,更多詳細介紹查看Parallel Test Execution on the CloudBees Blog

 

6. 並行的任務運行在不一樣的node上

對於並行的任務使用不一樣的node,使得並行的任務不相互影響,可以實現真正的並行執行。

parallel 'integration-tests':{
    node('mvn-3.3'){ ... }
}, 'functional-tests':{
    node('selenium'){ ... }
}

 

7. 不要在node裏使用input

input 可以暫停pipeline的執行等待用戶的approve(自動化或手動),一般地approve須要一些時間等待用戶相應。 若是在node裏使用input將使得node自己和workspace被lock, 不可以被別的job使用。

因此通常在node外面使用input。

stage 'deployment'
input 'Do you approve deployment?'
node{
    //deploy the things
}

 

8. inputs應該封裝在timeout中。

pipeline能夠很容易地使用timeout來對step設定timeout時間。對於input咱們也最好使用timeout。

timeout(time:5, unit:'DAYS') {
    input message:'Approve deployment?', submitter: 'it-ops'
}

 

9. 應該使用withEnv來修改環境變量

不建議使用env來修改全局的環境變量,這樣後面的groovy腳本也將被影響。

通常使用withEnv來修改環境變量,變量的修改只在withEnv的塊內起做用。

withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {
    sh "mvn clean verify"
}

 

10.儘可能使用stash來實現stage/node間共享文件,不要使用archive

在stash被引入pipeline DSL前,通常使用archive來實現node或stage間文件的共享。 在stash引入後,最好使用stash/unstash來實現node/stage間文件的共享。例如在不一樣的node/stage間共享源代碼。

archive用來實現更長時間的文件存儲。

stash excludes: 'target/', name: 'source'unstash 'source'

相關文章
相關標籤/搜索