GitHub Actions の shell 未指定 run は pipefail が効かない
GitHub Actions
CI/CD
shell
知識
判断
運用
GitHub Actions の Linux/macOS run step で shell を明示しない場合、実行は Bash でも bash -e 相当になり、pipefail は有効にならない。重要な処理を cmd | tee ... のようなパイプラインにすると、中段の cmd が失敗しても最後の tee が成功すれば step 全体が成功扱いになることがある。
判断基準
- パイプラインの途中に、解決処理、生成処理、検証処理、デプロイ対象の算出など、失敗を必ず検知すべきコマンドがある場合は
pipefailを有効にする。 shell: bashを明示すると GitHub Actions はbash --noprofile --norc -eo pipefail相当で実行するため、step 全体に適用しやすい。- step 内で局所的に対応するなら
run冒頭にset -o pipefailを置く。 - 出力をログ表示と後続 step 用の machine-readable output の両方に使う場合、stdout に人間向けログを混ぜると壊れやすい。stdout は構造化出力、ログは stderr に分ける設計も検討する。
検証方法
失敗するコマンドをパイプライン前段に置き、後段に成功するコマンドを置いて step が失敗するか確認する。set -o pipefail または shell: bash の追加後に同じケースで失敗扱いになれば、途中失敗の握りつぶしを防げている。