schemaの変更をトリガーにER図を自動更新する仕組みの紹介
こんにちは、SREチームの宮原(@TakashiMiyahara)です。最近、山岡家によく通っています🙋
今回は、「schemaの変更をトリガーにしてER図を自動で更新する仕組み」について紹介したいと思います
はじめに
リレーショナル・データベースを利用したWebアプリケーションを開発していると、ER図が欲しくなりますよね。
ER図があることでデータベースの構造を視覚的に把握しやすくなる一方で、人の手で継続的にメンテナンスするのは少々手間かと思います。
データベースの構造などに変更があった際に、自動的にER図を更新してくれれば便利なのでは?と考え、クラッソーネで導入してみました。
準備
今回はRailsアプリケーションを対象としてお話ししたいと思います。
トリガーについて
データベースの定義に変化がある場合、Active Recordは db/schema.rb
ファイルを更新します。
db/schema.rb
に変更があるときは即ち、データベースの定義に変化があった時だと判断できます。
トリガーは、 db/schema.rb
に変化が生じた時とします。
ER図の作図について
Rubyの世界には、 Rails ERD
というパワフルなGemが存在します。
Active Record の組み込みリフレクション機能を使用して、モデルがどのように関連付けられているかを把握してくれます。
導入はとても簡単で、Gemfileに以下の内容を追加し、bundle install
を行います。
gem 'rails-erd'
Rails ERD
は graphviz
を利用しますので、お使いのディストリビューションに合わせてインストールをしてください。
apt-get install -y graphviz
準備が整ったら下記のコマンドを実行してER図を出力します。
ただし、テーブルなどが1つも存在しない場合には出力されません。
bundle exec erd
GitHub Actionsの作成
Rails ERD
を利用することでER図が作図できることがわかりました。
このままでは、人の手でER図を都度都度更新する必要があります。
それですと少し手間がかかりますので、GitHub Actionsを利用して自動化します。
ワークフローの作成
以下に今回作成したワークフローを示します。
name: Update ER Diagram
on:
pull_request:
paths:
- "db/schema.rb"
jobs:
update_er_diagram:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.2
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
ports:
- 3306:3306
options: >-
--health-cmd "mysqladmin ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: Install dependencies
run: |
sudo apt-get install -y graphviz
bundle install
- name: Generate ER diagram
env:
RAILS_ENV: test
run: |
cp config/database.yml.ci config/database.yml
bin/rails db:create || true
bin/rails db:migrate
bundle exec erd --filetype=png
- name: Commit and push if there are changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add erd.png
git commit -m "Update ER diagram" || echo "No changes to commit"
git push
必要なライブラリ等をインストールしたのち、 Generate ER diagram
という箇所でER図を出力します。
この時に、READMEなどで表示しやすくするために、 --filetype
に png
を指定しています。
ここはお好みの --filetype
を選んでいただければと思います。
最後に、自動生成された erd.png
をリポジトリにコミットします
ここで action@github.com
を指定して操作することで、 actions-userとしてコミットできます。
まとめ
GitHub Actionsを活用することで、自動かつ継続的にER図のメンテナンスが行えるようになりました。
ER図の変更が、プルリクエストの差分に含まれることで、レビューイ・レビュワー双方が、schemaの変更が意図的なものかを確認しやすくなるかと思います。
また、ER図が成長していく過程を追うことができ、これも一つの楽しみです。
Rails.new直後に導入すると常に最新のER図がmainブランチに存在する環境になるのでおすすめです!
おわりに
クラッソーネでは、プロダクトとチームの双方をより良く改善していけるエンジニアを募集中です!