RareJob Tech Blog

レアジョブのエンジニア・デザイナーによる技術ブログです

ER図 の自動作成を CI に組み込んだ話

塚田です。新人の頃からドキュメントの管理が大の苦手です。

ドキュメントの更新は滞り陳腐化してしまい、必要な時に見直すと使い物にならなかったりします。誰もが経験あるのではないでしょうか。

少しでもその呪縛から解放されるのであれば全力を注ぎたくなる性分なので、 ER図 を自動作成してくれる SchemaSpy を社内で使っている GitLab CI に組み込みました。

今回は SchemaSpy の紹介と、CI に組み込んだ話をしたいと思います。

SchemaSpy とは

DBに接続してテーブル構成などをスキャンして、html としてアウトプットしてくれる機能を持っています。 MySQLPostgreSQL などをサポートしています。

http://schemaspy.org/

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 ではパブリックアクセスを拒否しております f:id:sumito1984:20200123114004p:plain

バケットポリシーで社内の 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 することを確認すると

f:id:sumito1984:20200123015435p:plain

S3 にファイルが置かれています。 ブラウザ で以下のような スキーマ情報 を見ることができます。

テーブル情報 f:id:sumito1984:20200123020019p:plain

自動生成されたER図 f:id:sumito1984:20200123020012p:plain

これで DB に関係するドキュメント、特に ER図 のメンテナンスから解放されそうです。

ちなみに、mysqldump から読み込ませるやり方はこちらに記載していますので、必要であればご覧いただけますと幸いです。

SchemaSpy で SQLファイル からスキーマ情報を出せるようにした - Tech Tips

それでは!