index.php

https://個人の見解.jp

GitLab CI に tbls で作った ER 図を push してもらう

やりたいこと / この記事に書いてあること

  1. 人間がマイグレーションファイルを変更して Git に push(省略)
  2. GitLab CI が migration を実施して DB を更新(省略)
  3. GitLab CI が 最新のテーブル構成を元に tbls で ER 図を作成(書いてある)
  4. GitLab CI が 作業ブランチに push(書いてある)

やること

1. アクセストークンの作成

  • GitLab の Access tokens 画面でトークンを発行する
    • Role は Developer 以上
    • Scope は write_repository のみでいけるはず(多分)(覚えてない)

Access tokens 画面での登録

2. 変数定義

  • 作成したらコピったトークンを CI/CD Variables に登録
    • VisibilityMasked にする
    • 作業ブランチで使用したいため Protect variable のチェックを外す
  • 他にも使いたい変数があれば定義しておく

CI/CD Variables 画面での登録

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 図の差分がないときには実行しないようにしたほうが実用的かも

関連記事

iliiliiiliili.hatenablog.jp

参考

gitlab-docs.creationline.com

gitlab-docs.creationline.com

docs.gitlab.co.jp