【问题标题】:Access a Groovy variable from within shell step in Jenkins pipeline从 Jenkins 管道的 shell 步骤中访问 Groovy 变量
【发布时间】:2021-07-07 15:20:59
【问题描述】:

使用Pipeline plugin in Jenkins 2.x,如何从sh 步骤中访问在阶段或节点级别某处定义的Groovy 变量?

简单示例:

node {
    stage('Test Stage') {
        some_var = 'Hello World' // this is Groovy
        echo some_var // printing via Groovy works
        sh 'echo $some_var' // printing in shell does not work
    }
}

在 Jenkins 输出页面上提供以下内容:

[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test Stage)
[Pipeline] echo
Hello World
[Pipeline] sh
[test] Running shell script
+ echo

[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

正如我们所见,sh 步骤中的echo 打印一个空字符串。

解决方法是通过

在环境范围内定义变量
env.some_var = 'Hello World'

并通过

打印出来
sh 'echo ${env.some_var}'

但是,这种方式滥用了该任务的环境范围。

【问题讨论】:

标签: jenkins jenkins-pipeline


【解决方案1】:

要使用可将变量替换为字符串的模板字符串,请使用双引号。

sh "echo $some_var"

【讨论】:

  • 对于 sh 环境变量,我们必须执行 sh "echo \$some_var"
  • 警告:使用 Groovy 字符串插值将秘密传递给“sh”,这是不安全的。受影响的参数使用了以下变量:[GIT_PASSWORD, GIT_USERNAME] 有关详细信息,请参阅 jenkins.io/redirect/groovy-string-interpolation
  • 在我设法修复它之前,我一直在研究管道脚本很长时间......您的回复是解决方案的一部分,谢谢您,先生! :)
【解决方案2】:

我添加来自@Pedro 的评论作为答案,因为我认为这很重要。

对于 sh 环境变量,我们必须使用

sh "echo \$some_var" 

【讨论】:

  • 或者简单地说:sh 'echo $some_var'
  • 这个解决方案对我不起作用,只有@dave-bacher 发布的解决方案对我有用
【解决方案3】:

如果需要 bash 脚本,您需要执行以下操作:

在全局或本地(函数)级别设置此变量,其中 sh 脚本可以访问这些变量:

def stageOneWorkSpace = "/path/test1"
def stageTwoWorkSpace = "/path/test2"

在 shell 脚本中像下面这样调用它们

sh '''
echo ''' +stageOneWorkSpace+ '''
echo ''' +stageTwoWorkSpace+ '''
cp -r ''' +stageOneWorkSpace+'''/qa/folder1/* ''' +stageOneWorkSpace+'''/qa/folder2
'''

确保 sh 以 ''' 之类的三个引号开始和结束

【讨论】:

    【解决方案4】:

    我想在这个讨论中添加另一个场景。 我在同一个脚本中使用了 shell 环境变量和 groovy 变量。

     format='html'
        for file in *.txt; 
            do mv  -- "\$file" "\${file%.txt}.$format";
        done
    

    所以在这里,我所做的只是将 \$ 用于 shell 环境变量,并将 $ 用于常规变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2017-03-30
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多