jenkins 如何在声明性管道中的阶段之间共享变量

7xzttuei  于 2023-10-17  发布在  Jenkins
关注(0)|答案(2)|浏览(187)

我有以下管道(内容简化,但结构是准确的):

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_2sh块中返回正确的值,而不在外部。我也试着

  • pipeline块外部定义变量,如def my_var
  • Stage_2中定义为env.my_var = "${var_1}/${var_2}",在Stage_3中使用为${env.my_var}

但是没有一种方法可以从Stage_2.获得my_var值。那么我应该如何修复管道?

disho6za

disho6za1#

从概念上讲,Jenkins将环境变量“通过值”传递给脚本,而不是“通过引用”。如果你想在sh步骤之间持久化任何状态(在同一阶段或不同阶段中无关紧要),你有两个选择:
1.将状态信息传递回Jenkins(序列化为stdout并在Jenkins中捕获它),但牺牲了声明的纯粹性
1.将其保存在工作区的某个文件中,一般来说,这不是一个好主意,但在非常简单的情况下可以接受
选你的毒药

kiz8lqtg

kiz8lqtg2#

在您的代码中,您在环境中定义了“my_var”,但在如图所示的步骤2中,您创建了一个局部变量my_var,env.my_var和my_var之间存在差异。
要访问您的环境my_var,您需要通过以下方式在阶段中访问它:

env.my_var="something you want to do"

相关问题