web-dev-qa-db-ja.com

Jenkins 2.0 Pipelineジョブでコマンドを実行してから標準出力を返す方法

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

これは可能ですか?

20
user6253266

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

20
philbert

更新

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を変更する必要があります。

19
luka5z