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

Jenkins运行时如何获取并行阶段的子阶段名称列表?

问题:Jenkins流水线中动态获取并行子阶段数量并提前准备对应测试数据是否可行?

我有一个运行集成测试的Jenkinsfile,目前能正常工作,但测试数据是硬编码的,后续可能会变更。为了加快集成测试的并行运行速度,我已经写了一个步骤可以一次性获取所有测试数据。现在想在前置步骤中,为stage('Integration Tests')下的每个子阶段准备对应的测试数据,这需要在Jenkins流水线运行时确定并行阶段下的子阶段数量,请问这个需求可行吗?

对应的Jenkinsfile代码片段:

stage('Integration Tests'){           
    parallel {
        stage('TestGroup 1'){
            steps {
                script {
                    sh  script: 'npm run some-init-func'
                    sh  script: 'npm run newman-run-collection --collection_file="100 tests.postman_collection.json"'
                    sh  script: 'npm run newman-run-collection --collection_file="110 more tests.postman_collection.json"'
                }
            }
            post {
                always {
                    junit 'newman/*.xml'
                    archiveArtifacts artifacts: 'newman/*.html'
                }
            }
        }
        stage('TestGroup 2'){
            steps {
                script {
                    sh  script: 'npm run some-init-func'
                    sh  script: 'npm run newman-run-collection --collection_file="200 tests.postman_collection.json"'
                    sh  script: 'npm run newman-run-collection --collection_file="210 even more tests.postman_collection.json"'
                }
            }
            post {
                always {
                    junit 'newman/*.xml'
                    archiveArtifacts artifacts: 'newman/*.html'
                }
            }
        }
    }
}
解决方案
  • 完全可行,核心是把硬编码的并行阶段改成动态生成
    你当前的并行子阶段是写死的,要实现运行时确定子阶段数量并提前准备数据,需要先通过前置步骤拿到测试分组与对应数据的映射关系,再用这个映射动态生成并行阶段。

  • 具体实现步骤

    1. 前置步骤获取测试数据映射
      先执行你写的一次性获取所有测试数据的步骤,输出一个结构化的映射(比如从配置文件、API或其他数据源读取),示例:

      def testGroups = [:]
      // 实际场景中,这里替换成你的数据获取逻辑,比如读取JSON配置
      testGroups = readJSON file: 'test-groups-config.json'
      // 示例配置结构:{"TestGroup 1": ["100 tests.postman_collection.json", "110 more tests.postman_collection.json"], ...}
      

      拿到映射后,就可以直接遍历所有测试分组,为每个子阶段提前准备对应的数据:

      stage('Prepare Test Data') {
          steps {
              script {
                  testGroups.each { groupName, collections ->
                      // 为该分组执行数据准备逻辑,比如下载依赖、配置环境
                      sh "npm run prepare-test-data --group=${groupName}"
                  }
              }
          }
      }
      
    2. 动态生成并行阶段
      用testGroups映射构建并行阶段,子阶段的数量完全由映射的键数量决定:

      stage('Integration Tests') {
          parallel testGroups.collectEntries { groupName, collections ->
              [(groupName): {
                  stage(groupName) {
                      steps {
                          script {
                              sh 'npm run some-init-func'
                              collections.each { collection ->
                                  sh "npm run newman-run-collection --collection_file=\"${collection}\""
                              }
                          }
                      }
                      post {
                          always {
                              junit 'newman/*.xml'
                              archiveArtifacts artifacts: 'newman/*.html'
                          }
                      }
                  }
              }]
          }
      }
      
  • 关键优势

    • 子阶段数量完全由前置步骤的数据源决定,无需硬编码修改Jenkinsfile
    • 前置步骤可以精准遍历所有测试分组,为每个子阶段准备对应的数据
    • 后续测试分组或数据变更时,只需调整数据源(比如配置文件),流水线核心逻辑无需改动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:05:30