はじめに
現在開発しているWebアプリで CI/CD を導入したのですが、CI が失敗しているにも関わらずデプロイまで実行されてしまうという問題がありました。
個人開発なので致命的ではありませんが、業務でやってしまうと大問題です。
問題
CI で失敗してもデプロイが実行されてしまう。
原因
デプロイのトリガーが CI の完了ではなく、単純に push イベントになっていたため。
# ❌NG
on:
push:
branches: [main]
workflow_dispatch:
...
jobs:
deploy:
...
対策
デプロイのトリガーを CI の実行結果を参照するように修正。
# ✅OK
on:
workflow_run:
workflows: ['CI']
branches: [main]
types: [completed]
...
jobs:
deploy:
if: ${{ github.event.workflow_run.conclusion == 'success' }}
...
テスト
修正が正しく動作するかを確認するため、意図的に CI を失敗させます。
RSpec に以下のテストコードを追加しました。
it "CI-TEST: fails intentionally" do
expect(1).to eq(2)
end

コミット & push → CI が失敗したことを確認します。

デプロイがスキップされていることを確認します。

これで「CI が失敗した場合にデプロイされない」ことを確認できました。
最後に、CI テスト用のコードを削除し、再度実行して正常に動作することを確認します。

CIが成功することを確認します。

デプロイが実行されることを確認します。

以上で、テスト完了です。