前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jenkins Pipeline插件十大最佳实践!

Jenkins Pipeline插件十大最佳实践!

作者头像
程序猿DD
发布2018-02-01 19:11:47
3.3K0
发布2018-02-01 19:11:47
举报
文章被收录于专栏:程序猿DD程序猿DD

Jenkins Pipeline 插件对于 Jenkins 用户来说可以让用户能够改变游戏规则。基于 Groovy 中的领域特定语言(DSL),Pipeline 插件使 Pipelines 可以有脚本来定义,并且提供了非常强大的方法来开发复杂的、多步 DevOps Pipeline 。本文记录了编写 Jenkins 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。

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

3. 要在 Stage 块内进行作业

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

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

例如:

代码语言:javascript
复制
stage 'build'

//build

stage 'test'

//test

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

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

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

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

例如:

代码语言:javascript
复制
stage 'build'

node{

    checkout scm

    sh 'mvn clean install'

}

5. 做一个并行的 Step

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

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

例如:

代码语言:javascript
复制
parallel 'shifting':{

    //everything

}, 'left':{

    //I can

}

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

6. 在并行 Step 中的使用 Node

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

例如:

代码语言:javascript
复制
parallel 'integration-tests':{

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

}, 'functional-tests':{

    node('selenium'){ ... }

}

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

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

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

例如:

代码语言:javascript
复制
timeout(time:5, unit:'DAYS') {

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

}

8. 文件暂存优先于存档

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

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

例如:

代码语言:javascript
复制
stash excludes: 'target/', name: 'source'

unstash 'source'

9. 不要在 Node 块内使用 Input

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

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

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

例如:

代码语言:javascript
复制
stage 'deployment'

input 'Do you approve deployment?'

node{

    //deploy the things

}

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

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

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

例如:

代码语言:javascript
复制
withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {

    sh "mvn clean verify"

}

译文:转载自公众号【JFrog杰蛙DevOps】 原文:https://www.cloudbees.com/blog/top-10-best-practices-jenkins-pipeline-plugin

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 要使用真正的 Jenkins Pipeline
  • 2. 就像写代码一样开发你的 Pipeline
  • 3. 要在 Stage 块内进行作业
  • 4. 在节点内执行实际作业
  • 5. 做一个并行的 Step
  • 6. 在并行 Step 中的使用 Node
  • 7. 在 Step 的 Timeout 代码块内进行 Input
  • 8. 文件暂存优先于存档
  • 9. 不要在 Node 块内使用 Input
  • 10. 不要使用 Env 全局变量设置环境变量
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档