Open3

GitHub Actions の shell option

Shunsuke SuzukiShunsuke Suzuki

シェルスクリプトを書く際には set -euo pipefail のオプションをつけるのが良い。

ちなみに自分は

set -eu
set -o pipefail

と 2 つに分けて書いていたが

set -euo pipefail

とまとめて書いても良い。

GitHub Actions ではどうかというと

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell

ubuntu-latest でデフォルトでは shell: /usr/bin/bash -e {0} となっている

https://github.com/suzuki-shunsuke/test-github-action/actions/runs/5427705258/jobs/9871225309

-u と pipefail がない。

custom で設定することが出来る。

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#custom-shell

shell: bash -euo pipefail {0}

bash でも set command 同様 -euo pipefail と option を設定できる。

ただ custom の場合柔軟に fallback するのが難しいので、 composite action で使うのには若干懸念がある。
まぁ ubuntu-latest 前提とかであれば良いが、 windows や container もサポートしたいのであればよろしくないかもしれない。

workflow や job 単位でデフォルトを設定することも出来る。

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#defaultsrun

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_iddefaultsrun

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 が使われる。

Shunsuke SuzukiShunsuke Suzuki

結論

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}