2
1

More than 1 year has passed since last update.

Github Actionsのシェルの処理が途中で失敗しても処理が中断されないようにする

Last updated at Posted at 2023-06-01

はじめに

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
2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1