【发布时间】:2016-09-10 04:51:23
【问题描述】:
我的管道中的一个步骤将 .tar 上传到工件服务器。传入 env.BUILD_NUMBER 时出现错误替换错误,但是当数字被硬编码时,相同的命令有效。该脚本是通过jenkins 用groovy 编写的,在jenkins 工作区中运行。
sh 'curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar"'
返回错误:
[Pipeline] sh
[Package_Deploy_Pipeline] Running shell script
/var/lib/jenkins/workspace/Package_Deploy_Pipeline@tmp/durable-4c8b7958/script.sh: 2:
/var/lib/jenkins/workspace/Package_Deploy_Pipeline@tmp/durable-4c8b7958/script.sh: Bad substitution
[Pipeline] } //node
[Pipeline] Allocate node : End
[Pipeline] End of Pipeline
ERROR: script returned exit code 2
如果在内部版本号中硬编码并换出${env.BUILD_NUMBER},我不会收到任何错误并且代码运行成功。
sh 'curl -v --user user:password --data-binary ${buildDir}package113.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package113.tar"'
我在同一脚本的其他 sh 命令中使用 ${env.BUILD_NUMBER},在其他任何地方都没有问题。
【问题讨论】:
-
我的猜测是
${env.BUILD_NUMBER}在其他实例中实际被 shell 看到之前被预处理步骤所取代。sh本身将其视为错误是正确的。 -
在此行之前的同一函数中,我使用 ${env.BUILD_NUMBER} 以完全相同的方式上传到 Google 存储,这没有给我任何问题。编辑:我还制作了一个虚拟变量并将其设置为一个数字,然后传入变量并得到同样的问题。
-
您很可能在整个 mrhaki.blogspot.com.au/2009/08/… 周围使用了错误的引号。此外,您不需要引用 curl 的 URL。所以也许在整个事情周围使用双引号将可以在没有任何单引号的情况下使用
-
请显示使用
${env.BUILD_NUMER}没有问题的确切代码,因为错误是此类参数扩展的预期行为。 -
你带我走上正确的道路,是单引号阻止了 env.BUILD_NUMBER 传递它的值。
标签: bash jenkins groovy jenkins-pipeline