我们有几个Java项目。每个项目都有自己的交付渠道。
所有管道都有以下共同步骤(简化):
项目管道仅在项目特定属性(例如服务名称或测试和生产环境的IP地址)方面有所不同。
问题是:我们怎样才能避免所有项目共同的样板? Jenkins“Pipeline as code”是否提供类似管道模板的东西?
我可以想象一个模板可以在我们的项目管道中节省大量冗余代码/步骤。因此,设置一个新项目,维护管道,保持管道同步更容易......
答案 0 :(得分:21)
一种适合我们的方法是将管道的一部分(所有项目都有共同点)或甚至整个管道放入Jenkins shared library。
示例强>
以下脚本(template.groovy
)在Jenkins共享库中定义为全局变量。该方法创建一个新的声明性管道(它也适用于脚本化管道语法)。所有项目特定属性都通过templateParams
地图提供。
/**
* Defines a pipeline template (as a sample with one job parameter
* that should be common for all pipelines)
*/
def createMyStandardDeclarativePipeline(Map templateParams) {
pipeline {
agent any
parameters {
string(name: 'myInput', description: 'Some pipeline parameters')
}
stages {
stage('Stage one') {
steps {
script {
echo "Parameter from template creation: " + templateParams.someParam
}
}
}
stage('Stage two') {
steps {
script {
echo "Job input parameter: " + params.myInput
}
}
}
}
}
}
使用此全局变量,以下行从我们的模板创建管道:
template.createMyStandardDeclarativePipeline(someParam: 'myParam')
<强>结论强>
这个概念可以很容易地定义管道模板并在多个项目中重用它们。
应用于问题中给出的示例,您可以使用简单的单行创建项目的交付管道:
template.createStandardDeliveryPipeline(serviceName: 'myService',
testEnv: '192.168.99.104',
productionEnv: '192.168.99.105')
更新(30-09-2017):现在,Declarative Pipelines 1.2版正式支持在共享库中声明管道块。请参阅:https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-declarative-pipelines
更新(06-10-2017):现在可以在此处找到扩展示例:https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/
答案 1 :(得分:0)
您可以使用共享库来生成作业,并使代码可以在不同的作业中重复使用,并使您的jenkins文件真正干净。
共享库是由文件夹src构成的,它将包含您要在不同作业中调用的所有方法,以及vars文件夹,您将在其中实现Job的逻辑,vars文件夹的文件是groovy文件,您可以通过将相应的变量传递给您的作业,在jenkins文件中通过此文件的名称调用每个文件后面的逻辑,具体取决于您提到的任何内容(IP地址,...)
例如:
在vars中你可能有一个deploy.groovy文件,你在src文件夹中调用一个方法来执行部署工作,并且你将传递适合于特定工作的参数,并且你将要去当你像这样调用deploy.groovy时,在你的jenkins文件中定义:
node{
deploy([ip_address : '...',
env : ''
])
}
并且不要忘记导入您的共享库。并在jenkins中配置包含此共享库的repo。有关详细信息,请参阅the documentation for shared libraries in Jenkins