通过Jenkins执行Groovy命令:" find:缺少`-exec'"的参数

时间:2016-05-04 17:35:05

标签: linux bash jenkins groovy jenkins-pipeline

我试图使用Jenkins管道脚本(groovy)将生成的war文件从一个构建目录复制到另一个构建目录。我已经在系统本身上测试了find / exec / cp命令作为jenkins用户,从脚本运行的同一工作区中运行它并且工作正常(从控制台直接复制粘贴)。

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'\;';'

3 个答案:

答案 0 :(得分:3)

带有声明性管道的Jenkins只对我有效:

sh 'find . -ipath "*src/header.h" -exec rm {} ";"'

答案 1 :(得分:0)

Groovy的

您遇到的错误问题可能与Container有关,而且您正在逃避\;命令的事实,而事实上您并未使用bash/sh,运行bash/sh可执行文件。

需要对find参数应用相同的方法,其中引用应从搜索模式中删除。

示例:

-name

詹金斯

如果从Jenkins和Pipeline作业运行此代码,最方便的方法可能是使用内置command = "find src -name *.txt -exec cp {} dst/ ;" println "[cmd] ${command}" proc = command.execute() def sout = new StringBuffer() def serr = new StringBuffer() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "[cmd.out] ${sout}" println "[cmd.err] ${serr}" 步骤。

  

sh:Shell脚本

sh
     

有关Pipeline DSL的更多信息,请参阅Pipeline tutorial

Pure Groovy

毕竟为什么不用Groovy代码替换This step allows a Jenkins server or slave running on Linux or a Unix-like machine to execute a shell script. Params: script: String - the script to execute sh "find src -name '*.txt' -exec cp {} dst/ \;"

find

这不是更优雅吗?

答案 2 :(得分:-1)

我没有解决命令失败的原因,但是当链接命令时,我将假设它的groovys转换为sh break。我的解决方案是打破查找和复制命令。

location = "find ${env.JENKINS_HOME}/jobs/myJob/builds/lastSuccessfulBuild/archive/build/libs/ -name *.war".execute().text
command = "cp $location ${packageDir}myJob.war"
proc = command.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(3000)
println "out> $sout err> $serr"