从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_用户名]有关详细信息,请参阅。