如何一次定义管道阶段并多次使用它
How to define pipeline stage once and using it multiple times
所以我有一个 Jenkinsfile 的用例,我知道它并不常见,但我还没有找到解决方案。
背景
我们目前有一个多分支管道作业配置为构建多个分支。这用于 运行 跨多个版本对产品进行系统测试。詹金斯工作
- 克隆所有需要的存储库
- 部署环境
- 执行自动化测试用例
- 取消部署环境
为了避免在每个分支上定义相同的 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 作业,其中一些阶段是相同的。例如,新职位需要
- 克隆所有需要的存储库
- 部署环境
- 做点别的事
更改公共阶段的行为(例如:克隆存储库)应该会在定义此阶段的所有作业中生效。我知道我们可以在舞台上使用 when
指令,但是从可用性的角度来看,我希望这些工作有所不同,因为它们正在执行不同的事情。一个工作的用户不关心另一个工作的附加阶段 运行s.
我想避免代码重复,更好的是,我不想重复阶段代码。 (包括 steps
、when
、post
等。)
共享库是否可以使用所有指令(steps
、when
、post
等)一次定义阶段 "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。
我已经看到了多种模板化管道的方法,但这与您想要实现的目标相去甚远。
所以我有一个 Jenkinsfile 的用例,我知道它并不常见,但我还没有找到解决方案。
背景
我们目前有一个多分支管道作业配置为构建多个分支。这用于 运行 跨多个版本对产品进行系统测试。詹金斯工作
- 克隆所有需要的存储库
- 部署环境
- 执行自动化测试用例
- 取消部署环境
为了避免在每个分支上定义相同的 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 作业,其中一些阶段是相同的。例如,新职位需要
- 克隆所有需要的存储库
- 部署环境
- 做点别的事
更改公共阶段的行为(例如:克隆存储库)应该会在定义此阶段的所有作业中生效。我知道我们可以在舞台上使用 when
指令,但是从可用性的角度来看,我希望这些工作有所不同,因为它们正在执行不同的事情。一个工作的用户不关心另一个工作的附加阶段 运行s.
我想避免代码重复,更好的是,我不想重复阶段代码。 (包括 steps
、when
、post
等。)
共享库是否可以使用所有指令(steps
、when
、post
等)一次定义阶段 "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。
我已经看到了多种模板化管道的方法,但这与您想要实现的目标相去甚远。