Jenkins 2.0パイプラインでシェルタスクを実行し、コマンドのstdout
を返すより良い方法はありますか。これを機能させる唯一の方法は、コマンドの出力をファイルにパイプしてから、ファイルを変数に読み込むことです。
sh('git config --get remote.Origin.url > GIT_URL')
def stdout = readFile('GIT_URL').trim()
これは、出力を返すための本当に悪い方法のようです。私は次のようなことができると思っていました:
def stdout = sh('git config --get remote.Origin.url').stdout
または
def exitcode = sh('git config --get remote.Origin.url').exitcode
これは可能ですか?
luka5z が言及されているように、パイプラインノードとプロセスプラグインのバージョン2.4はこの種のものをサポートするようになりました。
def stdout = sh(script: 'git config --get remote.Origin.url', returnStdout: true)
println stdout
def retstat = sh(script: 'git config --get remote.Origin.url', returnStatus: true)
println retstat
同じスクリプトで両方を返そうとすると、returnStatusがreturnStdoutを上書きしますが、これは少し残念です。
詳細については公式ドキュメントをご覧ください here
編集:さらに、失敗/不安定なビルドステータスもきめ細かく制御できます。あなたは私のコメントで例を見ることができます here
2016年6月 JENKINS-261 が正式に解決済みとしてマークされました。そのため、以下の回避策を試す前に、まずsh
およびbat
パラメーターの使用を可能にするreturnStdout
/returnStatus
の- 実装 をサポートしてみてください。
残念ながら、この機能はまだサポートされておらず、欠落しています。詳細については、公式の ticket を参照してください。
JENKINS-26133出力/ステータスを取得/返すシェルスクリプトステータス:担当者:優先度:解決策:Jesse Glick Major未解決を開く
説明
現在、shには意味のある戻り値はなく、終了ステータスがゼロでない場合は例外をスローします。整数値として終了コード(ゼロかどうか)を返すオプションがあると便利です。
def r = sh script: 'someCommand', returnStatus: true
現在の回避策:
sh 'someCommand; echo $? > status' def r = readFile('status').trim()
または、標準出力を返すようにします(Shellバックティックに似ています)。
def lines = sh(script: 'dumpStuff.sh', returnStdout: true).split("\r?\n")
回避策:
sh 'dumpStuff.sh > result' def lines = readFile('result').split("\r?\n")
または、標準入力で何かを取得するには:
sh script: 'loadStuff.sh', stdin: someText
回避策:
writeFile file: 'input', text: someText > sh 'loadStuff.sh < input'
おそらく、永続タスクでAPIを変更する必要があります。