Jenkins 管道将阶段作为变量?
Jenkins Pipeline Make a Stage as a Variable?
stages {
stage('Setup') {
}
stage('Parallel Stage') {
parallel {
stage('Executor 1') {
}
stage('Executor 2') {
}
stage('Executor 3') {
}
stage('Executor 4') {
}
}
}
}
以上是我的 Jenkins 管道的骨架,它有一个设置阶段,然后是一个并行阶段,该阶段将相同的事情执行四次以缩短执行时间。
有没有办法将阶段定义为变量以减少 4 倍的代码重复并减少我必须进行的编辑次数?
是的,最好的方法是定义一个生成阶段并可以并行调用的函数。
假设您正在将这些阶段并行执行到 1 个代理中。
在下面的示例管道中,generateStage
是一个用函数替换嵌套阶段的函数。
def jobs = ["Executor1", "Executor2", "Executor3"]
def parallelStagesMap = jobs.collectEntries {
["${it}" : generateStage(it)]
}
def generateStage(job) {
return {
stage("${job}") {
echo "Running stage ${job}."
}
}
}
pipeline {
agent any
stages {
stage('setup') {
steps {
echo 'This stage will be executed first.'
}
}
stage('parallel stage') {
steps {
script {
parallel parallelStagesMap
}
}
}
}
}
管道的输出如下:
详情请看我的回答
唯一的缺点是您不能在 stages
之后直接执行此管道安排,这就是为什么在脚本中调用 parallelStageMap
的原因。
stages {
stage('Setup') {
}
stage('Parallel Stage') {
parallel {
stage('Executor 1') {
}
stage('Executor 2') {
}
stage('Executor 3') {
}
stage('Executor 4') {
}
}
}
}
以上是我的 Jenkins 管道的骨架,它有一个设置阶段,然后是一个并行阶段,该阶段将相同的事情执行四次以缩短执行时间。
有没有办法将阶段定义为变量以减少 4 倍的代码重复并减少我必须进行的编辑次数?
是的,最好的方法是定义一个生成阶段并可以并行调用的函数。
假设您正在将这些阶段并行执行到 1 个代理中。
在下面的示例管道中,generateStage
是一个用函数替换嵌套阶段的函数。
def jobs = ["Executor1", "Executor2", "Executor3"]
def parallelStagesMap = jobs.collectEntries {
["${it}" : generateStage(it)]
}
def generateStage(job) {
return {
stage("${job}") {
echo "Running stage ${job}."
}
}
}
pipeline {
agent any
stages {
stage('setup') {
steps {
echo 'This stage will be executed first.'
}
}
stage('parallel stage') {
steps {
script {
parallel parallelStagesMap
}
}
}
}
}
管道的输出如下:
详情请看我的回答
唯一的缺点是您不能在 stages
之后直接执行此管道安排,这就是为什么在脚本中调用 parallelStageMap
的原因。