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を設定した場合と全く同じ状態でコマンドプロンプトを使う仕様になっています。 ↩
