Header image

クラッソーネの開発者がエンジニアリングに関することもそうでないことも綴っています!

schemaの変更をトリガーにER図を自動更新する仕組みの紹介

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が存在します。
https://github.com/voormedia/rails-erd

Active Record の組み込みリフレクション機能を使用して、モデルがどのように関連付けられているかを把握してくれます。

導入はとても簡単で、Gemfileに以下の内容を追加し、bundle install を行います。

gem 'rails-erd'

Rails ERDgraphviz を利用しますので、お使いのディストリビューションに合わせてインストールをしてください。

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としてコミットできます。
https://github.com/actions-user

まとめ

GitHub Actionsを活用することで、自動かつ継続的にER図のメンテナンスが行えるようになりました。

ER図の変更が、プルリクエストの差分に含まれることで、レビューイ・レビュワー双方が、schemaの変更が意図的なものかを確認しやすくなるかと思います。
また、ER図が成長していく過程を追うことができ、これも一つの楽しみです。

Rails.new直後に導入すると常に最新のER図がmainブランチに存在する環境になるのでおすすめです!

おわりに

クラッソーネでは、プロダクトとチームの双方をより良く改善していけるエンジニアを募集中です!

https://www.crassone.co.jp/recruit/engineer/


RubyやTerraformが好きで、メンバーが楽になる仕組みを考えるのが好きなエンジニア