GitHub Actions の shell option
シェルスクリプトを書く際には set -euo pipefail
のオプションをつけるのが良い。
ちなみに自分は
set -eu
set -o pipefail
と 2 つに分けて書いていたが
set -euo pipefail
とまとめて書いても良い。
GitHub Actions ではどうかというと
ubuntu-latest でデフォルトでは shell: /usr/bin/bash -e {0}
となっている
-u と pipefail がない。
custom で設定することが出来る。
shell: bash -euo pipefail {0}
bash でも set command 同様 -euo pipefail
と option を設定できる。
ただ custom の場合柔軟に fallback するのが難しいので、 composite action で使うのには若干懸念がある。
まぁ ubuntu-latest 前提とかであれば良いが、 windows や container もサポートしたいのであればよろしくないかもしれない。
workflow や job 単位でデフォルトを設定することも出来る。
composite action では自分はこれまで基本 shell: bash
としてきた。
これの shell option については今まで特にきにしていなかったが、
bash --noprofile --norc -eo pipefail {0}
となっていて、 -u
がない。
なので run
step で set -u
とするか、 shell
option を変更するのが良い。
The default shell on non-Windows platforms with a fallback to sh. When specifying a bash shell on Windows, the bash shell included with Git for Windows is used.
windows 以外では bash がなかった場合 sh sh -e {0}
にフォールバックされる。
windows では Git for Windows の bash が使われる。
結論
ubuntu-latest 前提の workflow であれば
defaults:
run:
shell: bash -euo pipefail {0}
composite action では container で bash がない可能性を考えると run step で set -euo pipefail
を実行するのが良い。 sh (例えば alpine であれば ash) で set -euo pipefail
が効くのかは shell 依存な気がしてよくわからない。
run: |
set -euo pipefail
bash はある前提ならば
shell: bash -euo pipefail {0}
alpine の sh で試したところ、 set -euo pipefail
は有効だった
sh -euo pipefail
も有効だった