⚡️

GitHub Actionsで他のワークフローによりトリガー条件が満たされているのにワークフローが発火しない

2023/08/18に公開

前提

リリース作業の自動化で「mainブランチへのプルリクが作成されたら本番のプレビュー環境にデプロイする」ようにワークフローを組んでいました。

以下の2つのワークフローでこの自動化を実現しています。

  1. 毎週決まった曜日の朝9時に、developブランチからmainブランチへのプルリクを作成する
  2. mainブランチへのプルリクがopenされた時に、本番プレビュー環境にマージ元ブランチをデプロイする

何が起きた

  • 1の実行後に2がトリガーされなくなった
  • 手動でmainブランチへのプルリクを作成すると2が起動する
  • 手動で1を実行しても2は起動しない

つまり、
Actionsからmainブランチへのプルリクが作成された場合、2が起動しない
という状態になりました。

条件は満たしているし、今まで動いていたのになぜ...!

そういうことか!

1のワークフローではGITHUB_TOKENによる自動トークン認証を使用してプルリクを作成していました。

- name: Create Pull Request to master
 id: create-pull-request
 env:
    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    run: |
        PULL_REQUEST_URI=$(gh pr create --base master --title "$CURRENT_DATE リリース" --body "")
        echo "PULL_REQUEST_URI=$PULL_REQUEST_URI" >> $GITHUB_OUTPUT

明示的なトークン発行が不要でsecrets.GITHUB_TOKENと書くだけでトークンが取得できます。
簡単便利なので使っていたのですが、実はこのトークンの落とし穴にすっぽりはまっていました。

ドキュメントにはしっかり書いてあるのですが、GITHUB_TOKENの仕様に原因があると思わず全く辿り着けませんでした。
https://docs.github.com/ja/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow

リポジトリGITHUB_TOKENを使用してタスクを実行する場合、 GITHUB_TOKEN によってworkflow_dispatchトリガーされるイベント (例外) と repository_dispatch、 は新しいワークフロー実行を作成しません。 これによって、予想外の再帰的なワークフローの実行が生じないようになります。

意図せずイベントがトリガーされないようにする配慮()だったようです。

たとえば、ワークフロー実行でリポジトリの GITHUB_TOKEN を使用してコードがプッシュされた場合、push イベントの発生時に実行するように構成されたワークフローがリポジトリに含まれている場合でも、新しいワークフローは実行されません。

on:
  # プルリク作成時と手動実行時に実行
  workflow_dispatch:
  pull_request:
    types: [opened, synchronize]
    branches:
      - main

上記のような条件のワークフローが発火されて欲しかったのですが、デフォルトのGITHUB_TOKENを利用してプルリク作成をしていたので2つ目のワークフローが発火しなかったのですね。

ちなみにこのワークフローが急に動かなくなった原因は謎です。2023年6月ごろから動かなくなりました。
ymlをいじったわけでもないので何らかの仕様が変わったのかと思いましたが、GITHUB_TOKENについて直近であがっていたChange Logは2022年9月のworkflow_dispatch repository_dispatchでGITHUB_TOKENが利用できるようになったというものでした。

https://github.blog/changelog/2022-09-08-github-actions-use-github_token-with-workflow_dispatch-and-repository_dispatch/

何かご存知の方がいればコメントいただけると飛んで喜びます。

解決方法

GITHUB_TOKENの代わりにpersonal access tokenを使うかGitHub Appのトークンを使うかで解決できます。

personal access tokenではトークンの有効期限が切れた時にワークフローが失敗します。
この種の原因による失敗の頻度は高くないので、Actionsに慣れていない開発者がこのエラーに遭遇した場合かなり時間をドブに捨てることが予想されます。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

こちらのドキュメントにもあるようにpersonal access tokenはパスワードのようなものなので漏洩などのリスクもあります。

そのためGitHub Appで解決しています。
一度整備すれば他のリポジトリのワークフローでも使いまわせますし、1〜2時間程度で導入できました。
personal access tokenを使っていた際、トークン有効期限が切れると対応方法を忘れているなどで1時間程度浪費していたのでGitHub Appで解決するのがおすすめです。

https://docs.github.com/ja/enterprise-cloud@latest/apps/creating-github-apps/authenticating-with-a-github-app/making-authenticated-api-requests-with-a-github-app-in-a-github-actions-workflow

GitHub Appsの作成〜ワークフローでの利用方法まではこちらのブログがとても参考になると思います!

https://blog.beachside.dev/entry/2023/07/18/183000

Discussion