SchemaSpyが復活したけど、CircleCIで自動生成させるのは意外に面倒。というかスキーマ設計の周辺ツールがどうにもダルいので、なんかザクザク刻める環境を作りたい。作ってみた。
リポジトリに mysql/ddl.sql を置く
まずは空ファイルで
mkdir mysql
touch mysql/ddl.sql
リポジトリに docker-compose.ymlを置く
database:
image: circleci/mysql:5.7
restart: always
ports:
- 3333:3306
volumes:
- "./mysql:/docker-entrypoint-initdb.d"
environment:
- MYSQL_ALLOW_EMPTY_PASSWORD:yes
- MYSQL_DATABASE:circle_test
- MYSQL_HOST:127.0.0.1
- MYSQL_USER:root
# http://localhost:8080/?server=database&username=root
adminer:
image: adminer
restart: always
ports:
- 8080:8080
links:
- database
adminerでスキーマ編集してmysqldump
起動。
docker compose up -d
潰して作り直すならこのように。
docker compose stop; docker compose rm -f; docker compose up -d
http://localhost:8080/?server=database&username=root にアクセスして、スキーマ編集。テーブル、インデックス、ビューなどなど。
これをmysqldumpして mysql/ddl.sql をgitコミット。
docker exec database sh -c 'exec mysqldump -h 127.0.0.1 -u root -d circle_test' > ./mysql/ddl.sql
リポジトリに ./.circleci/config.yml を置く
build-erd みたいな名前のジョブを定義。通常のユニットテストとは分離しておきたいのでこのように。
version: 2
workflows:
version: 2
build:
jobs:
- build
- build-erd
jobs:
# 通常のユニットテストはこちらに
build:
docker:
- image: circleci/php:7.1-apache-node-browsers
steps:
- checkout
- run:
command: "php -v"
# schemaspyによるERD生成
build-erd:
docker:
- image: schemaspy/schemaspy:snapshot
user: root # このイメージの起動ユーザーが「java」にされてて細部不都合があった。強引にこれで起動
- image: circleci/mysql:5.7
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_DATABASE: circle_test
MYSQL_HOST: 127.0.0.1
MYSQL_USER: root
steps:
- checkout
- run:
name: 欲しいものは https://pkgs.alpinelinux.org/packages で探してインストール
command: |
apk update
apk add openssl mariadb-client
- run:
name: dockerizeコマンドをインストール
command: |
wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
environment:
DOCKERIZE_VERSION: v0.3.0
- run:
name: mysqlが起動して接続可能になるのを待つ
command: dockerize -wait tcp://localhost:3306 -timeout 1m
- run:
name: MySQLにDDL投入
command: cat /root/project/mysql/ddl.sql | mysql -h 127.0.0.1 -P 3306 -u root circle_test
- run:
name: ERD生成
command: cd / && /entrypoint.sh -t mysql -host 127.0.0.1 -port 3306 -u root -db circle_test -s information_schema -hq -connprops useSSL\\=false
- store_artifacts:
path: /output
destination: reports
CircleCIのartifactsにER図が...!!
いやーいいですね。
でもこれ書いてる時点では、information_schemaのビューも雪崩込んできてて、邪魔くさいのでどうにかしたい。
mysql/ddl.sql に他の誰かが更新したら
gitで最新をもってきて、潰して作り直せば、手元も最新のDDLになります。
docker compose stop; docker compose rm -f; docker compose up -d
今後は
プロジェクト初期はそこそこ捗るはず。人数が多いとコンフリクトがつらいかも。
さらにDBマイグレーションツールが絡んでくると、schemaspyのdockerコンテナ内で動かすのは面倒くさい。どうしようか。悩み中。