GitHub Actions+SchemaSpyでER図を自動出力

2 min read読了の目安(約2500字

ER図を自動で出力する機会あり、GitHub Actions+SchemaSpyを試してみた。

Railsのアプリケーションで、データベースはmysqlを利用している。
ただし外部キー制約がなく、リレーションの表示は難しいかなと思っていたのだが、世の中便利なことになんとかなった。

SchemaSpyには、Railsベースの命名規則を使って外部キーを推測してくれる-rails オプションがある。

https://schemaspy.readthedocs.io/en/latest/configuration/commandline.html?highlight=rails#html-report-related

リレーションの表示がいまいちだったら外部キー制約の追加クエリを出力してくれるやつhakagiも試してみようかと思っていたが -rails オプションで十分だった。

ER図を生成するところまで

出力結果はs3にアップするなり、社内のwebサーバにアップルするなり好きにして下さい。

.github/workfrows/er.yml
name: er
on:
  push:
    branches:
      - main
    paths:
      - "db/migrate/**"
jobs:
  run:
    runs-on: ubuntu-latest

    env:
      RAILS_ENV: development
      DB_NAME: hoge

    services:
      db:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.0.0
          bundler-cache: true
          cache-version: 1
      - name: mysql set character_set
        run: |
          mysql -u root -h 127.0.0.1 -e "set global character_set_server='utf8mb4';"
          mysql -u root -h 127.0.0.1 -e "set global collation_server='utf8mb4_unicode_ci';"
      - name: db migrate
        run: |
          cp config/database.ci.yml config/database.yml
          bundle exec rails db:create
          bundle exec rails db:migrate
      - name: make schemaspy.properties
        run: echo -e "
          schemaspy.t=mysql\n
          schemaspy.dp=\n
          schemaspy.host=db\n
          schemaspy.port=3306\n
          schemaspy.db=$DB_NAME\n
          schemaspy.u=root\n
          schemaspy.p=\n
          schemaspy.o=\n
          schemaspy.s=$DB_NAME\n
          " > /tmp/schemaspy.properties
      - name: Prepare a dir for schemaspy output
        run: mkdir -m 777 /tmp/output
      - name: run schemaspy
        run: docker run --net=${{ job.container.network }} -v "/tmp/output:/output" -v "/tmp/schemaspy.properties:/schemaspy.properties" schemaspy/schemaspy:latest -rails
      - name: upload er
        run: echo "/tmp/outputにER図が出力されているのでs3とかにアップロードしてね"
database.ci.yml
development:
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  database: hoge
  username: root
  password:
  host: 127.0.0.1

おそらく

ruby/setup-rubyの部分をphpに、
db:migrateしてる部分を php artisan migrate に置き換えればlaravelでも同じようなことができるはず

https://github.com/shivammathur/setup-php