CircleCI x SchemaSpyでER図を新しくし続ける

こんにちは @hatappi です
今回はCircleCIネタです
以前CircleCIを使って下記のようなものを作っていました

qiita.com

何かとCircleCIにはお世話になってます
業務などでER図やテーブル定義書などを書く機会あると思います
Excel? Google Sheets? MySQL Workbench? Cacoo?(html5化待ち遠しい)
色んな手段がありますが基本はユーザーがメンテしてあげないと腐ります 😇

最初は頑張って更新するぞ!!と用意しても、どこかのタイミングで更新しなくなって中途半端な状態になり、それを新しく入った人が見て混乱するみたいなことがありました

もう人が更新するのはやめたい

私はRailsを使っているのでmigrationしてテーブルを作成したりしているので、そのタイミングで勝手に作ってほしい
データベースはMySQLです

gemで作成するという選択

voormedia/rails-erd

初回リリースが2010年9月で結構古くからあるやつ
pdfでスキーマを出力してくれる
コメント出力などもうちょっと見やすくしたい

amatsuda/erd

@a_matsudaが2012年4月にリリースされたgem
さきほどのrails-erdを内部的には使ってpdfではなくrails server で起動しブラウザ上で確認できる

Featureになっているが、テーブルの定義自体を変更したり新規でモデルをこの画面上から作れるみたい

ただ1つ問題があって、Rails Apiで作成したプロジェクトだと動かない
flashとかを使ってるんだけど、これがRailsApiでは最初は入ってないので下記のように追加したりしないといけない

config.middleware.use ActionDispatch::Flash

このためにmiddlewareに追加するのもなー

CircleCI x SchemaSpy

SchemaSpyはJava製のツールでJDBCドライバ使ってデータベースに接続して、テーブル定義をHTML化して吐いてくれる
図はdot言語でテキスト化されたものをGraphvizして出力している

SchemaSpyは元々こちらで2004年から運用されていたのですが、2010年をリリースを最後にリリースが止まってしまいました
その後有志の方が開発を続けるために作成したのがschemaspy/schemaspyです

今回はそのschemaspy/schemaspyを使用します
実行自体はjarファイルが提供されているので、それを使いオプションでデータベースの接続情報やoutputのpathなどを指定するだけ!!

java \
  -jar schemaspy.jar \
  -t mysql \
  -dp driver_path \
  -db db_name \
  -host db_host \
  -u db_username \
  -p db_password \
  -o outout_dir \

出力例は公式で提供されている

CircleCIはartifactsという機能を使用します
指定されたディレクトリにファイルをおくとそれをCircleCI上から確認できるもので colszowka/simplecovを使ったことがある方はカバレッジの結果をCircleCI上で確認したことがあるのではないでしょうか

ちなみにCircleCIがもうすぐ2.0が出ますが今回はv1.0でbuildOSにはUbuntu 14.04 (Trusty)を使用しました データベースはMySQLを今回は使用しています

ファイルは下記のように配置をする

│ 
├── script
│   └── schemaspy
│       ├── circleci.sh
│       └── jar
│           ├── mysql-connector-java-5.1.41-bin.jar
│           └── schemaspy-6.0.0-beta.3.jar

実際にjarファイルを実行するスクリプトのcircleci.shは下記になります

JAR_DIR=$(cd $(dirname $0); pwd)/jar
SCHEMASPY_FILEPATH=$JAR_DIR/schemaspy-6.0.0-beta.3.jar
MYSQL_CONNECTOR_FILEPATH=$JAR_DIR/mysql-connector-java-5.1.41-bin.jar

# CircleCI側で$CIRCLE_ARTIFACTSにARTIFACTSの配置先が入っている
HTML_OUT_DIR=$CIRCLE_ARTIFACTS/schemaspy

java \
  -jar $SCHEMASPY_FILEPATH \
  -t mysql \ # 今回はMySQL、他にもPostgreSQLやORACLE, SQLiteなどがある
  -dp $MYSQL_CONNECTOR_FILEPATH \
  -db circle_ruby_test \
  -host ${DATABASE_HOST:-localhost} \
  -u ${DATABASE_USERNAME:-root} \
  -p ${DATABASE_PASSWORD:-''} \
  -o $HTML_OUT_DIR

あとはCircleCIの設定のcircle.yml

machine:
  timezone:
    Asia/Tokyo
dependencies:
  pre:
    - sudo apt-get install graphviz
test:
   post:
     - ./script/schemaspy/circleci.sh

を記載してCIをまわし実行が終わると画面上から確認できるようになります

f:id:hatappi1225:20170328002744p:plain

とりあえず試してみたい方は下記をforkしてご自身のCircleCIで使用できると思います

github.com

まとめ

今回はRailsを例にしていましたが、中身としてはデータベースに繋いでHTMLを生成しているので どのプロジェクトでもjarファイルを配置してしまえば動くようになります 逆にRailsなどのPolymorphicなどのフレームワークに依存している機能の関係なども含む場合はrails-erdなどを使うと良さそうです

これで腐らないER図をCI上でいつでも確認できるようになりました!!