やりたいこと / この記事に書いてあること
- 人間がマイグレーションファイルを変更して Git に push(省略)
- GitLab CI が migration を実施して DB を更新(省略)
- GitLab CI が 最新のテーブル構成を元に tbls で ER 図を作成(書いてある)
- GitLab CI が 作業ブランチに push(書いてある)
やること
1. アクセストークンの作成
- GitLab の
Access tokens
画面でトークンを発行する- Role は
Developer
以上 - Scope は
write_repository
のみでいけるはず(多分)(覚えてない)
- Role は
2. 変数定義
- 作成したらコピったトークンを
CI/CD Variables
に登録Visibility
をMasked
にする- 作業ブランチで使用したいため
Protect variable
のチェックを外す
- 他にも使いたい変数があれば定義しておく
CI_JOB_TOKEN くん、push 権限与えられてなくて草
3. tbls.yml
を定義
接続情報を外部から取れるようにしておく
# tbls.yml dsn: mariadb://${TBLS_DB_USER}:${TBLS_DB_PASSWORD}@${TBLS_DB_HOST}:3306/example
4. .gitlab-ci.yml
を定義
# .gitlab-ci.yml stages: - generate_er generate_er_job: stage: generate_er script: - git config user.email "bot@example.com" - git config user.name "[bot] er diagram generator" - git clone https://oauth2:${CI_JOB_TOKEN}@gitlab.example.com/${CI_PROJECT_PATH}.git repo && cd repo - git checkout ${CI_COMMIT_BRANCH} # ER 図の出力とか - TBLS_DB_USER="${DB_USERNAME}" TBLS_DB_PASSWORD=${DB_PASSWORD} TBLS_DB_HOST="${DB_HOST}" tbls doc --rm-dist - rm ./path/to/dbdoc/* && mv ./dbdoc/* ./path/to/dbdoc/ # 作業ブランチに push - git add ./path/to/dbdoc/* - git commit -m "[🤖bot] Auto-generated ER diagram from ${CI_COMMIT_BRANCH}" - git push origin ${CI_COMMIT_BRANCH} rules: - if: '$CI_PIPELINE_SOURCE == "push"' changes: - path/to/migrations/* # 変更を検知したいディレクトリ
CI_PROJECT_PATH
, CI_COMMIT_BRANCH
は定義済み変数
「こいつ…動くぞ!」になったら成功✌️✌️✌️
最後に
このままだとテーブル構成に変更がない場合(コメントの修正とか)にも commit しちゃうから ER 図の差分がないときには実行しないようにしたほうが実用的かも