jenkins pipeline脚本_jenkins学习系列之pipeline插件十大最佳实践

e08b37860d273a7481e7cdf6e5791e1e.png
Jenkins Pipeline 插件对于 Jenkins 用户来说可以让用户能够改变游戏规则。基于 Groovy 中的领域特定语言(DSL),Pipeline 插件使 Pipelines 可以有脚本来定义,并且提供了非常强大的方法来开发复杂的、多步 DevOps Pipeline 。本文记录了编写 Jenkins Pipeline 的一些的最佳实践和不推荐的代码示例和说明

**本文是引用其他作者的文章,原出处已在文章末尾标识**

在看pipeline文档时,看到这篇文章,觉得还不错,决定收录下来,文章的观点仅代表原作者的观点。

1. 要使用真正的 Jenkins Pipeline

不要使用像 Build Pipeline 插件或者 Buildflow 插件这样的旧插件。而是使用真正的 Jenkins Pipiline 插件套装。

这是因为 Pipeline 插件是底层工作自身的一个改变和提升的 Step。与 Freestyle 任务不同,Pipeline 对 Jenkins 主机重新启动具有适应能力,并且有可以替代以前用于构建多步、复杂交付 Pipeline 的许多旧插件的内置功能。

有关入门的更多信息,请访问 https://jenkins.io/solutions/pipeline/

2. 就像写代码一样开发你的 Pipeline

使用这个功能可以让你像做其他软件一样将 Pipeline 描述代码以 Jenkinsfile 方式存储在 SCM 中,然后进行版本测试。

这样做可以将 Pipeline 作为代码看待,强制执行良好的规范,并开辟了一个新的功能领域,如多分支、拉请求检测和组织扫描 GitHub 和 BitBucket。

c717cc3215aab6c28b49641431d84c20.png

还应该将流水线脚本称为默认名称:Jenkinsfile ,并且以 #!groovy 脚本开头,以便 IDE ,GitHub 和其他工具将其识别为 Groovy 并启用代码高亮。

3. 要在 Stage 块内进行作业

Pipeline 内的任何非安装作业都应该在某一个 Stage 块内执行。

这是因为 Stage 是 Pipeline 的逻辑分割。 可以将工作分为几个 Stage,可以将 Pipeline 分成清晰的几个步骤。

例如:

stage 'build'

//build

stage 'test'

//test

更好的是:Pipeline Stage View 插件将各个 Stage 看作 Pipeline 的唯一分段。

4949e351c91e3e30dcf0d541a326afbc.png

4. 在节点内执行实际作业

Pipeline 里的实质性作业都应该发生在一个 Node 块内。

因为在默认情况下,Jenkinsfile 脚本本身在 Jenkins 主机上运行,使用一个预期使用很少资源的轻量级执行器。 在任何实质性作业过程中,例如从 Git 服务器克隆代码或编译 Java 应用程序,都应该利用 Jenkins 分布式构建能力, 在代理节点中运行。

例如:

stage 'build'

node{

    checkout scm

    sh 'mvn clean install'

}

5. 做一个并行的 Step

Pipeline 提供了一个很直接的语法,用于将你的 Pipeline 分为并行的 Step。

这是因为并行分配工作将使你的 Pipeline 运行更快,并更快地获得开发人员和团队其他成员的反馈。

例如:

parallel 'shifting':{

    //everything

}, 'left':{

    //I can

}

提示:使用 Parallel Test Executor 插件让 Jenkins 自动确定如何在最佳并行池中运行 xUnit 兼容测试!您可以在 CloudBees 博客上阅读有关并行测试执行的更多信息。

6. 在并行 Step 中的使用 Node

为什么我们要在并行 Step 中获取并使用一个 Node? 这是因为并行化有一个主要的优势是:可以同时进行更多的实质性工作(参见最佳实践4)! 通常,我们应该想在 Pipeline 的并行分支中获取一个 Node 来提高并发构建速度。

例如:

parallel 'integration-tests':{

    node('mvn-3.3'){ ... }

}, 'functional-tests':{

    node('selenium'){ ... }

}

7. 在 Step 的 Timeout 代码块内进行 Input

Pipeline 有一个简单的机制,那就是可以将 Pipeline 中的任何 Step 定时。 作为最佳实践,我们应该总是计划使用 Timeout 块内 使用 Input。

这是为了健康的 Pipeline 的清理。如果在给定的窗口内没有出现批准,则在超时时间中的 Input 将允许被清理(即中止)。

例如:

timeout(time:5, unit:'DAYS') {

    input message:'Approve deployment?', submitter: 'it-  ops'

}

8. 文件暂存优先于存档

在将暂存能力添加到流水线 DSL 之前,存档是在 Pipeline 中的 Node 或 Stage 之间共享文件的最佳方式。 如果只需要在流水线的 Stage 和 Node 之间共享文件,则应该使用暂存/提取而不是存档。

这是因为暂存和提取被设计用于在 Stage 和 Node 之间共享文件,例如应用程序的源代码。另一方面,存档被设计用于长期文件存储(例如,你构建的中间二进制文件)。

例如:

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

unstash 'source'

9. 不要在 Node 块内使用 Input

虽然可以在节点块中使用一个 Input 语句,但我们绝对不应该这样做。

因为 Input 元素会暂停 Pipeline 执行而去等待批准——无论是自动还是手动。 这些批准自然需要一些时间。 另一方面,当因为 Input 停下来的时候,节点元素会获取并保持锁定工作空间和耗资源的任务,这将是一个昂贵的资源。

因此,要在 Node 之外创建 Input。

例如:

stage 'deployment'

input 'Do you approve deployment?'

node{

    //deploy the things

}

10. 不要使用 Env 全局变量设置环境变量

尽管你可以编辑 Env 全局变量中来定义某些环境设置,但我们应该使用 withEnv 语法。

Env 变量是全局变量,所以我们不鼓励去直接改变它,因为样就改变了全局环境,所以建议使用 withEnv 语法。

例如:

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

    sh "mvn clean verify"

}

本文作者:王志宇

原文链接:https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugin

版权归作者所有,转载请注明出处

如果对文章有疑问或者哪里不懂的请联系我,在力所能及的范围内帮助解答;如果文章有错误,也欢迎指出;也希望jenkins的大牛来一起互相交流学习。

微信号:kakaicoco

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值