はじめに
モデルの管理画面での表示名を変更した際に、マイグレーションファイルを作成し忘れてしまいました(;_;)
前回の記事でマイグレーションについて調べたことをまとめています🥦
今回は、CI で自動的にマイグレーション漏れを検出する方法を紹介します。
💡 この記事でわかること
-
makemigrations --checkの使い方と動作 - GitHub Actions でマイグレーション漏れを自動検出する方法
GitHub Actions に組み込む
既存の CI ワークフローに、マイグレーションファイルの有無を確認するステップを追加します。
steps:
# ... セットアップ省略 ...
- name: Check Missing Migrations
run: |
python manage.py makemigrations --check
- name: Run Migrations
run: |
python manage.py migrate
マイグレーション漏れがある状態で migrate を実行しても正しく適用されないため、マイグレーションの前にマイグレーションファイルの確認をするようにします。
makemigrations --check
Django の makemigrations コマンドには --check オプションで、モデルの変更に対応するマイグレーションファイルが作成されているかを確認することができます。
python manage.py makemigrations --check
- マイグレーションファイル未作成のモデル変更があると検出され、エラーで終了する
- Django 4.2.9 以降では
--checkでファイルは作成されないので、--dry-runは必要ない
✍️ 補足
Django 4.2.9 より前のバージョンでは、--check を付けてもマイグレーションファイルが作成されてしまう挙動がありました。CI で使用する場合は --dry-run を付けてファイルが作成されないようにする必要があります。
# Django 4.2.9 未満の場合
python manage.py makemigrations --check --dry-run
動作確認
ローカルでの確認
Docker コンテナ内で makemigrations --check を実行し、2つのケースを確認しました。
マイグレーション漏れがある状態:
未作成のマイグレーションの内容が表示され、エラーで終了します。
$ python manage.py makemigrations --check
Migrations for 'sales':
apps/sales/migrations/0003_alter_csvexport_options_and_more.py
- Change Meta options on csvexport
- Alter field csv_export on product
-
Migrations for 'sales':対象のアプリ名 -
0003_alter_csvexport_options_and_more.py:生成されるマイグレーションファイル名 -
Change Meta options on csvexport:Meta オプション(verbose_name 等)の変更 -
Alter field csv_export on product:フィールドの変更
マイグレーション漏れがない状態:
問題がなければ No changes detected と表示され、正常終了します。
$ python manage.py makemigrations --check
No changes detected
CI での確認
ローカルで問題なかったので、実際に GitHub Actions で動作するか確認しました。
- モデルに一時的な変更を加え、マイグレーションファイルは作らずにコミット・プッシュして PR を作成
-
CI が
Check Missing Migrationsステップで失敗 → 検出が機能していることを確認 - 一時的な変更を元に戻してコミット・プッシュ
- CI が成功 → 正常系も問題ないことを確認
他のアプローチ
pre-commit フックでの検出
Johnny Metz の記事 では、pre-commit フレームワークを使った方法が紹介されています。
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: check-django-migrations
name: Check django migrations
entry: python manage.py makemigrations --check
language: system
types: [python]
pass_filenames: false
コミット時にローカルで検出できるため、push 前に気づくことができます。
まとめ
-
makemigrations --checkでマイグレーションファイルの漏れが確認できる - CI ワークフローでマイグレーションファイルの漏れを自動検出できる
- pre-commit では push 前にマイグレーションファイルの漏れを自動検出できる
参考