私はJenkinsファイル(Groovy)でこのようなものを持っていて、後で情報を使用するために標準出力と終了コードを変数に記録したいと思います。
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}"
これらのオプションは this issueに基づいて追加されています。
sh
コマンドについては、公式の ドキュメント を参照してください。
簡単な答えはこれです:
sh "ls -l > commandResult"
result = readFile('commandResult').trim()
Sh stepの結果を得ることができるという機能要求があると思いますが、私が知る限り、現在他に選択肢はありません。
編集: JENKINS-26133
EDIT2:どのバージョンなのかよくわからないが、sh/batの手順でstdの出力を返すことができるようになった。
def output = sh returnStdout: true, script: 'ls -l'
現在のPipelineバージョンはreturnStdout
とreturnStatus
をネイティブにサポートしています。これらはsh
/bat
ステップから出力またはステータスを取得することを可能にします。
例:
def ret = sh(script: 'uname', returnStdout: true)
println ret
公式の ドキュメント 。
これはサンプルケースです。
node('master'){
stage('stage1'){
def commit = sh (returnStdout: true, script: '''echo hi
echo bye | grep -o "e"
date
echo lol''').split()
echo "${commit[-1]} "
}
}
標準出力を取得し、コマンドが成功したかどうかを知りたい場合は、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 に反して、ビルドはnotこの例外がキャッチされた場合は失敗しました。notの場合は失敗します。 _キャッチ!
更新:ShellコマンドからのSTDERR出力も必要な場合は、2つの方法が考えられます。
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では完全に異なるシェルコマンドが必要です。