jenkins - 如何定义管道阶段一次并多次使用它
问题描述
所以我有一个使用 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
call。
例如:
/* Sample Jenkinsfile */
pipelineParams = [
FOO = "foo"
]
myStep pipelineParams
问题
我们现在需要另一个 Jenkins 工作,其中一些阶段将是相同的。例如,新的工作将需要
- 克隆所有必需的存储库
- 部署环境
- 做点别的
并且更改公共阶段的行为(例如:克隆 repo)应该在定义此阶段的所有作业中生效。我知道我们可以when
在舞台上使用该指令,但是从可用性的角度来看,我希望工作有所不同,因为他们正在执行不同的事情。一个工作的用户并不关心另一个工作运行的额外阶段。
我想避免代码重复,更好的是,我不想复制阶段代码。(包括steps
、when
、post
等)。
有没有一种方法可以让共享库使用所有指令(steps
, when
,post
等)一次定义阶段“实现”,但是否会多次调用它?
例如:
/* 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
}
}
解决方案
这是一个开放的 Jenkins功能请求。
我已经看到了不同的方法来模板化管道,但这远非您想要实现的。
推荐阅读
- visual-studio-code - Visual Studio Code WSL Remote - 忽略 Cwd 的 WSL 终端
- javascript - 映射反应时如何显示1个单位
- linux - 在 Ubuntu 上交叉编译 Gotk3 App for Windows
- aws-cli - AWS 粘合作业参数错误 - 解析参数“--arguments”时出错:预期:“,”,接收到:“输入”:
- python - PySpark groupby applyInPandas 将对象保存为文件问题
- c# - 如何递归地遍历 TreeView-items
- android - 当我添加新包颤动时修复依赖解析错误
- java - 处理动画问题
- c# - 自定义 WPF 屏幕键盘而不是 Windows 触摸键盘 (TabTip)
- flutter - 为什么我在任务':firebase_core:verifyReleaseResources'的颤振失败中收到错误