Jenkins - 将变量从一个阶段传递到另一个阶段中的函数

Jenkins - Pass a variable from a stage to a function inside another stage

提问人:user3146966 提问时间:11/9/2023 更新时间:11/13/2023 访问量:28

问:

在 Jenkins 中,我想将变量的值从一个阶段传递到另一个阶段的函数(在库中定义)。我使用 env 变量进行了测试,但该函数将采用变量的初始值。我的 Jenkinsfile 代码是:

@Library('shared-library')_

pipeline {
  agent any
environment {
    TF_WORK_DIR = '.'
}

stages {
    stage('Set-Environment') {
        steps {
            script {
                println("----------------------------Init Script-----------------------------")
                TF_WORK_DIR = "file"
            }}
    }

    stage('Init') {
        steps {
            script{
                    println("TF_WORK_DIR in init is ${TF_WORK_DIR}")
                    if (TF_WORK_DIR != ".") {   
                            println("TF_WORK_DIR in if condition init is ${TF_WORK_DIR}")
                            function()
                    }
                    else {
            println("TF_WORK_DIR in else condition init is ${TF_WORK_DIR}")
                        function()
                    }      
            }
        }
    }
}}

我的函数是

def call(timeoutMinutes = 10) {

try {
    echo "TF_WORK_DIR inside function ${TF_WORK_DIR}"
} catch (Exception e) {
    currentBuild.result = 'FAILURE'
    echo "An error occurred: ${e.getMessage()}\n"
}}

电流输出为

----------------------------Init Script-----------------------------
TF_WORK_DIR in TF init is file
TF_WORK_DIR in if condition TF init is file
TF_WORK_DIR inside function .

预期输出

    ----------------------------Init Script-----------------------------
    TF_WORK_DIR in init is file
    TF_WORK_DIR in if condition init is file
    TF_WORK_DIR inside function file

我还尝试在管道外部而不是环境集团内部定义变量,但它不起作用 我错过了什么吗?如何使函数取TF_WORK_DIR的更新值?

谢谢。

变量 Jenkins

评论

0赞 Dominik Gebhart 11/9/2023
不要使用环境变量将值传递给函数、使用函数参数或根据需要为全局函数。有关更改块中定义的环境变量的限制,另请参阅此内容environment

答:

0赞 Sam Kisada 11/9/2023 #1

您需要在声明性管道之外定义变量:


#library function
def myFunc(
      Map source_config = [:], 
      Map updates = [:]){
  updates.each{ k,v -> 
    source_config[k] = v
  }
  return source_config
}
def Map myMap = [:]

pipeline {
  agent any
  stages{
    stage('a'){
      steps{
        script{
          myMap.paramA = 'test'
          myMap.paramB = 'test'
        }
      }
    }
    stage('B'){
      steps{
        script{
          myMap = myFunc( myMap, [ paramA :134])
          print(myMap.paramA)
        }
      }
    }
  }
}

评论

0赞 user3146966 11/13/2023
这对我不起作用。相同的行为。
0赞 Sam Kisada 12/19/2023
@user3146966,您需要从函数中返回一些东西来更新变量。查看更新的答案
0赞 user3146966 11/13/2023 #2

最后,我更改了函数代码以接受参数,并将该变量作为参数传递。谢谢。