塚田です。新人の頃からドキュメントの管理が大の苦手です。
ドキュメントの更新は滞り陳腐化してしまい、必要な時に見直すと使い物にならなかったりします。誰もが経験あるのではないでしょうか。
少しでもその呪縛から解放されるのであれば全力を注ぎたくなる性分なので、 ER図 を自動作成してくれる SchemaSpy を社内で使っている GitLab CI に組み込みました。
今回は SchemaSpy の紹介と、CI に組み込んだ話をしたいと思います。
SchemaSpy とは
DBに接続してテーブル構成などをスキャンして、html としてアウトプットしてくれる機能を持っています。 MySQL や PostgreSQL などをサポートしています。
CI への組み込み
弊社のCIのパイプラインでは、GitLab に push すると、自動でテストなどが動くような作りになっています。 そのテストの一環で、DBにスキーマ情報を migration する動きが既にありました。 そこに処理を追加し、CI で作られる DB へ SchemaSpy を繋げるようにしました。
SchemaSpy によって作られる成果物を S3 へ copy、 S3では Static website hosting を有効化にして、静的コンテンツを動かす Webサーバ のように使い、社内IPからのみ繋がるようにしました。
設定内容
.gitlab-ci.yml に追加したのは以下の部分
schemaspy: <<: *go_setup <<: *tags stage: schemaspy services: - mysql:5.7 script: - make ci-migrate - apt-get update - apt-get install -y openjdk-11-jre/stable unzip busybox build-essential graphviz - wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.48.zip -qO - | busybox unzip - - wget https://github.com/schemaspy/schemaspy/releases/download/v6.0.0-rc2/schemaspy-6.0.0-rc2.jar -O schemaspy.jar - java -jar schemaspy.jar -configFile ./ci/schemaspy.properties -vizjs - mkdir -p ${ARTIFACTS_DIR}/${CI_PIPELINE_ID}/schemaspy - mv output/* ${ARTIFACTS_DIR}/${CI_PIPELINE_ID}/schemaspy/. artifacts: paths: - ${ARTIFACTS_DIR}/${CI_PIPELINE_ID}/schemaspy expire_in: 3 days only: - master - development
ER図の作成は全ての branch で動かす必要もないので 現在は限られた branch のみ、SchemaSpy を動かすようにしています。
DBの接続情報は schemaspy.properties に書いています。
# type of database. Run with -dbhelp for details schemaspy.t=mysql # optional path to alternative jdbc drivers. schemaspy.dp=mysql-connector-java-5.1.48/mysql-connector-java-5.1.48-bin.jar # database properties: host, port number, name user, password schemaspy.host=mysql schemaspy.port=3306 schemaspy.db=database schemaspy.u=root schemaspy.p=password # output dir to save generated files schemaspy.o=output # db scheme for which generate diagrams schemaspy.s=public
その後、AWS S3 への push は以下のように定義して、gitlab runner が動くインスタンス自体に適切な権限を付与しています。
document: <<: *awscli_definition <<: *tags stage: document before_script: - export REF_NAME=`echo ${CI_COMMIT_REF_NAME} | sed -e 's%/%_%g' -e 's%-%_%g'` script: - aws s3 cp ${ARTIFACTS_DIR}/${CI_PIPELINE_ID}/schemaspy s3://${s3-backet}/schemaspy/${repository}/${REF_NAME}/ --recursive only: - master - development
S3 ではパブリックアクセスを拒否しております
バケットポリシーで社内の IP のみアクセスできるよう設定を入れています。
{ "Version": "2012-10-17", "Id": "document from designated SourceIP", "Statement": [ { "Sid": "document from designated SourceIP", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::xxxx-document/*", "Condition": { "IpAddress": { "aws:SourceIp": "xxx.xxx.xx.xx/32" } } } ] }
パイプライン が pass することを確認すると
S3 にファイルが置かれています。 ブラウザ で以下のような スキーマ情報 を見ることができます。
テーブル情報
自動生成されたER図
これで DB に関係するドキュメント、特に ER図 のメンテナンスから解放されそうです。
ちなみに、mysqldump から読み込ませるやり方はこちらに記載していますので、必要であればご覧いただけますと幸いです。
SchemaSpy で SQLファイル からスキーマ情報を出せるようにした - Tech Tips
それでは!