我有简单的并行管道(参见代码),我和Jenkins 2.89.2一起使用。另外,我使用参数,现在希望能够通过在作业执行之前提供参数来自动减少deployVM A..Z阶段的数量。
如何通过提供参数来动态构建我的管道?
目前已研究过:
我想要的伪代码 - 动态生成:
pipeline {
agent any
parameters {
string(name: 'countTotal', defaultValue: '3')
}
stages {
stage('deployVM') {
def list = [:]
for(int i = 0; i < countTotal.toInteger; i++) {
list += stage("deployVM ${i}") {
steps {
script {
sh "echo p1; sleep 12s; echo phase${i}"
}
}
}
}
failFast true
parallel list
}
}
}
我到目前为止的代码 - 执行并行但是静态的:
pipeline {
agent any
stages {
stage('deployVM') {
failFast true
parallel {
stage('deployVM A') {
steps {
script {
sh "echo p1; sleep 12s; echo phase1"
}
}
}
stage('deployVM B') {
steps {
script {
sh "echo p1; sleep 20s; echo phase2"
}
}
}
}
}
}
}
答案 0 :(得分:6)
虽然问题假定使用声明性管道,但我建议使用scripted pipeline,因为它更灵活。
你的任务可以通过这种方式完成
properties([
parameters([
string(name: 'countTotal', defaultValue: '3')
])
])
def stages = [failFast: true]
for (int i = 0; i < params.countTotal.toInteger(); i++) {
def vmNumber = i //alias the loop variable to refer it in the closure
stages["deployVM ${vmNumber}"] = {
stage("deployVM ${vmNumber}") {
sh "echo p1; sleep 12s; echo phase${vmNumber}"
}
}
}
node() {
parallel stages
}
另请参阅snippet generator,它允许您生成一些脚本化的管道代码。
答案 1 :(得分:1)
答案 2 :(得分:0)
@Vitalii
我写了类似的代码片段,但不幸的是,所有这三个元素都被循环显示了最后一个,不确定是否与groovy / jenkinsfile本身有关,某些clouse /引用被错误使用破坏了
我的目的是将任务分配到特定的工作节点
node_candicates = ["worker-1", "worder-2", "worker-3"]
def jobs = [:]
for (node_name in node_candidates){
jobs["run on $node_name"] = { // good
stage("run on $node_name"){ // all show the third
node(node_name){ // all show the third
print "on $node_name"
sh "hostname"
}
}
}
}
parallel jobs
如果我扩展/解释循环,就完全可以了,而不是像这样循环遍历
parallel worker_1: {
stage("worker_1"){
node("worker_1"){
sh """hostname ; pwd """
print "on worker_1"
}
}
}, worker_2: {
stage("worker_2"){
node("worker_2"){
sh """hostname ; pwd """
print "on worker_2"
}
}
}, worker_3: {
stage("worker_3"){
node("worker_3"){
sh """hostname ; pwd """
print "on worker_3"
}
}
}