如何在声明性Jenkins管道的各个阶段之间传递变量?


80

如何在声明式管道的各个阶段之间传递变量?

在脚本化管道中,我收集的过程是写入一个临时文件,然后将该文件读入一个变量。

如何在声明管道中执行此操作?

例如,我想基于shell动作创建的变量来触发其他作业的构建。

stage("stage 1") {
    steps {
        sh "do_something > var.txt"
        // I want to get var.txt into VAR
    }
}
stage("stage 2") {
    steps {
        build job: "job2", parameters[string(name: "var", value: "${VAR})]
    }
}

对于读写部分,有shash / unstash btw。
sebkraemer

1
使用像全局变量那样的环境变量呢?
Veverke '18

Answers:


96

如果要使用文件(因为脚本是生成所需值的东西),则可以readFile如下所示使用。如果没有,请使用如下所示shscript选项:

// Define a groovy global variable, myVar.
// A local, def myVar = 'initial_value', didn't work for me.
// Your mileage may vary.
// Defining the variable here maybe adds a bit of clarity,
// showing that it is intended to be used across multiple stages.
myVar = 'initial_value'

pipeline {
  agent { label 'docker' }
  stages {
    stage('one') {
      steps {
        echo "${myVar}" // prints 'initial_value'
        sh 'echo hotness > myfile.txt'
        script {
          // OPTION 1: set variable by reading from file.
          // FYI, trim removes leading and trailing whitespace from the string
          myVar = readFile('myfile.txt').trim()

          // OPTION 2: set variable by grabbing output from script
          myVar = sh(script: 'echo hotness', returnStdout: true).trim()
        }
        echo "${myVar}" // prints 'hotness'
      }
    }
    stage('two') {
      steps {
        echo "${myVar}" // prints 'hotness'
      }
    }
    // this stage is skipped due to the when expression, so nothing is printed
    stage('three') {
      when {
        expression { myVar != 'hotness' }
      }
      steps {
        echo "three: ${myVar}"
      }
    }
  }
}

1
你也可以只使用def myVar与以后使用它echo ${myVar});如果你想有你的配置在文件的顶部
bastianwegge

4
写入文件是否非常有害并且还会创建不需要的磁盘?
Dirkos

4
您是正确的@Dirkos,但是有一种更好的方法来实现所请求的内容而不涉及文件读/写。看到这个答案stackoverflow.com/a/43881731/1053510
user1053510

1
我正在从另一个答案中重新发布我的评论,但我建议withEnv在第二阶段使用包装器,以便可以在中使用变量sh。否则,它将打印一个空字符串。至少它与Jenkins 2.124兼容。
塞尔吉奥

1
@ConradB,只要您在并行阶段之前设置变量(在上面的示例中,阶段“三”是您需要并行执行的工作),在此处使用该技术就应该可以正常工作。
Burnettk

17

只是:

  pipeline {
        parameters {
            string(name: 'custom_var', defaultValue: '')
        }

        stage("make param global") {
             steps {
               tmp_param =  sh (script: 'most amazing shell command', returnStdout: true).trim()
               env.custom_var = tmp_param
              }
        }
        stage("test if param was saved") {
            steps {
              echo "${env.custom_var}"
            }
        }
  }

根据@KatieS指向的文档,在参数{}块中定义的参数以$ {params.custom_var}而不是$ {env.custom_var}的形式访问。两者都起作用,但是是一个不同的变量,可以包含不同的值。但是您的参数为{} bloc的解决方案对我通过$ {params.custom_var}访问它们的效果很好
马丁,

4
我错了。parameters {}用于所提供的已使用参数,并且似乎是不可变的,尝试在管道中进行设置(除了在parameter {}中为它们分配默认值)将使该阶段失败而没有任何错误消息。因此,env.custom_var是必经之路。在这种情况下,可以忽略parameter {}块。
马丁

跨多个Jenkins文件工作吗?我想做的是从build.JenksinsFile传递回购的最新提交到deploy.JenkinsFile?
Gurpreet Singh Drish

无论如何要在参数中插入$ {workspace}之类的东西?例如string(name:'custom_var',defaultValue:“ $ {workspace} / a”)
yuxh

2
不知道这将如何工作。我认为您无需使用“脚本”步骤就可以直接在“步骤”块中设置变量。
阿纳卜

5

我遇到了类似的问题,因为我希望一个特定的管道提供变量,而其他许多管道则使用它来获取此变量。

我创建了一个my-set-env-variables管道

script
{
    env.my_dev_version = "0.0.4-SNAPSHOT"
    env.my_qa_version  = "0.0.4-SNAPSHOT"
    env.my_pp_version  = "0.0.2"
    env.my_prd_version = "0.0.2"
    echo " My versions  [DEV:${env.my_dev_version}] [QA:${env.my_qa_version}] [PP:${env.my_pp_version}] [PRD:${env.my_prd_version}]"
}

我可以在另一个管道my-set-env-variables-test中重用这些变量

script 
{
    env.dev_version = "NOT DEFINED DEV"
    env.qa_version  = "NOT DEFINED QA"
    env.pp_version  = "NOT DEFINED PP"
    env.prd_version = "NOT DEFINED PRD"
}

stage('inject variables') {

    echo "PRE DEV version = ${env.dev_version}"
    script 
    {
       def variables = build job: 'my-set-env-variables'
       def vars = variables.getBuildVariables()
      //println "found variables" + vars
      env.dev_version = vars.my_dev_version
      env.qa_version  = vars.my_qa_version
      env.pp_version  = vars.my_pp_version
      env.prd_version = vars.my_prd_version
    }
}

stage('next job') {
    echo "NEXT JOB DEV version = ${env.dev_version}"
    echo "NEXT JOB QA version = ${env.qa_version}"
    echo "NEXT JOB PP version = ${env.pp_version}"
    echo "NEXT JOB PRD version = ${env.prd_version}"

}


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.