rcmdnk's blog

柘製作所(tsuge) パイプ BPK ショートスモーク用

GitHub Actionsで実行されるコマンドに関して、 通常のシェルコマンドを実行する事もできる中、 shellとしてbashの指定を明にするとオプションが変わって挙動が変わる件。

shellを指定しない場合

GitHub Actionsではshellで実行シェルを変更することができ、 pythonなどを指定してpythonスクリプトを実行することも可能です。

何も指定しないとシェルスクリプトになりますが、 自分もそうでしたが、なんとなく、で使っていることが多いかと。

何も指定しない場合、LinuxやmacOSの環境では 1 bash -eにコマンドが渡される形になります。 (bashがない場合はshを指定する。)

GitHub Actions のワークフロー構文 - GitHub Docs

したがって複数のコマンドを渡した場合にも途中のコマンドで失敗するとそこで終了するようになっています。

shell: bashとした場合

何も指定しないとbashになりますが、bashと指定することも出来ます。

ただし、この場合にはオプションが変更され、

1
bash --noprofile --norc -eo pipefail

になります。

noprofilenorcはもし環境に特殊なPATHの設定とかを入れてbashrcとかで読み込むようなことを してる場合にはshellbashを渡す場合とそうでない場合で実行環境が変わる可能性があるので注意ですが、 GitHub Actionsではあまりあるケースではないかと思います。

一方で、最後の-o pipefailが追加されているところが注意。

-eを指定しているときでも-o pipefailがなければパイプの前で失敗した場合には その後ろのコマンドが成功すれば通ります。

例えばpytestなどでテストをした結果、失敗があったとしてもその記録をファイルに書き出した上で次に進みたいとか言う場合。 余計な出力を抑えるためにgrepとかをしたいので、

1
pytest | grep "^tests/mytest.py::" > output.log

みたいなことをしたとします。

この場合、-eオプションを入れていても次のコマンドへと進みますが、 -o pipefailを指定すると進みません。

逆に意図せずコマンドが失敗してもパイプで隠されてしまうこともあるので -o pipefailをつけたほうが良いよ、ということもあるのですが、 いずれにしろきちんと管理してオプションをつけたりパイプを使ったりすれば良いだけです。

ただ、GitHub Actionsではshellbashと指定するかしないかで 一見同じ様な感じがするのに動作が変わってしまうので注意が必要です。

特に注意が必要なケース

特に、というか自分が引っかかったケースですが、 もともと通常のjobsを使ったActionを作っていて、 複合アクション(Composite Action) として切り出して使おうとする場合。

通常のActionの中でのjobs.<jobid>.stepsでは各ステップの shellの値は省略できて、その場合は上のデフォルトのbash -eによるシェルコマンドとして実行されます。

ただし、複合アクションとして書く場合runs.steps以下では shellの省略が出来ません。

したがって、省略してあるステップでは通常bashを指定することになりますが、 この際にbash --noprofile --norc -eo pipefailのオプションに変更されている事に注意しないといけません。

なんとなくほぼそのまま書き写してshellが必要だというエラーが出たので shellだけ追加すればよいか、とやっていると 問題がさっと見えるものでもなかったりするので。

Sponsored Links
  1. Windows環境を選んだ場合にはshellcmdを設定した場合と全く同じ状態でコマンドプロンプトを使う仕様になっています。

Sponsored Links

« シェルスクリプトで二重括弧による計算を行う際の0Xな数字に関する注意 pyproject-pre-commit: Pythonプロジェクト用のpre-commit集 »

}