wktk's blog

Pull Request 同士のコンフリクトを事前に検出する GitHub Actions を作った

2020 04 15

背景

Pull request をまとめてマージしてみたらいくつかがコンフリクトして面倒、という場面がある。 これがデプロイ作業前のように忙しいタイミングだとややこしいので、マージすると初めてコンフリクトするような Pull request 同士を事前に検出する GitHub Actions を作った。

Marketplace: https://github.com/marketplace/actions/conflibot
Repository: https://github.com/wktk/conflibot

動作

中では下記の流れで処理をしている。

  • pull_request イベントで起動
  • 現在の Pull request を Action 内でマージ
  • マージ先が同一の他の Pull request を取ってきて、git apply --check で適用をチェックしてみる
  • コンフリクトを検出した場合
    • Neutral の commit status を設定
    • Commit status の Details へコンフリクトのある PR, ブランチ、ファイル、行を出力

利点

類似の actions と比べて、次のような利点がある。

  • git apply --check の出力結果を利用しているので「コンフリクトが本当に起きるか」「起きるならどのファイルのどの行か」を比較的正確に取得できる
  • JavaScript 1 の action なので、(Dockerfile のようにビルドが走ることなく) 実行時間が短くて済む

設定

設定ファイルは下記の形式になっている。 (今のところ) あまりオプションはないが、コンフリクトを検出しても無視するファイル名のパターンを指定できるようにしている。

name: conflibot
on: pull_request

jobs:
  conflibot:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Warn potential conflicts
        uses: wktk/conflibot@v1
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          exclude: |
            yarn.lock
            **/*.bin

課題

次のような課題が残っている。

おわりに

自分の使うパターンしかテストしていないので、不具合がある可能性は十分ある。 万一使ってみたという人がいれば、気づいたことがあるときはぜひフィードバックを頂けるとありがたい。


  1. 実装は TypeScript で行い、JavaScript に変換している

Author

@wk

Tags