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

How to define pipeline stage once and using it multiple times

所以我有一个 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文件只是定义了一个map,然后调用myStep调用。

例如:

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

问题

我们现在需要另一个 Jenkins 作业,其中一些阶段是相同的。例如,新职位需要

  1. 克隆所有需要的存储库
  2. 部署环境
  3. 做点别的事

更改公共阶段的行为(例如:克隆存储库)应该会在定义此阶段的所有作业中生效。我知道我们可以在舞台上使用 when 指令,但是从可用性的角度来看,我希望这些工作有所不同,因为它们正在执行不同的事情。一个工作的用户不关心另一个工作的附加阶段 运行s.

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

共享库是否可以使用所有指令(stepswhenpost 等)一次定义阶段 "implementation",但有它被多次调用?

例如:

/* 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
    }
}

这是一个开放的詹金斯Feature Request

我已经看到了多种模板化管道的方法,但这与您想要实现的目标相去甚远。