詹金斯管道模板

Phi*_*lip 16 jenkins jenkins-pipeline

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

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

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

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

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

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

Phi*_*lip 23

一种适合我们的方法是将管道的一部分(所有项目都有共同点)或甚至整个管道放入Jenkins共享库中.

以下脚本(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
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此全局变量,以下行从我们的模板创建管道:

template.createMyStandardDeclarativePipeline(someParam: 'myParam')
Run Code Online (Sandbox Code Playgroud)

结论

这个概念可以很容易地定义管道模板并在多个项目中重用它们.

应用于问题中给出的示例,您可以使用简单的单行创建项目的交付管道:

template.createStandardDeliveryPipeline(serviceName: 'myService', 
                                        testEnv: '192.168.99.104', 
                                        productionEnv: '192.168.99.105')
Run Code Online (Sandbox Code Playgroud)

更新(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/

  • 你确定这种方法有效吗?它确实运行了管道,但没有考虑"何时"语句 (2认同)