2

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

4

3 に答える 3

0

グルーヴィー

発生しているエラーの問題は、実際には を使用しておらず、実行可能ファイルを実行しているときに、コマンドの\;ようにエスケープしているという事実に関連している可能性があります。bash/shbash/shfind

同じアプローチをパラメーターに適用する必要があり-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/ \;"

Pipeline DSL の詳細については、Pipeline チュートリアルを参照してください。

ピュア・グルーヴィー

結局のところ、findGroovy コードだけに置き換えてみませんか。

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

そのほうがエレガントじゃないですか?

于 2016-05-04T22:27:36.177 に答える
-1

コマンドが失敗した理由は解決しませんでしたが、コマンドをチェーンするときに 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"
于 2016-05-04T20:45:20.483 に答える