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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Jenkins执行Groovy命令:“find:缺少`-exec'的参数”相关的知识,希望对你有一定的参考价值。

我试图使用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';';'

答案

使用Declarative Pipeline的Jenkins只为我工作:

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

另一答案

Groovy

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

需要将相同的方法应用于-name参数,其中应从搜索模式中删除引用。

例:

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}"

Jenkins

如果您从Jenkins和Pipeline作业运行此代码,可能最方便的方法是使用内置的sh步骤。

sh:Shell脚本

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/ ;"

有关Pipeline DSL的更多信息可以在Pipeline tutorial中找到。

Pure Groovy

毕竟为什么不用Groovy代码替换find

("src" as File).eachFileRecurse{
    if (it.name ==~ ".*\.txt") {
        ...
    }
}

那不是更优雅吗?

另一答案

我没有解决为什么命令失败但我会假设它的groovys转换为链接命令。我的解决方案是分解查找和复制命令。

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"

以上是关于通过Jenkins执行Groovy命令:“find:缺少`-exec'的参数”的主要内容,如果未能解决你的问题,请参考以下文章

通过Jenkins进行提权的一个思路

jenkins执行groovy 脚本报错

CVE-2018-1000861复现

CVE-2018-1000861复现

解决问题 WebDriverException: Message: unknown error: cannot find Chrome binary

jenkins执行shell脚本 命令被解析成两行了 导致自行不成功