将variables传递给jenkinspipe道作业中的bash脚本

我有一个Jenkinspipe道作业,在其中使用名为setup.sh的bash脚本configuration我的环境,如下所示:

#!/bin/bash export ARCH=$1 echo "architecture = " ${ARCH} 

在Jenkinspipe道脚本中,使用以下命令调用setup.sh脚本:

 def lib_arch='linux-ubuntu-14.04-x86_64-gcc4.8.4' sh ". /opt/setup.sh ${lib_arch}" 

不幸的是,似乎没有variables传递给setup.sh脚本,并且echo $ {ARCH}返回一个空string! 我试图做,而不是:sh“源/opt/setup.sh $ {lib_arch}”,这与“源找不到”消息以及失败。 我也尝试改变我的脚本的第一行

 #!/bin/sh 

但它没有帮助。 那么我怎样才能将一个parameter passing给我的bash脚本在jenkinspipe道脚本? 谢谢你的帮助。

更新:Bert Jan Schrijve在此线程中提出了一个解决方法(见下文):

 sh "bash -c \" source /opt/setup.sh ${lib_arch}\"" 

下面的例子工作:

 void updateApplicationVersionMaven(String version) { sh "mvn -B versions:set -DnewVersion=$version" } 

和一个完整的管道脚本(在Jenkins 2.7.3上测试):

 node { stage('test') { def testVar='foo' sh "echo $testVar" } } 

编辑(在评论后):啊,测试一些,可能会重现这个问题。 这是因为你正在用“./opt/setup.sh”来获取脚本。 这影响了shell的环境,在这种情况下打破了Jenkins的可变注入。 有趣。

编辑2(在评论之后):我相信这是使用默认外壳(由詹金斯或由操作系统)的问题。 我可以从注释中重现问题,并能够通过明确地使用bash作为shell来解决它:

 def testVar='foo3' sh "bash -c \". /var/jenkins_home/test.sh $testVar && echo \$ARCH\"" 

最后一个echo现在回显testVar的内容,它作为参数传递给脚本,随后由脚本设置为环境变量。

请尝试删除脚本中的大括号。

 export ARCH=$1 echo "architecture = " $ARCH 

在詹金斯外壳:

 def lib_arch='linux-ubuntu-14.04-x86_64-gcc4.8.4' sh ". /opt/setup.sh" $lib_arch