Jenkins Pipeline如何实现动态Stage并行/顺序执行切换?
Jenkins Pipeline 动态生成顺序/并行 Stage 解决方案
问题分析
你当前的代码在mode为false时仅返回存储Stage闭包的Map,但Jenkins不会自动执行这些闭包,这就是顺序模式失效的核心原因。要实现顺序执行,需要主动遍历Map并逐个调用每个闭包。
修改后的完整代码
Map item_1 = [ 'Data_1' : 'sdfdfd', 'Data_2' : 'dfdfdfd' ] // 生成GitCheckout Stage的函数,支持并行/顺序双模式 def gitcheckoutStages(item, gitCredentials, mode) { def map_steps = [:] item.each { key, value -> println "$key: $value" map_steps["$key"] = { stage ("Checkout on the tag in the repo $key") { dir("$key") { utils.checkoutSCM("$value", env.GIT_ANDROID_BRANCH, "$gitCredentials") env."$key" = sh(script: "git tag --list --sort=-taggerdate ${params.VERSION} | head -n 1", returnStdout: true).trim() sh "git tag" sh "echo ${env."$key"}" } if (env."$key" == "") { error("Can't find the tag with selected pattern") } if (params.VERSION ==~ /.*SNAP/) { env.DEBUG_PARAMETER = "Debug" } else { env.DEBUG_PARAMETER = "Release" } dir("$key") { sh "git checkout ${env."$key"}" sh "git log -1" } } } } if (mode == "true") { // 并行执行模式:直接调用Jenkins parallel方法 parallel(map_steps) } else { // 顺序执行模式:遍历闭包Map,逐个执行Stage map_steps.each { name, stageClosure -> stageClosure() } } } pipeline { agent { label 'android-executor' } options { disableConcurrentBuilds() timestamps() ansiColor('xterm') } post { always { script { utils.cleanUpWorkspace(env.WORKSPACE) } } } stages { stage ("Git checkout for all repos") { steps { script { // 传入"false"启用顺序执行,传入"true"启用并行执行 gitcheckoutStages(item_1, gitCredentials, "false") } } } } }
关键修改说明
- 顺序执行逻辑:在
mode为false时,不再返回闭包Map,而是通过map_steps.each遍历并调用每个Stage闭包,确保Stage按Map的插入顺序逐个执行(Groovy 2.5+默认保留Map插入顺序)。 - 简化条件判断:移除冗余的字符串强制转换,直接用
mode == "true"进行模式判断,代码更简洁。
使用方式
调用gitcheckoutStages函数时,第三个参数传入"true"则并行执行所有动态Stage;传入"false"则按item_1中定义的顺序逐个执行Stage。
内容的提问来源于stack exchange,提问作者Twisted_sister
相关产品推荐
相关产品推荐

