使用env变量将Jenkins管道中的其他变量设置为代码

时间:2017-12-27 22:21:00

标签: jenkins groovy jenkins-pipeline jenkins-job-dsl

我不能在下面的访问阶段使用先前块中设置的环境变量。

pipeline{
agent any
stages{

      stage("set env variable"){

      steps{
           script{
             env.city = "Houston"
             }
          }
       } 
     }
     stage("access"){
     steps{
           sh """
              set brf = ${env.city}
              echo $brf

              """

         }

     }



  } 
  }
  

错误:groovy.lang.MissingPropertyException:没有这样的属性:brf for class:groovy.lang.Binding

使用jenkins声明性管道env变量的简单方法是什么?

2 个答案:

答案 0 :(得分:13)

  

我不能在下面的访问阶段使用先前块中设置的环境变量。

如果仔细查看错误,可以看到Jenkins实际上无法访问brf,而不是env.city

这里的问题是由Jenkins解释$var块内sh的方式引起的:

  • 如果您使用"double quotes"$var中的sh "... $var ..."将被解释为Jenkins变量;
  • 如果您使用'single quotes'$var中的sh '... $var ...'将被解释为shell变量。

由于脚本中的sh代码包含在"double quotes"中,$brf被认为是Jenkins变量,而没有定义此类变量,因此会发生错误。< / p>

要在双引号块中使用shell变量,请在\之前添加$

sh "echo \$var"

的工作方式与

相同
sh 'echo $var'

这应该修复你的管道脚本:

pipeline{
    agent any
    stages{
        stage("set env variable"){
            steps{
                script{
                    env.city = "Houston"
                }
            }
        }
        stage("access"){
            steps{
                sh """
                    brf=${env.city}
                    echo \$brf
                """
            }
        }
    }
}

管道输出:

[test] Running shell script
+ brf=Houston
+ echo Houston
Houston

答案 1 :(得分:-2)

使用此代码获取变量应该没有任何问题:

 stage("access"){
     steps{
           sh "set brf = ${env.city}"
           echo '$brf'

      //or 
      sh "set brf = ${env.city} && echo $brf"

      }
 }

我认为这就是你所问的问题,但如果你有其他疑问,请告诉我。