使用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}'
但是,这种滥用环境的行为对这项任务的影响范围很大。
5条答案
按热度按时间v09wglhw1#
若要使用可模板化的字符串(其中变量被替换为字符串),请使用双引号。
pdsfdshx2#
我添加了@佩德罗的评论作为回答,因为我认为这很重要。
对于sh env变量,我们必须使用
mhd8tkvw3#
如果需要bash脚本,则需要执行如下操作:
在全局或局部(函数)级别设置此变量,sh脚本可以从这些级别访问此变量:
在shell脚本中调用它们,如下所示
确保sh以三个引号开始和结束,如
'''
uyhoqukh4#
我想在这个讨论中加入另一个场景。我在同一个脚本中使用了shell环境变量和groovy变量。
因此,在这里,我所做的是只对shell环境变量使用$,而对groovy变量使用$。
9fkzdhlc5#
这是对@Dave Bacher答案的扩展。我在Groovy文件中运行多个shell命令,并希望将一个shell命令的输出作为groovy变量用于下一个命令。在shell命令中使用双引号,groovy将变量从一个命令传递到另一个命令,但使用单引号则无效,它返回null。
因此,请在双引号中使用如下shell命令:
sh "echo ${FOLDER_NAME}"