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

从Jenkins管道中的shell步骤中访问Groovy变量,jenkins,jenkins-pipeline,Jenkins,Jenkins 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 } } 在Je

使用,如何从
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}'

但是,这种类型滥用了此任务的环境范围。

若要使用模板字符串,其中变量被替换为字符串,请使用双引号

sh "echo $some_var"

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

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

sh "echo \$some_var" 

为了将groovy参数传递到Jenkins管道中的bash脚本中,请使用本文,我想在此讨论中添加另一个场景。 我在同一个脚本中使用了shell环境变量和groovy变量

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

所以在这里,我所做的是只对shell环境变量使用\$,而对groovy变量使用$

如果需要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,如
'

可能的重复不完全是重复,但我认为使用正确的引号很简单。您链接的页面中给出的示例使用双引号:的确,感谢您指出这一点。应该仔细看看。。。使用双引号时,插值效果与预期一致。如果愿意,您可以添加此作为答案。对于sh env变量,我们必须执行sh“echo\$some_var”警告:使用Groovy字符串插值将秘密传递给“sh”,这是不安全的。受影响的参数使用了以下变量:[GIT_密码,GIT_用户名]有关详细信息,请参阅。