You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jenkins Pipeline同一Stage下运行多个when条件

Jenkins Pipeline 多条件执行问题修复

你的代码报错是因为声明式Pipeline的Stage不允许重复定义when和steps块,一个Stage只能包含一个when条件组和一个steps执行块。结合你的需求(选择Lab1时执行基础部署,勾选Develop选项时额外执行操作),可以用以下两种方式修复:

方案一:单Stage内通过条件判断实现

在同一个Stage的steps里,用script块结合Groovy条件判断,先执行基础操作,再判断是否需要执行额外操作:

pipeline {
    parameters {
        // 建议参数名改用下划线分隔,避免空格带来的引用问题
        extendedChoice(name: 'lab_to_update', description: '选择要部署的实验室', multiSelectDelimiter: ',',
                type: 'PT_CHECKBOX', value: 'lab1,Lab2', visibleItemCount: 5)
        extendedChoice(name: 'is_develop_deployment', description: '是否为开发环境部署', multiSelectDelimiter: ',',
                type: 'PT_CHECKBOX', value: 'Develop deployment', visibleItemCount: 5)
    }
    agent { label 'ansible.cyber.local' }

    stages {
        stage ('Deploy pyspark_dependencies on Lab 1') {
            when { 
                // 仅当选中lab1时进入该Stage
                expression { params.lab_to_update.contains('lab1') }
            }
            steps {
                echo "执行Lab1基础部署操作"
                // 判断是否勾选了开发环境选项,执行额外操作
                script {
                    if (params.is_develop_deployment == 'Develop deployment') {
                        echo "执行开发环境额外操作"
                    }
                }
            }
        }
    }
}

方案二:拆分Stage分别控制

把基础操作和额外操作拆成两个独立Stage,各自设置when条件,逻辑更清晰:

pipeline {
    parameters {
        extendedChoice(name: 'lab_to_update', description: '选择要部署的实验室', multiSelectDelimiter: ',',
                type: 'PT_CHECKBOX', value: 'lab1,Lab2', visibleItemCount: 5)
        extendedChoice(name: 'is_develop_deployment', description: '是否为开发环境部署', multiSelectDelimiter: ',',
                type: 'PT_CHECKBOX', value: 'Develop deployment', visibleItemCount: 5)
    }
    agent { label 'ansible.cyber.local' }

    stages {
        stage ('Lab1基础部署') {
            when { 
                expression { params.lab_to_update.contains('lab1') }
            }
            steps {
                echo "执行Lab1基础部署操作"
            }
        }

        stage ('开发环境额外操作') {
            when { 
                allOf {
                    expression { params.lab_to_update.contains('lab1') }
                    expression { params.is_develop_deployment == 'Develop deployment' }
                }
            }
            steps {
                echo "执行开发环境额外操作"
            }
        }
    }
}

注意事项

  • 参数名如果包含空格,引用时需要用params."参数名"的格式(比如params."Lab to update"),建议改用下划线分隔的命名(如lab_to_update)避免麻烦。
  • 注意value里的大小写(你代码里是lab1,但原when里写的是Lab1),必须完全匹配才会触发条件。

内容的提问来源于stack exchange,提问作者dzbeda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:35:01