【发布时间】:2016-05-04 17:35:05
【问题描述】:
我正在尝试使用 Jenkins 管道脚本 (groovy) 将生成的战争文件从一个构建目录复制到另一个。我已经以 jenkins 用户身份在系统本身上测试了 find/exec/cp 命令,从与脚本运行相同的工作区,它工作正常(直接从控制台复制粘贴)。
String buildNumber = env.BUILD_NUMBER
def sout = new StringBuffer()
def serr = new StringBuffer()
//Create package directory in jenkins job folder
def packageDir = "${env.JENKINS_HOME}/jobs/Package_Deploy_Pipeline/builds/${buildNumber}/package/"
def command = "mkdir ${packageDir}"
def proc = command.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(3000)
println "out> $sout err> $serr"
command = "find ${env.JENKINS_HOME}/jobs/myJob/builds/lastSuccessfulBuild/archive/build/libs/ -name *.war -exec cp {} ${packageDir} \\;"
println command
proc = command.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(3000)
println "out> $sout err> $serr"
在控制台输出中看到的错误是:
[Pipeline] echo
out> err>
[Pipeline] echo
find /var/lib/jenkins/jobs/myJob/builds/lastSuccessfulBuild/archive/build/libs/ -name *.war -exec cp {} /var/lib/jenkins/jobs/Package_Deploy_Pipeline/builds/23/package/ \;
[Pipeline] echo
out> err> find: missing argument to `-exec'
编辑:我也试过"*.war"、'*.war'、\;和';'
【问题讨论】:
-
当前目录下是否有
.war文件?这样*.war可能会被shell 覆盖?引用这个论点有帮助吗? (我不认为这会是这里的问题,但它可能会是一个潜在的问题,无论如何你都应该解决。)(在该命令中扩展${env.JENKINS_HOME}是什么?)再次转义;有帮助吗? -
唯一的 .war 在 cp 源目录中。我确实尝试单引号'* .war'并得到相同的结果。 ${env.JENKINS_HOME} 扩展到 /var/lib/jenkins/ 我从控制台输出中知道它是正确的。我不知道你说的再次逃跑是什么意思,你能详细说明一下吗?
-
这通常与问题无关,但
env.JENKINS_HOME不是有效的 shell 变量。外壳不能扩展它。那么这是做什么的呢?通过再次转义它,我的意思是,执行命令的任何内容都可能是从\;中删除反斜杠,您应该尝试将\\;放入命令字符串中作为测试。 -
啊。上面的代码是 groovy 代码。所以 ${} 在常规代码中得到扩展。我发布的控制台输出中显示的是实际收到的 shell 命令。这就是我在服务器上手动验证的。
-
如果您在服务器上手动运行该打印命令,它是否有效?因为它看起来不错。
标签: linux bash jenkins groovy jenkins-pipeline