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

Var*_*har 8 groovy jenkins jenkins-job-dsl jenkins-pipeline

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

pipeline{
agent any
stages{

      stage("set env variable"){

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

              """

         }

     }



  } 
  }
Run Code Online (Sandbox Code Playgroud)

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

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

小智 20

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

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

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

  • 如果你使用"double quotes",$varin sh "... $var ..."将被解释为Jenkins变量;
  • 如果使用'single quotes',$varin sh '... $var ...'将被解释为shell变量.

由于sh脚本中的代码被包装"double quotes",$brf被认为是一个Jenkins变量,而没有定义这样的变量,因此会发生错误.

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

sh "echo \$var"
Run Code Online (Sandbox Code Playgroud)

的工作方式与

sh 'echo $var'
Run Code Online (Sandbox Code Playgroud)

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

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

管道输出:

[test] Running shell script
+ brf=Houston
+ echo Houston
Houston
Run Code Online (Sandbox Code Playgroud)