はじめに
Github Actionsのシェル部分( run
セクション)でコマンドの成功、失敗によって処理を分けたかったのですが、上手くいかなかったのでその対策を残します。
ここでは例として、 test_command
のステータスコードを見て、失敗してたら(ステータスコードが0じゃなかったら) when_failed
コマンドを実行したいとします。
run: |
test_command
if [ $? -ne 0 ] ; then
when_failed
fi
しかし、上記のコードは意図通りに動きません。
test_command
が失敗した段階でifの分岐に入る前に、以下のようなエラーメッセージが出て処理が終了してしまいます。
Error: Process completed with exit code 1.
原因
実行ログを見てみると、以下の部分が怪しそうです。
shell: /usr/bin/bash -e {0}
manコマンドでbashの e
オプションを調べてみます。
-e
Exit immediately if a simple command (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test in an if statement, part of a && or ⎪⎪ list, or if the command's return value is being inverted via !. A trap on ERR, if set, is executed before the shell exits.
なるほど、この e
オプションによって、コマンドが失敗している時点で処理が中断されているようです。
解決策
原因パートの書式を真似て、yamlに shell
のセクションを e
オプションを抜いて呼び出すようにしてみます。
shell: /usr/bin/bash {0}
run: |
test_command
if [ $? -ne 0 ] ; then
when_failed
fi
無事、 test_command
が失敗した際に when_failed
が呼ばれるようになりました!
別の方法
上記の e
オプションの説明にあるように、ifの条件式の中ではコマンドが失敗しても処理が中断されません。
なので、以下のようにifの条件式の中に直接記述してもいけます。
run: |
if test_command; then
when_failed
fi