本指南为管道提供了一小部分最佳实践,并指出了最常见的错误。
目标是将管道作者和维持者指向导致更好的管道执行,并远离陷阱的模式,否则他们可能不知道。本指南并不意味着是所有可能的管道最佳实践的详尽列表,而是提供许多有用的特定示例,可用于跟踪常见实践。用它作为“做到这一点”,而不是一个令人难以置信的详细的“how-to”。
本指南由区域,指南,然后列出特定示例排列。
使用Groovy代码连接一组操作而不是作为管道的主要功能。换句话说,而不是依赖流水线功能(Groovy或管道步骤)来向前驱动构建过程,使用单个步骤(例如SH.
)完成构建的多个部分。流水线,因为它们的复杂性增加(Groovy代码的数量,所使用的步数等),需要更多的资源(CPU,存储器,存储)。将管道视为实现构建而不是构建核心的工具。
示例:使用单个Maven构建步骤通过其构建/测试/部署进程来驱动构建。
对于管道,Groovy代码总是在控制器上执行,这意味着使用控制器资源(内存和CPU)。因此,减少管道执行的Groovy代码的量非常重要(这包括在管道中导入的类上的任何方法)。以下是最常见的例子避免使用的方法:
JSonslurper:此函数(以及与XMLSlurper或ReadFile这样的其他类似的函数)可用于从磁盘上的文件读取,将数据从该文件解析为JSON对象,并使用像JSonsLurper()等命令将该对象注入管道中。Parsetext(ReadFile(“$ local_file”)))。此命令将本地文件加载到控制器上的内存中两次,如果文件非常大或命令频繁执行,则需要大量内存。
解决方案:而不是使用JSonslurper,使用shell步骤并返回标准。这个shell看起来像这样:def jsonreturn = sh标签:'',returnstdout:true,脚本:'echo“$ local_file”|JQ“$ parsing_query”'
。这将使用代理资源来读取该文件,$ parsing_query将帮助将文件解析为较小的尺寸。
httprequest:通常,此命令用于从外部源抓取数据并将其存储在变量中。这种做法并不理想,因为如果控制器没有加载证书,则不仅可以直接来自控制器(这可能会给HTTPS请求等内容提供错误的结果),还存储对该请求的响应量是两次。
解决方案:使用shell步骤从代理执行HTTP请求,例如使用刀具卷曲
或者w
, 作为适当的。如果结果必须在管道中稍后,请尝试尽可能多地过滤代理侧的结果,以便仅将最小所需信息传输回Jenkins控制器。必威国际有限公司
将管道步骤与单个步骤相结合,尽可能频繁地减少由管道执行发动机本身引起的开销量。例如,如果您运行三个shell步骤后退,则必须启动和停止每个步骤,要求创建和清理代理和控制器上的连接和资源。但是,如果将所有命令放入单个shell步骤中,则只需启动和停止单个步骤。
示例:而不是创建一系列回声
或者SH.
步骤将它们组合成一个步骤或脚本。
必威国际有限公司jenkins.getInstance.
使用Jenk必威国际有限公司ins.Instance或其访问者方法在管道或共享库中,指示该管道/共享库中的代码误用。使用jenk必威国际有限公司ins apis从一个不适合的共享库意味着共享库是共享库和某种jenkins插件。与Jenkins API从管道交互时,您需要非常小心,以避免严重的安全性和性能问题。必威国际有限公司如果您必须在构建中使用Jenki必威国际有限公司ns API,则建议的方法是在Java中创建一个最小的插件,该插件在jenkins API周围实现安全包装器,您要使用管道的步骤API访问。使用Jenk必威国际有限公司ins Apis从沙盒的Jenkinsfile直接意味着您可能不得不多白名单方法,允许任何可以修改管道的人绕过沙箱保护,这是一个重要的安全风险。白名单方法作为系统用户运行,具有整体管理员权限,这可能导致具有比预期的更高权限的开发人员。
解决方案:最佳解决方案是在所做的呼叫周围工作,但如果必须完成,那么更好地实现能够收集所需数据的Jenkins插件。必威国际有限公司
尽量不要在多个管道执行或多个不同的管道上共享工作空间。这种做法可能导致每个管道或工作区重命名内意外的文件修改。
理想情况下,共享卷/磁盘安装在单独的位置,并且文件将从该位置复制到当前工作区。然后,当构建完成时,如果完成更新,可以复制文件。
构建在不同的容器中,从头开始创建所需的资源(云类型代理为此工作很好)。构建这些容器将确保构建过程每次都开始于一开始,并且很容易重复。如果构建容器不起作用,则在管道上禁用并发性或使用可锁的资源插件在运行时锁定工作区,以便在锁定时无法使用其他构建。警告:禁用并发或锁定工作区运行时会导致管道当这些资源被任意锁定时等待资源时被阻止。
此外,请注意,这两种方法都具有比每个作业的独特资源的构建结果较慢
notserializableException.
管道代码是CPS转换,使得管道能够在Jenkins重新启动后恢复。必威国际有限公司也就是说,当管道运行脚本时,可以关闭Jenkins或丢失与代理的连接。必威国际有限公司当它恢复后,jenkins记得它在做什么必威国际有限公司,你的管道脚本恢复执行,就好像它永远不会中断一样。一种称为“延续传递风格(CPS)“执行在恢复管道中发挥着关键作用。但是,由于CPS转换,某些Groovy表达式无法正常工作。
在引擎盖下,CPS依赖于能够将管道的当前状态序列以及剩余的管道序列。这意味着在不序列化的管道中使用对象将触发anotserializableException.
当管道试图持续其状态时要抛出。
看管道CPS方法不匹配有关更多细节和可能存在问题的一些示例。
下面将涵盖确保管道可以按预期运行的技术。