Jenkins是卓越的自动化工具之一。Jenkins可通过使用插件进行设计扩展。插件使Jenkins拥有极大的灵活性,可以在各种平台上自动执行各种流程。Jenkins Pipeline建立在这种灵活性和丰富的插件生态系统的基础上,同时使Jenkins用户能够将其Jenkins自动化代码编写。
Jenkins Pipeline插件是Jenkins用户的游戏规则改变者。Pipeline插件基于Groovy中的领域特定语言(DSL),使管道可编写脚本,并且是开发复杂的多步DevOps管道的强大方法。本文档记录了编写Jenkins Pipelines的一些注意事项-带有代码示例和说明。
1.DO:使用真正的JenkinsPipeline
不要使用Build Pipeline插件或Buildflow插件等较旧的插件。而是使用真正的 Jenkins Pipeline插件套件。Pipeline插件是基础工作本身的逐步改进。与自由式作业不同,管道对Jenkins主服务器重启具有弹性,并且具有内置功能,该功能取代了以前用于构建多步,复杂交付管道的许多较旧的插件。
2.DO:以代码形式开发管道
使用该功能将您的Jenkinsfile存储在SCM中,然后进行版本测试,就像测试其他软件一样。将您的Pipeline视为代码可加强良好的纪律性,还开辟了新的特性和功能世界,例如多分支,提取请求检测以及对GitHub和BitBucket的组织扫描。
您还应该将Pipeline脚本命名为默认名称:Jenkinsfile并启动以下脚本头,以便您的IDE,GitHub和其他工具将其识别为Groovy并启用代码突出显示:
#!groovy
3.DO:所有工作都在一个阶段
管道中的任何非设置工作都应在阶段块内进行。阶段是管道的逻辑分段。将工作分为几个阶段,可以将您的管道分成不同的工作部分。
stage("build"){ node{ checkout scm sh " mvn clean package" }}
更好的是:Pipeline Stage View插件将阶段可视化为管道的唯一部分
4.DO:所有方法在一个节点内工作
管道内的任何重要工作都应在节点块内进行。默认情况下,Jenkinsfile脚本本身在Jenkins主服务器上运行,使用的是轻量级执行程序,预计该执行程序将使用很少的资源。任何实质性工作,例如从Git服务器克隆代码或编译Java应用程序,都应利用Jenkins分布式构建功能并运行代理节点。
stage("build"){ node{ checkout scm sh " mvn clean package" }}
5.DO:可以并行进行工作
Pipeline提供了一种简单明了的语法,可将您的管道分为并行步骤。用它!并行分支工作将使您的管道运行更快,将管道步骤向左移动,并更快地向开发人员和团队其他成员获取反馈。
stage 'deployment'input 'Do you approve deployment?'node{ //deploy the things}
温馨提示:使用 Parallel Test Executor插件 让Jenkins自动确定如何在最佳并行存储桶中运行与xUnit兼容的测试!在CloudBees博客上阅读有关并行测试执行的更多信息 。
6.DO:在并行步骤中获取节点
管道中的并行性的主要好处之一是:做更多的实质性工作(请参阅最佳实践4)!通常,您应该争取在管道的并行分支中获取一个节点。
parallel 'integration-tests':{ node('mvn-3.3'){ ... }}, 'functional-tests':{ node('selenium'){ ... }}
7.Don't: 在节点块内使用输入
虽然可以将输入语句放在节点块中,但绝对不可以。输入元素暂停管道执行以等待批准–自动还是手动。当然,这些批准可能需要一些时间。另一方面,node元素获取并锁定工作空间和笨重的Jenkins执行器,这是一种昂贵的资源,可在暂停输入时保留。因此,请在节点外部创建输入。
stage 'deployment'input 'Do you approve deployment?'node{ //deploy the things}
8.DO:为输入设置超时时间
管道具有一种简单的机制,可以使管道的任何给定步骤超时。作为最佳实践,您应该始终计划输入周围的超时。为了健康地清理管道,这就是原因。如果在给定窗口内未进行批准,则将输入包装成超时将允许清除它们(即中止)。
timeout(time:5, unit:'DAYS') { input message:'Approve deployment?', submitter: 'it-ops'}
9.Don't:使用env全局变量设置环境变量
虽然您可以在env全局变量中编辑某些设置,但应改用withEnv语法。由于env变量是全局变量,因此不建议直接更改它,因为它会全局更改环境,因此建议使用withEnv语法。
withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) { sh "mvn clean verify"}
10.DO:优先存储文件而不是归档
在将隐藏功能添加到管道DSL之前,存档是在管道中的节点或阶段之间共享文件的最佳方法。如果只需要在管道的阶段和节点之间共享文件,则应使用存储/取消存储而不是存档。暂存和取消暂存旨在在阶段和节点之间共享文件(例如,应用程序的源代码)。另一方面,存档是为长期文件存储而设计的(例如,构建中的中间二进制文件)。
stash excludes: 'target/', name: 'source'unstash 'source'
总结:
谢谢阅读