shell
を指定しない場合
GitHub Actionsではshell
で実行シェルを変更することができ、
python
などを指定してpythonスクリプトを実行することも可能です。
何も指定しないとシェルスクリプトになりますが、 自分もそうでしたが、なんとなく、で使っていることが多いかと。
何も指定しない場合、LinuxやmacOSの環境では
1
bash -e
にコマンドが渡される形になります。
(bash
がない場合はsh
を指定する。)
したがって複数のコマンドを渡した場合にも途中のコマンドで失敗するとそこで終了するようになっています。
shell: bash
とした場合
何も指定しないとbash
になりますが、bash
と指定することも出来ます。
ただし、この場合にはオプションが変更され、
1
|
|
になります。
noprofile
やnorc
はもし環境に特殊なPATHの設定とかを入れてbashrcとかで読み込むようなことを
してる場合にはshell
にbash
を渡す場合とそうでない場合で実行環境が変わる可能性があるので注意ですが、
GitHub Actionsではあまりあるケースではないかと思います。
一方で、最後の-o pipefail
が追加されているところが注意。
-e
を指定しているときでも-o pipefail
がなければパイプの前で失敗した場合には
その後ろのコマンドが成功すれば通ります。
例えばpytest
などでテストをした結果、失敗があったとしてもその記録をファイルに書き出した上で次に進みたいとか言う場合。
余計な出力を抑えるためにgrep
とかをしたいので、
1
|
|
みたいなことをしたとします。
この場合、-e
オプションを入れていても次のコマンドへと進みますが、
-o pipefail
を指定すると進みません。
逆に意図せずコマンドが失敗してもパイプで隠されてしまうこともあるので
-o pipefail
をつけたほうが良いよ、ということもあるのですが、
いずれにしろきちんと管理してオプションをつけたりパイプを使ったりすれば良いだけです。
ただ、GitHub Actionsではshell
にbash
と指定するかしないかで
一見同じ様な感じがするのに動作が変わってしまうので注意が必要です。
特に注意が必要なケース
特に、というか自分が引っかかったケースですが、
もともと通常のjobs
を使ったActionを作っていて、
複合アクション(Composite Action)
として切り出して使おうとする場合。
通常のActionの中でのjobs.<jobid>.steps
では各ステップの
shell
の値は省略できて、その場合は上のデフォルトのbash -e
によるシェルコマンドとして実行されます。
ただし、複合アクションとして書く場合runs.steps
以下では
shell
の省略が出来ません。
したがって、省略してあるステップでは通常bash
を指定することになりますが、
この際にbash --noprofile --norc -eo pipefail
のオプションに変更されている事に注意しないといけません。
なんとなくほぼそのまま書き写してshell
が必要だというエラーが出たので
shell
だけ追加すればよいか、とやっていると
問題がさっと見えるものでもなかったりするので。
-
Windows環境を選んだ場合には
shell
にcmd
を設定した場合と全く同じ状態でコマンドプロンプトを使う仕様になっています。 ↩