マイグレーションファイルに気軽に変更を加えてはいけないテーブルが含まれていないかチェックして注意喚起するGithubActions
マイグレーションファイルでテーブルに変更を加える際「要注意なテーブル」に対しては慎重になる必要があります。
- 行数が大きくて実行に時間がかかる
- オンラインで実行するとロックが出てサービスに支障がでる
- 絶対に消してはいけない列がある
などなど、いろんな事情はあると思うのですが、とにかく気をつけて確認すべきテーブルというのは存在し得ます。
そこで、そのことに気づきやすくするための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
でファイルの中身をチェックしてるだけの牧歌的な処理なので、工夫次第でもう少し活用できる場は広そうな処理かもしれません。
Discussion