如何一次定义管道阶段并多次使用

时间:2019-01-07 19:34:50

标签: jenkins jenkins-pipeline jenkins-shared-libraries

所以我有一个用Jenkinsfile的用例,我知道这是不常见的,而且我还没有找到解决方案。

背景

我们当前有一个配置为构建多个分支的多分支管道作业。这用于跨多个版本运行产品的系统测试。詹金斯的工作

  1. 克隆所有必需的存储库
  2. 部署环境
  3. 执行自动测试用例
  4. 取消部署环境

为了避免在每个分支上定义相同的Jenkinsfile,我们创建了一个共享库。共享库为Jenkins文件定义了声明式管道阶段。共享库具有以下内容:

/* File name var/myStep.groovy */
def call(Map pipelineParams) {
    callASharedLibraryFunction()

    properties([
        parameters(sharedLibraryGetParameters(pipelineParams))
    ])

    pipeline {
        // snip
        stages {
            stage("clone repos") { }
            stage("Deploy environment") { }
            stage("Executed Tests") { }
            stage("Undeploy environment") { }
        }
        // post directives
    }
}

Jenkins文件只是定义了一个地图,然后调用myStep调用。

例如:

/* Sample Jenkinsfile */
pipelineParams = [
    FOO = "foo"
]
myStep pipelineParams

问题

我们现在需要另一项詹金斯(Jenkins)工作,其中某些阶段是相同的。例如,新工作将需要

  1. 克隆所有必需的存储库
  2. 部署环境
  3. 做其他事情

并更改公共阶段的行为(例如:克隆存储库)应在定义该阶段的所有作业中生效。我知道我们可以在阶段中使用when指令,但是从可用性的角度来看,我希望这些作业因执行不同的事情而有所不同。而且一项工作的用户并不关心另一项工作的额外阶段。

我想避免代码重复,更好的是,我不想重复阶段代码。 (包括stepswhenpost等。)

共享库是否可以通过所有指令(stepswhenpost等)定义一次“实现”阶段,但是可以将其称为“ multiple”时间?

例如:

/* File: vars/cloneReposStageFunction.groovy */
def call() { 
    stage("Clone Repos") { }
}

/* File: vars/myStep.groovy */
def call(Map pipelineParams) {
    pipeline {
        // snip
        stages {
            cloneReposStageFunction()
            stage("Deploy environment") { }
            stage("Executed Tests") { }
            stage("Undeploy environment") { }
        }
        // post directives
    }
}

/* File: vars/myNewStep.groovy */
def call(Map pipelineParams) {
    pipeline {
        // snip
        stages {
            cloneReposStageFunction()
            stage("Deploy environment") { }
            stage("Do something else") { }
        }
        // post directives
    }
}

1 个答案:

答案 0 :(得分:0)

这是开放的詹金斯的Feature Request

我已经看到了建立管道模板的不同方法,但这远非您要实现的目标。