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

如何在声明式流水线的Jenkinsfile中设置环境变量

你提供的写法是不正确的。
原因:Jenkins 中每个 sh 步骤都会启动独立的 Shell 子进程,进程退出后内部定义的临时变量会被销毁,第二个 sh 步骤运行在全新的进程上下文,无法读取前一步设置的 MY_ENV_VAR,最终执行脚本时传入的是空值。

方法1:同一sh步骤内定义并使用变量

把变量定义和使用逻辑放在同一个sh块中,共享同一个Shell进程即可生效:

stage("build_my_code") {
    steps {
        sh '''
            MY_ENV_VAR="some_value"
            ./my_script.sh $MY_ENV_VAR
        '''
    }
}

使用三个单引号包裹多段Shell命令,可以避免额外的转义操作。

方法2:通过environment块定义全局/阶段级环境变量

如果需要变量在整个流水线、或当前Stage的所有步骤中都可以被访问,可以声明在environment块中:

  • 定义在pipeline根块下的environment:全流水线所有Stage都可以访问
  • 定义在单个stage块下的environment:仅当前Stage的步骤可以访问

示例(Stage级环境变量):

stage("build_my_code") {
    environment {
        MY_ENV_VAR = "some_value"
    }
    steps {
        // 所有当前Stage的sh步骤都可以直接读取该变量
        sh './my_script.sh $MY_ENV_VAR'
        sh 'echo $MY_ENV_VAR'
        // 也可以通过env对象在Jenkinsfile中读取
        echo "读取变量值:${env.MY_ENV_VAR}"
    }
}
方法3:动态生成变量传递到后续步骤

如果变量值需要通过Shell命令动态生成(比如获取Git commit哈希、生成时间戳等),可以通过sh步骤的returnStdout参数捕获输出,再传递到后续步骤使用:

stage("build_my_code") {
    steps {
        script {
            // trim()用于去除命令输出末尾默认的换行符
            MY_DYNAMIC_VAR = sh(script: 'date +%Y%m%d', returnStdout: true).trim()
        }
        sh "echo 动态生成的变量值为 ${MY_DYNAMIC_VAR}"
        sh "./my_script.sh ${MY_DYNAMIC_VAR}"
    }
}

动态生成的变量也可以直接放在environment块中定义,作用范围和普通环境变量一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:06:04