flyway + SchemaSpy + CircleCI でDDLの構成管理と可視化


# 概要

下記を実現する方法についてまとめます。

- flywayでDDLの構成管理
- SchemaSpyで最新のデータベースメタ情報を可視化
- CircleCIで一連の作業の自動化

# 最終的な流れ

1. DDLの変更をGitHubにプルリクエスト
1. masterにマージ
2. CircleCIが起動
1. flywayが最新のDDLをDBに当てる
  - 今回はCircleCIのローカルDB
1. SchemaSpyが最新のDB定義を元にHTMLを生成
2. GitHubに成果物をpush

## サンプルプロジェクト

https://github.com/su-kun1899/schemaspy-plugin-sample
https://su-kun1899.github.io/schemaspy-plugin-sample/


# 手順

## Mavenプロジェクトの作成

Mavenプロジェクトを作成し、pom.xmlを下記のように定義します。
flywayのmavenプラグインと、schemaspyのmavenプラグインを設定しています。

※schemaspyプラグインは現在mysqlしか対応していません


```xml
<project>
...
    <build>
    ...
        <plugins>
        ...
            <plugin>
                <groupId>red.sukun1899</groupId>
                <artifactId>schemaspy-maven-plugin</artifactId>
                <version>1.1.0</version>
                <configuration>
                    <databaseType>${database.type}</databaseType>
                    <host>${database.host}</host>
                    <user>${database.user}</user>
                    <dbName>${database.dbName}</dbName>
                    <outputDirectory>docs</outputDirectory>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>4.0.3</version>
                <configuration>
                    <url>jdbc:${database.type}://${database.host}:3306/${database.dbName}</url>
                    <user>${database.user}</user>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.6</version>
                    </dependency>
                </dependencies>
            </plugin>
        ...
        </plugins>
    ...
    </build>
...
</project>
```

### DDLの配置

`src/main/resources/db/migration/`配下に、flywayのルールに則ってSQL（DDL）を配置します。

例えば`V1_0_0__initial.sql`といった具合です。

### GiHubの新規リポジトリへpush

GitHubの新規リポジトリを作成し、作成したプロジェクトをpushします。

## GitHubリポジトリとCircleCIの連携


下記を参考に、連携させます。
http://qiita.com/kooohei/items/4806fdb6b92982e47f81

### CircleCIの設定

下記のURLから、対象のリポジトリを選択します。
https://circleci.com/add-projects

[project settings]→[Environment Variables]から、`GITHUB_USER_EMAIL`と`GITHUB_USER_NAME`を環境変数として設定します。

[project settings]→[SSH Permissions]にGitHub用のSSH Keyを登録します。
hostnameは`github.com`です。
※CircleCI用のKeyを新たに作成し、GitHubに公開鍵を登録しておくことを推奨

### circle.ymlの作成

CircleCI用の設定ファイルを作成し、pushします。

下記の流れになっています。

- databaseを作成
- flywayプラグインの実行
- schemaspyプラグインの実行
- 生成したHtmlをGitHubにpush


```yml
machine:
  java:
    version: oraclejdk8
general:
   artifacts:
     - "docs"
database:
  post:
    - mysql -u root --execute "create database if not exists sample character set utf8"
dependencies:
  override:
    - mvn dependency:resolve
test:
  pre:
    - mvn flyway:info
  override:
    - mvn flyway:migrate
  post:
    - mvn flyway:info
deployment:
  deploy:
    branch: master
    commands:
      - mvn schemaspy:schemaspy
      - git config --global user.email ${GITHUB_USER_EMAIL}
      - git config --global user.name ${GITHUB_USER_NAME}
      - git add -A
      - git commit ./docs/* -m "Update schemaSpy html [ci skip]"
      - git push git@github.com:su-kun1899/schemaspy-plugin-sample.git $CIRCLE_BRANCH
```

## GitHub Pagesの設定

下記を設定すると、GitHub Pagesで見られるようになります。
http://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096

※ただし、GitHub Pagesはprivateリポジトリであってもpublicになってしまうので注意

CircleCIはartifactというストレージ機能があるので、そちらを利用すると、参照可能です。
https://circleci.com/docs/build-artifacts/


前述のサンプルプロジェクトはそちらも対応しているので参考にしてみてください。

# 参考

- [CircleCIでbuildとgitへのpushを実施する](http://yyyank.blogspot.jp/2016/06/circlecibuildgitpush.html)