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

如何在Declarative Pipeline各阶段(含并行阶段)间共享变量?

问题描述

我有如下流水线(内容已简化,但结构完全一致):

pipeline {
    agent any
    environment {
                    my_var = ""
                }
    stages {
        stage('Stage_parallel'){
            parallel{
                stage('Stage_1') {
                    steps {
                        ...
                    }
                }
                stage('Stage_2'){
                    steps {
                        withCredentials([usernamePassword(<LOGIN>, <PASS>)])
                        {
                            sh'''
                                  ...
                                  var_1 = "/path/to/folder"
                                  var_2 = "file_name"
                                  my_var = "${var_1}/${var_2}"
                                  echo ${my_var} ### returns correct value
                            '''
                        }}}}}
        stage('Stage_3'){
            steps {
                sh 'echo ${my_var}' ### returns ""
            }}}}

尝试声明全局变量,在Stage_2中更新它并在Stage_3中使用,但该变量仅在Stage_2的sh块中能输出正确值,外部则不行。还尝试过:

  • 在pipeline块外定义def my_var
  • 在Stage_2中以env.my_var = "${var_1}/${var_2}"赋值,在Stage_3中以${env.my_var}调用
    但这些方法都无法让Stage_3获取到Stage_2设置的my_var值,请问该如何修复这条流水线?
修复方案

核心问题是Shell脚本块(sh)和Jenkins流水线的变量空间完全隔离:你在sh里定义的my_var只是Shell进程内的局部变量,根本无法直接同步到Jenkins的环境变量或全局变量中。另外,并行阶段的执行特性也会影响变量传递,但这里主要问题出在Shell和流水线的变量隔离上。

具体修复步骤:

  1. 从Shell中输出变量值,再让Jenkins捕获
    在Stage_2的sh块末尾把需要传递的变量值打印出来,用sh的returnStdout参数捕获输出,再赋值给Jenkins的环境变量:
    stage('Stage_2'){
        steps {
            withCredentials([usernamePassword(<LOGIN>, <PASS>)])
            {
                script {
                    // 执行Shell并捕获输出
                    def shellOutput = sh(
                        script: '''
                            var_1="/path/to/folder"
                            var_2="file_name"
                            echo "${var_1}/${var_2}"
                        ''',
                        returnStdout: true
                    ).trim() // 去除输出中的换行和多余空格
                    // 赋值给Jenkins环境变量
                    env.my_var = shellOutput
                }
            }
        }
    }
    
  2. 在Stage_3中直接调用环境变量
    此时Stage_3里直接使用${env.my_var}就能拿到正确值:
    stage('Stage_3'){
        steps {
            sh "echo ${env.my_var}"
        }
    }
    

额外注意事项:

  • 不要在pipeline外定义def my_var,因为Jenkins并行阶段可能运行在不同代理节点上,这类局部变量无法跨节点共享,而env.*环境变量会被Jenkins自动同步到后续所有阶段。
  • 如果并行阶段有多个分支都更新env.my_var,最终值取决于哪个分支先执行完成,要根据业务逻辑确保变量更新的唯一性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:43:12