簡體   English   中英

通過 Jenkins 執行 Groovy 命令:“查找:缺少‘-exec’的參數”

[英]Executing Groovy command through Jenkins: "find: missing argument to `-exec'"

我正在嘗試使用 Jenkins 管道腳本(groovy)將生成的 war 文件從一個構建目錄復制到另一個目錄。 我已經作為 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' , \\; ';'

帶有聲明式管道的Jenkins 只對我有用:

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

常規

您遇到的錯誤的問題可能與\\; 以及您正在逃避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 和 Pipeline 作業運行此代碼,可能最方便的方法是使用內置的sh步驟。

sh:外殼腳本

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

更多關於流水線 DSL 的信息可以在流水線教程中找到。

純 Groovy

畢竟為什么不只用 Groovy 代碼替換find

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

那不是更優雅嗎?

我沒有解決命令失敗的原因,但我將在鏈接命令時假設它的 groovys 轉換為 sh 中斷。 我的解決方案是分解查找和復制命令。

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM