Jenkinsfile(Groovy)にこのようなものがあり、後で情報を使用するためにstdoutと終了コードを変数に記録します。
sh "ls -l"
どうすればこれを行うことができJenkinsfile
ますか?特に、内部でどんな種類のグルーヴィーなコードも実行できないようですが?
Jenkinsfile(Groovy)にこのようなものがあり、後で情報を使用するためにstdoutと終了コードを変数に記録します。
sh "ls -l"
どうすればこれを行うことができJenkinsfile
ますか?特に、内部でどんな種類のグルーヴィーなコードも実行できないようですが?
回答:
パイプラインsh
ステップの最新バージョンでは、次のことを実行できます。
// Git committer email
GIT_COMMIT_EMAIL = sh (
script: 'git --no-pager show -s --format=\'%ae\'',
returnStdout: true
).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"
別の機能はreturnStatus
オプションです。
// Test commit message for flags
BUILD_FULL = sh (
script: "git log -1 --pretty=%B | grep '\\[jenkins-full]'",
returnStatus: true
) == 0
echo "Build full flag: ${BUILD_FULL}"
これらのオプションは、この問題に基づいて追加されました。
コマンドの公式ドキュメントを参照してくださいsh
。
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
ステップブロック内でのみ機能するようです。jenkins.io/doc/book/pipeline/syntax/#declarative-steps
現在のパイプラインバージョンはreturnStdout
およびをネイティブにサポートしておりreturnStatus
、sh
/ bat
ステップから出力またはステータスを取得できます。
例:
def ret = sh(script: 'uname', returnStdout: true)
println ret
公式ドキュメント。
script { }
ステップでラップされます。
簡単な答えはこれです:
sh "ls -l > commandResult"
result = readFile('commandResult').trim()
sh stepの結果を取得するための機能リクエストはあると思いますが、私の知る限り、現在他に選択肢はありません。
EDIT2:バージョンがわからないのでよくわかりませんが、sh / batステップでstd出力を返すことができます。
def output = sh returnStdout: true, script: 'ls -l'
stdoutを取得し、コマンドが成功したかどうかを知りたい場合は、それを使用returnStdout
して例外ハンドラーでラップします。
スクリプトパイプライン
try {
// Fails with non-zero exit if dir1 does not exist
def dir1 = sh(script:'ls -la dir1', returnStdout:true).trim()
} catch (Exception ex) {
println("Unable to read dir1: ${ex}")
}
出力:
[Pipeline] sh
[Test-Pipeline] Running shell script
+ ls -la dir1
ls: cannot access dir1: No such file or directory
[Pipeline] echo
unable to read dir1: hudson.AbortException: script returned exit code 2
残念ながらhudson.AbortExceptionには、その終了ステータスを取得するための便利なメソッドがないため、実際の値が必要な場合は、メッセージから解析する必要があります(ugh!)
Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.htmlとは異なり、この例外がキャッチされてもビルドは失敗しません。それはだとき、それは失敗しないでキャッチ!
更新: シェルコマンドからのSTDERR出力も必要な場合、残念ながらJenkinsはその一般的なユースケースを適切にサポートできません。2017年のチケットJENKINS-44930は、解決策に向けて進展が見られないまま、ピンポン状態で立ち往生しています-それに賛成票を追加することを検討してください。
解決策としては、今、可能なアプローチのカップルがあるかもしれません。
a)STDERRをSTDOUTにリダイレクトします。2>&1
ただし、メイン出力からそれを解析するかどうかはユーザー次第です。例外ハンドラーにいるため、コマンドが失敗した場合は出力を取得できません。
b)STDERRを一時ファイル(前に準備した名前)にリダイレクトします(ただし、2>filename
後でファイルをクリーンアップすることを忘れないでください)。メインコードは次のようになります:
def stderrfile = 'stderr.out'
try {
def dir1 = sh(script:"ls -la dir1 2>${stderrfile}", returnStdout:true).trim()
} catch (Exception ex) {
def errmsg = readFile(stderrfile)
println("Unable to read dir1: ${ex} - ${errmsg}")
}
c)反対に設定し、returnStatus=true
代わりに設定し、例外ハンドラーを省略し、常にファイルに出力をキャプチャします。
def outfile = 'stdout.out'
def status = sh(script:"ls -la dir1 >${outfile} 2>&1", returnStatus:true)
def output = readFile(outfile).trim()
if (status == 0) {
// output is directory listing from stdout
} else {
// output is error message from stderr
}
警告:上記のコードはUnix / Linux固有です-Windowsでは完全に異なるシェルコマンドが必要です。
これはサンプルケースです。
node('master'){
stage('stage1'){
def commit = sh (returnStdout: true, script: '''echo hi
echo bye | grep -o "e"
date
echo lol''').split()
echo "${commit[-1]} "
}
}
最も簡単な方法は、この方法を使用することです
my_var=`echo 2`
echo $my_var
出力:2
単純な一重引用符が逆引用符( `)でないことに注意してください。
sh
、特にbashスクリプトに慣れていない場合は、他の人がそれをかっこいいと思うかもしれないという理由でこれらをラップする必要があることを示すことをお勧めします。私はJenkinsで試したところ、ls -l
代わりに使用echo 2
して動作します。以前はこの方法を実際に使用しましたが、信頼性が非常に低いため、代替方法を探していました。このようにして、標準のシェルでキャプチャされたより複雑なコマンドの出力を持っていますが、Jenkinsに移植されたときsh
、変数はなんらかの理由で何も保持していません。