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

使用env变量将Jenkins管道中的其他变量设置为代码,jenkins,groovy,jenkins-pipeline,jenkins-job-dsl,Jenkins,Groovy,Jenkins Pipeline,Jenkins Job Dsl,我不能在下面的访问阶段中使用前面的块中设置的环境变量 pipeline{ agent any stages{ stage("set env variable"){ steps{ script{ env.city = "Houston" } } } } stage("access"){ steps{ sh ""

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

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:类:groovy.lang.Binding没有这样的属性:brf


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

使用以下代码获取变量应该不会有任何问题:

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

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

      }
 }
我想这是你问的,但如果你还有疑问,请告诉我

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

pipeline{
agent any
stages{

      stage("set env variable"){

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

              """

         }

     }



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

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

  • 如果使用
    “双引号”
    sh中的
    $var
    “…$var…”
    将被解释为Jenkins变量
  • 如果您在
    sh'中使用
    “单引号”
    $var
    $var…“
    将被解释为shell变量
由于脚本中的
sh
代码用
双引号“
包装,
$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

这似乎是
csh
(C shell)代码,而不是更标准的
sh
(Bourne shell/dash)或
bash
。我认为示例的第一部分不起作用,因为
brf
变量是在shell进程中设置的,而Jenkins内置的
echo
无法访问该变量。如果在管道{environment{city=“Houston..中设置该变量,则sh'echo$city'和sh'echo$city'都会起作用(Jenkins 2.150)在Jenkins中混合shell和groovy变量时的惊人解释。这节省了我的时间。谢谢。如果使用sh“”代码,我们可以在shell之外访问变量brf吗"?我尝试过做同样的事情,它按预期工作,但只有当我尝试从不同阶段访问该变量时,它才无法找到它,即使我将其设置为env变量。有人知道吗?谢谢你对引号和双引号的解释…非常非常非常important@honorius非常简单的问题如果我们想访问ss单引号内的jenkins变量是否有方法也可以逃避?