从Jenkins管道中的shell步骤中访问Groovy变量

Dir*_*irk 28 jenkins jenkins-pipeline

使用Jenkins 2.x中Pipeline插件,如何在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
    }
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

可以看出,echosh步骤中打印一个空字符串.

解决方法是通过环境范围定义变量

env.some_var = 'Hello World'
Run Code Online (Sandbox Code Playgroud)

并通过打印

sh 'echo ${env.some_var}'
Run Code Online (Sandbox Code Playgroud)

但是,这种滥用这项任务的环境范围.

Dav*_*her 37

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

sh "echo $some_var"
Run Code Online (Sandbox Code Playgroud)

  • 如何在多行sh代码中使用它? (7认同)
  • 对于sh env vars,我们必须做sh"echo\$ some_var" (6认同)
  • @htzfun使用高音双引号"""一些代码""" (4认同)
  • 警告:使用 Groovy 字符串插值将秘密传递给“sh”,这是不安全的。受影响的参数使用以下变量:[GIT_PASSWORD, GIT_USERNAME] 有关详细信息,请参阅 https://jenkins.io/redirect/groovy-string-interpolation。 (3认同)

Pra*_*sad 10

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

对于sh env vars,我们必须使用

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


Shu*_*ain 10

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

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

def stageOneWorkSpace = "/path/test1"
def stageTwoWorkSpace = "/path/test2"
Run Code Online (Sandbox Code Playgroud)

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

sh '''
echo ''' +stageOneWorkSpace+ '''
echo ''' +stageTwoWorkSpace+ '''
cp -r ''' +stageOneWorkSpace+'''/qa/folder1/* ''' +stageOneWorkSpace+'''/qa/folder2
'''
Run Code Online (Sandbox Code Playgroud)

确保 sh 以三个引号开头和结尾,例如'''