
GitHub Actionsのステータスチェック関数を使って処理結果に応じたステップを作ってみた
こんにちは!製造ビジネステクノロジー部の小林です。
GitHub Actionsでワークフローを作成する際、特定の条件下でジョブを実行したい時があると思います。そんなときに活躍するのが「ステータスチェック関数」です。今回は、GitHub Actionsで使用できる様々なステータスチェック関数を試してみました。
ステータスチェック関数とは?
ステータスチェック関数は、ワークフローの実行状態を評価し、条件分岐を可能にする特殊な関数です。これらの関数は主にif条件式で使用され、手前で実行したステップやジョブの結果によって、返す値が変化します。
ステータスチェック関数を使うとなにが嬉しいの?
GitHub Actionsではワークフローの処理中に失敗すると、基本的にその時点でワークフロー全体の実行が停止します。しかし、ステータスチェック関数を使うと失敗時のみ実行する処理などを実行できます。
ステータス関数の種類
1. success()
最も基本的な関数で、前のステップが成功した場合にtrueを返します。
steps:
- name: テスト実行
run: npm test
- name: テスト成功時のみ実行
if: success()
run: echo "テストが成功しました!"
success()はデフォルトの動作なので、明示的に書かなくても同じ効果が得られます。
2. failure()
前のステップが失敗した場合にtrueを返します。
steps:
- name: テスト実行
run: npm test
- name: テスト失敗時の通知
if: failure()
run: echo "テストは失敗しました"
3. always()
前のステップの結果に関わらず、常にtrueを返します。
steps:
- name: 常に実行するレポート送信
if: always()
run: echo "テスト結果を送信します"
4. cancelled()
ワークフローがキャンセルされた場合にtrueを返します。
steps:
- name: キャンセル時の処理
if: cancelled()
run: echo "ワークフローがキャンセルされました"
使ってみた
では実際に上記で紹介したステータスチェックの関数を使ってみます!ワークフローでは下記のことを実現します。
- success() - テストが成功した場合に実行される処理
- failure() - テストが失敗した場合に実行される処理
- always() - テストの結果に関わらず、必ず実行される処理
- cancelled() - テストがキャンセルされた場合に実行される処理
name: Status Check Workflow
on:
push:
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: テスト実行
id: run_tests
run: npm test
# テスト成功時のみ実行されるステップ
- name: 成功レポート
if: success()
run: echo "テストは成功しました"
# テスト失敗時のみ実行されるステップ
- name: 失敗レポート
if: failure()
run: echo "テストは失敗しました"
# テストの結果に関わらず常に実行されるステップ
- name: 常に実行するレポート送信
if: always()
run: echo "テスト結果を送信します"
# ワークフローがキャンセルされた場合のみ実行されるステップ
- name: キャンセル時の処理
if: cancelled()
run: echo "ワークフローがキャンセルされました"
動作確認
それぞれのシナリオでの挙動を確認してみます。
失敗した場合
テスト実行時にpackage.jsonファイルが見つからないエラーが発生した際の動作を確認しました。
「成功レポート」ステップ(if: success())は実行されず、「失敗レポート」ステップ(if: failure())が正しく実行されています。また「常に実行するレポート送信」ステップ(if: always())も期待通り実行されています。
成功した場合
npm installを実行してpackage.jsonを作成した後、テストが成功した場合の動作を確認しました。
テストが正常に完了しました。「成功レポート」ステップ(if: success())が実行され、「失敗レポート」ステップ(if: failure())はスキップされています。また「常に実行するレポート送信」ステップ(if: always())も期待通り実行されています。
キャンセルした場合
ワークフローをキャンセルした場合の動作を確認するため、以下のように待機ステップを追加しました。
(既存のワークフローだとすぐに処理が完了してしまい、キャンセルできませんでした)
- name: キャンセルテスト用の待機
run: |
echo "60秒間待機します。この間にワークフローをキャンセルしてください。"
sleep 60
実行中のワークフローをコンソールからキャンセルします。
キャンセル後の実行結果。
ワークフローが正常にキャンセルされました!「キャンセル時の処理」ステップ(if: cancelled())が実行され、「常に実行するレポート送信」ステップ(if: always())も期待通り実行されています。また「成功レポート」と「失敗レポート」のステップはどちらも実行されていません。
おわりに
今回はGitHub Actionsのステータスチェック関数を使い、ワークフローの実行状態に応じた処理を検証してみました。
より実践的な活用方法として、成功時のみのデプロイ処理、失敗時のSlack通知、テスト結果に関わらず実行する環境クリーンアップ、キャンセル時の進行中リソース解放など様々な処理を組み合わせることができると思います。
この記事が、GitHub Actionsのワークフロー実装を検討されている方の参考になれば幸いです!