やりたいこと
- CIでDBのテーブル設計書を自動で作成したい
実現方法
tbls という対象のDBにアクセスしてMarkdownのドキュメントを自動で生成するツールを使います。
実際の流れとしては、以下のようになります。
- CI環境でDBのコンテナを起動
- golang ORM gormの オートマイグレート機能で、golangのstructから、自動でテーブルを作成
- tbls でDBのコンテナにアクセスし、ドキュメントを自動生成
実際の構成
プロダクトコードのリポジトリ内に以下のようなソースファイルを用意します。
このコードは、プロダクトコードの中で普通に利用されるModelでもあります。
github.com/xxxx/product/models/user.go
package models
import (
"github.com/jinzhu/gorm"
)
type User struct {
gorm.Model
Name string `gorm:"type:varchar(32)"`
MailAddress string `gorm:"type:varchar(255)"`
Age int `gorm:"type:int(11)"`
}
ドキュメントを管理するリポジトリ内に以下のようなソースファイルを用意します。
今回はMySQLを利用してますが、 tbls はPostgreSQLやsqliteにも対応しています。
github.com/xxxx/product/main.go
package main
import (
"fmt"
"os"
"github.com/jinzhu/gorm"
// MySQL driver
_ "github.com/go-sql-driver/mysql"
"github.com/xxxx/product/models"
)
func main() {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8",
os.Getenv("MYSQL_USER"),
os.Getenv("MYSQL_PASSWORD"),
"mysql",
"3306",
os.Getenv("MYSQL_DATABASE"),
)
dbCon, err := gorm.Open("mysql", dsn)
if err != nil {
println(err.Error())
os.Exit(1)
}
dbCon.AutoMigrate(&models.User{})
println("Done.")
return
}
CI環境内で上記の main.go
を実行してあげるだけでDBコンテナに自動でテーブルが作成されるので、
以下のように CI環境内で tbls
を実行するだけでドキュメントが自動生成されます。
生成されたドキュメントは、マークダウンなのでそのままgithubにコミットして管理することができます。
script:
- go run main.go
- tbls doc --force mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql/${MYSQL_DATABASE} ./docs
まとめ
これだけの設定で、実際のプロダクトコードで管理しているgolangのModelが変更されると自動でテーブル設計書も更新するということができました。
tbls については、以下のページに更に詳しく書かれています。