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'

相关文章
相关标签/搜索