GitHub Actionsのスケジュール実行時にcheckoutされるブランチはデフォルトブランチであることを知らずデグレさせた話
はじめに
とあるプロジェクトでフロントエンドのビルドにGitHub Actionsを使用していました。このプロジェクトでは、Next.jsを使っていて一部の日次更新されるデータをStatic Generationしていたので、スケジュール機能を使ってUTC19時に毎日ビルド~デプロイを実行していました。
name: Deploy to prd environment
on:
push:
branches:
- prd
paths:
- packages/**
schedule:
- cron: '0 19 * * *'
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials from Prd account
uses: aws-actions/configure-aws-credentials@v1
ブランチ戦略はGitLabフローを採用しており、
- dev: 開発環境(デフォルトブランチ)
- stg: ステージング環境
- prd: プロダクト環境
という感じでブランチと環境が対応していました。各環境ごとにビルド時に使用したい環境変数が異なったのでActionsの定義ファイルはブランチごとに作成していました。(.github/workflows/{dev.yml,stg.yml,prd.yml,pull-request.yml}
が存在しました。)
何が起きたか
リリース後にプロダクション環境にアクセスするとバグを発見しそれを修正しようとしていたのですがローカルではちゃんと動いているという事象が起きました。修正方法が悪かったのかと考えて別のアプローチで修正しリリースすると修正され安堵していたのですが、翌日またプロダクション環境でバグが再発しました。
またこの修正リリースはdevブランチには行わずに、fixブランチ(stgブランチから作成)→stgブランチ→prdブランチという順番でマージされていました。
Actionsが意図しない動作をしている予感がしたので、プロダクション環境のファイルをローカルにダウンロードしてserveで動かしてみたところ、バグが再現しました。ここでスケジュール実行するタイミングで意図したコミットが参照されていないと推測しました。
確証を得るためにActionsのCheckout処理のログを見てみると、devブランチを参照していることがわかりました。
「github actions schedule branch」みたいな感じでググると、stack overflowの記事がヒットし、Google翻訳先生の力を借りるとスケジュール実行では、明示的に指定しなければデフォルトブランチで実行されることがわかります。ありがたいことにドキュメントやGitHubへのリンクも貼られているので飛んで公式情報も確認し認識に誤りが無いことをチェックしました。
どう直したか
こんな風にCheckoutの際にブランチを明示しました。これを各ブランチのファイルに行いました。
name: Deploy to prd environment
on:
push:
branches:
- prd
paths:
- packages/**
schedule:
- cron: '0 21 * * *'
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
ref: prd
- name: Configure AWS credentials from Prd account
uses: aws-actions/configure-aws-credentials@v1
あとがき
1つのワークフロー定義に書く環境の環境変数を設定するのはわかりにくいなと思ってファイルを分けていましたが、そのせいでこういった設定ミスをしてしまいました。(1つのファイルでやっていれば、「あれ?これどのブランチを参照するんだ?」って気づけた気がする)
あとよく使うツールは一度はドキュメント全部に目を通して置く方がトータルで早いなと改めて気づかされました。
Discussion