📇
GitHub Actions+SchemaSpyでER図を自動出力
ER図を自動で出力する機会あり、GitHub Actions+SchemaSpyを試してみた。
Railsのアプリケーションで、データベースはmysqlを利用している。
ただし外部キー制約がなく、リレーションの表示は難しいかなと思っていたのだが、世の中便利なことになんとかなった。
SchemaSpyには、Railsベースの命名規則を使って外部キーを推測してくれる-rails
オプションがある。
リレーションの表示がいまいちだったら外部キー制約の追加クエリを出力してくれるやつ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でも同じようなことができるはず
Discussion