5 つのスクリプトを実行するパイプライン ジョブを含む azure-pipeline yaml 構成をセットアップしました。各スクリプトの構成では、フラグfailOnStderr
が に設定されていますtrue
。スクリプトは正常に実行されますが、ステージは次の出力で失敗します。
##[error]Bash wrote one or more lines to the standard error stream.
詳細表示を有効にしてsystem.debug
、次のような詳細情報を取得しました。
##[debug]Exit code 0 received from tool '/bin/bash'
##[debug]STDIO streams have closed for tool '/bin/bash'
##[error]Bash wrote one or more lines to the standard error stream.
##[debug]Processed: ##vso[task.issue type=error;]Bash wrote one or more lines to the standard error stream.
##[debug]task result: Failed
##[debug]Processed: ##vso[task.complete result=Failed;done=true;]
以下の質問があります:
- 終了コード 0 がエラーとして解釈されるのはなぜですか?
- 私たちの理由により、舞台裏で何か他のものが標準エラーに送信されていますか?
- azure-pipelines によって提供される構成以外で、コミュニティが推奨する解決策/回避策は何ですか? シェルを使用することもできます
trap
が、スクリプト全体の定型文を削減できるものを見つけたいと思っていました。
答え1
私も問題を抱えておりfailOnStderr
、次のことに気付きました。
failOnStderr
私はそうすべきだと思うのみ0 を返すがそれでも失敗する壊れたアプリケーションを処理し、その失敗の理由を stdout に書き込むために使用されます。
あなたの場合、エラー メッセージには##[error]Bash wrote one or more lines to the standard error stream.
少なくともステップが失敗した理由が示されています。
私の場合、エラー メッセージには、##[error]Script failed with error: Error: /bin/bash failed with return code: 0
stderr に発行されたログ メッセージ (エラーではない) が原因で実際に失敗したという事実さえ記載されていませんでした。
それで
- そうではありません。stderrに何かが書き込まれた場合に失敗するように指定したため失敗しますが、その場合のようです。
- 一部のプログラムはログメッセージをstderrに書き込みます(例えば、
az --version
古い場合はstderrに警告を発します) - 最も簡単な解決策は次のとおりだと思います。
- スクリプトが終了コード0で失敗する壊れたアプリケーションを使用しない場合は、フラグを使用しないでください
failOnStderr
。 - を使用する必要がある場合、または引き続き使用したい場合は
failOnStderr
、ログメッセージを書き込むコマンドのstderrをstderrにリダイレクトします(2 > /dev/null
)
- スクリプトが終了コード0で失敗する壊れたアプリケーションを使用しない場合は、フラグを使用しないでください