How do I pass variables between stages in a declarative Jenkins pipeline?

后端 未结 3 1781
情书的邮戳
情书的邮戳 2020-12-01 01:01

How do I pass variables between stages in a declarative pipeline?

In a scripted pipeline, I gather the procedure is to write to a temporary file, then read the file

相关标签:
3条回答
  • 2020-12-01 01:31

    If you want to use a file (since a script is the thing generating the value you need), you could use readFile as seen below. If not, use sh with the script option as seen below:

    // 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}"
          }
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-01 01:34

    Simply:

      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}"
                }
            }
      }
    
    0 讨论(0)
  • 2020-12-01 01:42

    I had a similar problem as I wanted one specific pipeline to provide variables and many other ones using it to get this variables.

    I created a my-set-env-variables pipeline

    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}]"
    }
    

    I can reuse these variables in a another pipeline 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}"
    
    }
    
    
    
    0 讨论(0)
提交回复
热议问题