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

如何在Jenkins并行分支中识别各阶段所属分支?

解决Jenkins流水线并行任务中阶段感知分支ID的问题

你提供的Jenkins流水线代码如下:

def build_jobs = [:]
build_jobs['1'] = {
    node('builder'){
        stage('A'){
            sh 'echo 1'
            printMyStage()
        }
        stage('B'){
           printMyStage()
           "error"
        }
    }
}
build_jobs['2'] = {
    node('builder'){
        printMyStage()
        sh 'echo 2'
    }
}
build_jobs['3'] = {
    node('builder'){
        stage('A'){
            printMyStage()
            sh 'echo 3'
        }
        stage('B'){
            printMyStage()
        }
    }
}
parallel build_jobs

你希望调用printMyStage()后输出如下内容:

branch 1 stage A
branch 1 stage B
branch 2
branch 3 stage A
branch 3 stage B

解决方案

核心是把分支ID传递到每个并行任务的闭包内部,让printMyStage()能获取到分支标识和当前阶段信息,这里提供两种实现方式:

方式一:封装闭包生成逻辑(更简洁)

def build_jobs = [:]

// 封装分支任务生成逻辑,传入分支ID
def createJob(branchId) {
    return {
        node('builder') {
            // 在闭包内定义printMyStage,直接使用分支ID和内置环境变量获取阶段名
            def printMyStage() {
                def stageName = env.STAGE_NAME ?: null
                if (stageName) {
                    println "branch ${branchId} stage ${stageName}"
                } else {
                    println "branch ${branchId}"
                }
            }

            // 按分支ID执行对应任务
            if (branchId == '1') {
                stage('A') {
                    sh 'echo 1'
                    printMyStage()
                }
                stage('B') {
                    printMyStage()
                    error "模拟错误"
                }
            } else if (branchId == '2') {
                printMyStage()
                sh 'echo 2'
            } else if (branchId == '3') {
                stage('A') {
                    printMyStage()
                    sh 'echo 3'
                }
                stage('B') {
                    printMyStage()
                }
            }
        }
    }
}

// 生成各分支的并行任务
build_jobs['1'] = createJob('1')
build_jobs['2'] = createJob('2')
build_jobs['3'] = createJob('3')

parallel build_jobs

方式二:贴近原始代码结构(侵入性低)

def build_jobs = [:]

// 全局定义接收参数的printMyStage
def printMyStage(branchId, stageName = null) {
    if (stageName) {
        println "branch ${branchId} stage ${stageName}"
    } else {
        println "branch ${branchId}"
    }
}

build_jobs['1'] = {
    def branchId = '1'
    node('builder'){
        stage('A'){
            sh 'echo 1'
            printMyStage(branchId, env.STAGE_NAME)
        }
        stage('B'){
           printMyStage(branchId, env.STAGE_NAME)
           error "模拟错误"
        }
    }
}
build_jobs['2'] = {
    def branchId = '2'
    node('builder'){
        printMyStage(branchId)
        sh 'echo 2'
    }
}
build_jobs['3'] = {
    def branchId = '3'
    node('builder'){
        stage('A'){
            printMyStage(branchId, env.STAGE_NAME)
            sh 'echo 3'
        }
        stage('B'){
            printMyStage(branchId, env.STAGE_NAME)
        }
    }
}
parallel build_jobs

关键说明

  • 两种方式都利用了Jenkins流水线的内置环境变量env.STAGE_NAME来获取当前阶段的名称,没有阶段时该变量为null。
  • 核心是让每个并行任务的闭包持有对应的分支ID,确保printMyStage()能关联到正确的分支。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:45:26