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

如何在Jenkins中将shell命令执行结果作为环境变量传递到流水线阶段

错误原因

你遇到的问题是两个常见的Jenkins流水线使用误区共同导致的:

  1. 直接在environment块中用反引号包裹命令的写法不会被Jenkins识别为shell执行逻辑,只会被当成普通字符串处理,无法获取命令执行结果
  2. 后续sh步骤使用三重单引号'''包裹脚本时,Jenkins默认不会对${CURRENT_COMMIT_HASH}做变量插值,只会将其识别为shell本地变量,shell层面没有对应定义就会输出为空

正确实现方案

方案1:定义全局环境变量(所有阶段可用)

在顶层environment块中使用Jenkins内置的sh方法,指定returnStdout: true获取命令执行的标准输出,加.trim()去掉末尾默认携带的换行符,避免多余空白:

pipeline {
    agent any
    // 先完成代码拉取,确保git命令能正常执行,此处省略checkout相关逻辑
    environment {
        CURRENT_COMMIT_HASH = sh(
            returnStdout: true,
            script: 'git rev-parse HEAD'
        ).trim()
    }
    stages {
        stage ('Issues Report') {
            steps {
                // 写法1:用三重双引号,由Jenkins提前完成变量插值
                sh """
                echo "${CURRENT_COMMIT_HASH}"
                """
                // 写法2:用三重单引号,由shell读取Jenkins注入的全局环境变量
                sh '''
                echo "$CURRENT_COMMIT_HASH"
                '''
            }
        }
    }
}

方案2:定义阶段专属环境变量(仅当前阶段可用)

如果不需要全局使用该变量,可直接在目标阶段的environment块中定义,减少变量污染:

pipeline {
    agent any
    stages {
        stage ('Issues Report') {
            environment {
                CURRENT_COMMIT_HASH = sh(
                    returnStdout: true,
                    script: 'git rev-parse HEAD'
                ).trim()
            }
            steps {
                sh '''
                echo "$CURRENT_COMMIT_HASH"
                '''
            }
        }
    }
}

动态赋值方案

如果需要在步骤执行过程中动态生成变量,可直接修改env全局对象:

steps {
    script {
        env.CURRENT_COMMIT_HASH = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
    }
    sh 'echo "$CURRENT_COMMIT_HASH"'
}

注意事项

执行git rev-parse HEAD前要确保流水线已经完成代码拉取操作,比如已经执行过checkout scm步骤,否则git命令会因找不到代码仓库返回异常值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:06:03