こんにちは、アプリチームのchotaroです。
いくつかの新規サービスの開発を控え、アプリチームにも人の入れ替わりが発生してきています。
そんな中、新規参画者への情報共有が一つの課題になりました。
今回はそのためにやった一つのTIPSを紹介します。
解決する課題
- 逐次DBの構造が変更されるのに対して、プロジェクト内のER図がメンテできておらず最新のER図が存在しないこと
- 新規参入者が全体の構造を理解するのに、時間がかかってしまうこと
解決方法
schemaspyとjenkinsを組み合わせて、チームメンバーが最新のER図をWEBブラウザ上で確認できるようにする。
実践
schemaspy
schemaspyは、オープンソースで提供されている、ER図生成ツールです。(ライセンスはLGPLv3)
接続先やスキーマ名の情報を与えることで対象のDB・スキーマを読み取り静的なhtmlを一式生成します。
スキーマごとにディレクトリを生成し、スキーマ内でのカラムの検索やリレーションを表現した図を出力してくれます。
html一式が出力されるため、例えばCIサーバ上に展開するようにすれば、チームメンバー全員が閲覧可能になります。
ER図の出力
基本的にはドキュメントに全部書いてあります。親切。
下準備
- graphvizのインストール(ubuntuであれば
apt-get install graphviz
してあげてください。dot -V
でinstallされているか確認できます。 ) - java8のインストール
必要なライブラリの準備
- ライブラリ本体SchemaSpy releases
- 接続先に合わせたjdbc driver(postgresqlであれば、
wget https://jdbc.postgresql.org/download/postgresql-42.2.5.jar
)
上記を一つのdirectoryに入れ、同じ階層にschemaspy,propertiesを作成します。
# type of database. Run with -dbhelp for details schemaspy.t={{接続先のDBの種類 postgresqlなら[pgsql] }} # optional path to alternative jdbc drivers. schemaspy.dp={{ 接続用のJDBC driver [/path/to/driver/postgresql-42.2.5.jar]}} # database properties: host, port number, name user, password schemaspy.host={{ 接続先host }} schemaspy.port={{ 接続先port番号 }} schemaspy.db={{ 接続先DB名 }} schemaspy.u={{ user name }} schemaspy.p={{ password }} # output dir to save generated files schemaspy.o={{ output先のdirectory }} # db scheme for which generate diagrams # schemaspy.s= {{ 対象のスキーマ名 (今回は全スキーマを対象としたいのでコメントアウトしています。) }}
実行
ここまでで準備してきたdirectoryで
java -jar [jar名] -all
とコマンドを実行します。(-allは全スキーマを分析対象とするためのオプションです。)
ciサーバ上で出力が確認できたらnginxなどWEBサーバーの設定を仕込み、まずページを見られるか確認します。
こんなページが閲覧可能になればOKです
okならばjenkinsにjobを作っていきます。
Jenkins jobでER図の最新化を自動化する
シェル実行で以下のようなスクリプトを設定。
rm -rf /path/to/output/* cd ~/schemaspy # jarの実行。 java -jar schemaspy-6.0.0.jar -all ls -al /path/to/output/
このとき、書き込み先のディレクトリのpermissionには注意してください。jenkinsユーザーの書き込み権限が出力先のdirectoryにあることが前提になります。権限がない場合、処理がfailしてしまいます。
また一部のみ出力ではなく全量を出力するため、ゴミが残らないよう毎回クリーンアップするようにしています。
このjob自体をwebアプリのデプロイjobのあとに起動するように設定して完了です。
こうすることで実際に動いているwebアプリが、どんな構造のDBを元にしているのかがすぐ確認できるようになりました。
効果
これから先に備えた変更なので、この先どうなるか、というとこです。今後に期待。
ただし、ローカルで利用してみた所感では、やはり無いのと有るのでは自分自身の実装に対する確信が違います。
ひと目でわかること、は大事。
課題
リレーションを明示的に貼っていないとリレーション図を閲覧できません。(当たり前ですが……
なのでリレーションを明示的に貼ってはいないものの同一なもの(USER.user_idとACCESS_LOG.user_idのような関係)を読み取ることが難しいです。
docker上にDBを立ててそこにddlを流し、別途alter文を流して擬似的に見せることはできますが……そうするとそのalter文までメンテナンスしなくてはならないため諸々コストがかかります。
悩ましいところですが、新規チームメンバーの参画のタイミングで継続的に改善していくしかないかなというところです。
以上、主にschemaspyの紹介でした。
アプリチームでは今後もこのような改善活動を継続しつつ、サービス開発に勤しんでいきます。
もし興味持たれた方おられましたら、下記バナーから開発環境や採用情報など見れますので、是非見てみてください。
それでは失礼します。