Jenkins管道模板

时间:2017-05-19 12:24:43

标签: jenkins jenkins-pipeline

我们有几个Java项目。每个项目都有自己的交付渠道。

所有管道都有以下共同步骤(简化):

  • 构建项目
  • 发布项目
  • 部署到测试环境
  • 部署到生产环境

项目管道仅在项目特定属性(例如服务名称或测试和生产环境的IP地址)方面有所不同。

问题是:我们怎样才能避免所有项目共同的样板? Jenkins“Pipeline as code”是否提供类似管道模板的东西?

我可以想象一个模板可以在我们的项目管道中节省大量冗余代码/步骤。因此,设置一个新项目,维护管道,保持管道同步更容易......

2 个答案:

答案 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