CircleCI2.0でSchemaSpyでER図を生成しつつ、高速でスキーマ設計するテンプレ

SchemaSpyが復活したけど、CircleCIで自動生成させるのは意外に面倒。というかスキーマ設計の周辺ツールがどうにもダルいので、なんかザクザク刻める環境を作りたい。作ってみた。

# リポジトリに mysql/ddl.sql を置く

まずは空ファイルで

```shell-session
mkdir mysql
touch mysql/ddl.sql
```

# リポジトリに docker-compose.ymlを置く

```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

起動。

```shell-session
docker compose up -d
```

潰して作り直すならこのように。

```shell-session
docker compose stop; docker compose rm -f; docker compose up -d
```

http://localhost:8080/?server=database&username=root にアクセスして、スキーマ編集。テーブル、インデックス、ビューなどなど。

これをmysqldumpして mysql/ddl.sql をgitコミット。

```shell-session
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 みたいな名前のジョブを定義。通常のユニットテストとは分離しておきたいのでこのように。

```yml
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になります。

```shell-session
docker compose stop; docker compose rm -f; docker compose up -d
```

# 今後は

プロジェクト初期はそこそこ捗るはず。人数が多いとコンフリクトがつらいかも。

さらにDBマイグレーションツールが絡んでくると、schemaspyのdockerコンテナ内で動かすのは面倒くさい。どうしようか。悩み中。