🚨

マイグレーションファイルに気軽に変更を加えてはいけないテーブルが含まれていないかチェックして注意喚起するGithubActions

2023/04/17に公開

マイグレーションファイルでテーブルに変更を加える際「要注意なテーブル」に対しては慎重になる必要があります。

  • 行数が大きくて実行に時間がかかる
  • オンラインで実行するとロックが出てサービスに支障がでる
  • 絶対に消してはいけない列がある

などなど、いろんな事情はあると思うのですが、とにかく気をつけて確認すべきテーブルというのは存在し得ます。

そこで、そのことに気づきやすくするためのGithubActionsを作成しました。
このGithubActionsを設定しておくことで、以下のようなコメントが投稿されるようになります。

設定ファイルは以下のような形になります。

name: Check Migration

on:
  pull_request:
    types:
      - opened
      - synchronize

jobs:
  check_migration:
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y git grep

      - name: Fetch base branch
        run: |
          git fetch --depth 1 origin ${{ github.base_ref }}:${{ github.base_ref }}

      - name: Check for keywords
        id: check_keywords
        run: |
          TABLES="users|posts|comments";
          found_keywords=$(git diff --name-only --diff-filter=a HEAD ${{ github.base_ref }} database/migrations | xargs grep -lE "Schema::table\([^'\"]*['\"](${TABLES})['\"]") || true
          echo 'FOUND_KEYWORDS<<EOF' >> $GITHUB_ENV
          echo "$found_keywords" >> $GITHUB_ENV
          echo 'EOF' >> $GITHUB_ENV

      - name: Find Comment
        uses: peter-evans/find-comment@v2
        id: fc
        with:
          issue-number: ${{ github.event.pull_request.number }}
          comment-author: "github-actions[bot]"
          body-includes: このプルリクエストには注意が必要なテーブルへのマイグレーションファイルが追加されています

      - name: Comment on PR
        if: env.FOUND_KEYWORDS != ''
        uses: peter-evans/create-or-update-comment@v3
        with:
          issue-number: ${{ github.event.pull_request.number }}
          comment-id: ${{ steps.fc.outputs.comment-id }}
          edit-mode: replace
          body: |
            ⚠️ 注意: このプルリクエストには注意が必要なテーブルへのマイグレーションファイルが追加されています。

            ```
            ${{ env.FOUND_KEYWORDS }}
            ```

            これらのファイルを確認し、マイグレーションの内容を事前に検証してください。

以下の部分を、各プロジェクトに合わせて適宜修正することで、動作するかと思います。

TABLES="users|posts|comments";

まずはこの部分で、テーブル名を | で区切ってリストにします。
次の行で正規表現でコードをgrepしているので、そのための文字列になります。

found_keywords=$(git diff --name-only --diff-filter=a HEAD ${{ github.base_ref }} database/migrations | xargs grep -lE "Schema::table\([^'\"]*['\"](${TABLES})['\"]") || true

次に、ここの database/migrations"Schema::table\([^'\"]*['\"](${TABLES})['\"]" この部分を、各プロジェクトに合わせて修正します。

今回記載してるのは、Laravelの例になりますので、使ってるフレームワークに合わせて修正してください。

database/migrations は Laravel のマイグレーションファイルがあるパスで、 Schema::table は Laravel のマイグレーションファイル内でテーブルに変更を加えるメソッドを抽出する正規表現になります。

試してないですが、Railsだと (change_table|add_check_constraint|add_column|add_foreign_key|add_index|add_reference|add_timestamps|change_column_comment|change_column_default|change_column_null|change_table_comment|create_join_table|create_table|disable_extension|drop_join_table|drop_table|enable_extension|remove_check_constraint|remove_column|remove_columns|remove_foreign_key|remove_index|remove_reference|remove_timestamps|rename_column|rename_index|rename_table|)\s+:(${TABLES})[\s,] のような感じでしょうか。

やってることは差分ファイルを git diff で拾って、 grep でファイルの中身をチェックしてるだけの牧歌的な処理なので、工夫次第でもう少し活用できる場は広そうな処理かもしれません。

TANOMU

Discussion