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

Using env variables to set other variables in Jenkins pipeline as code

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

pipeline{
agent any
stages{

      stage("set env variable"){

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

              """

         }

     }



  } 
  }

ERROR: groovy.lang.MissingPropertyException: No such property: brf for class: groovy.lang.Binding

使用 jenkins 声明式管道环境变量的更简单方法是什么?

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

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

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

      }
 }

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

I cannot use environment variables set in previous blocks in access stage below.

如果仔细查看错误,您会发现 Jenkins 实际上无法访问 brf,而不是 env.city

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

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

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

要在双引号块内使用 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