LoginSignup
7
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-18

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コンテナ内で動かすのは面倒くさい。どうしようか。悩み中。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6