任意のPull Requestの内容を複数のリポジトリに対して一括コピーするツールpr-bulletを作った

GitHub Actions便利ですよね。

ペパボではGitHub Enterprise Server(以下、GHES)が運用されており、GHESでもGitHub Actionsが利用できます。

uses: だけで利用できるリポジトリを横断で再利用可能なActionの存在はかなり生産性を上げていると思います。

そういった便利なワークフローを複数のリポジトリに対して適用していきたいことが時々あります。

一気に複数のリポジトリに同じワークフローを適用したいこともあれば、「あ、このリポジトリにはあのリポジトリのワークフローをいれたほうがいいな」となることもあります。

その時、それぞれのリポジトリに対して「突然のデフォルトブランチへのpush」はあまりにも乱暴なのでPull Requestを作成していくことになります。

ただ、適用したいレポジトリが2桁あったとき、Pull Requestを作成するのも心が折れそうになります。

そこで、任意のPull Requestの内容を他の複数のリポジトリに対して「コピーPull Request」として一括作成するツールpr-bulletを作ってみました。

github.com

pr-bullet

ちなみに、同様の、pr-bulletよりも高機能なツールとして NerdWalletOSS/shepherd があります。

それなのに、なぜわざわざ作ったかというと

  • 単機能で迷わない
  • 設定ファイルが必要ない
  • 全てオンメモリで完結

を実現したかったからです。

pr-bulletの使い方は簡単で、

  1. どこか適当なリポジトリでオリジナルとなるPull Requestを作成
  2. pr-bulletを実行して指定のリポジトリへPull Requestをコピー

で終わりです。

実行している様子は以下のような感じです。

$ pr-bullet https://github.com/k1LoW/my-bullets/pull/3 k1LoW/tbls k1LoW/ndiag
Original pull request:
  Title ... Add allow-auto-merge label action using ghdag
  URL   ... https://github.com/k1LoW/my-bullets/pull/3
  Files ... 34
Target repositories:
  k1LoW/tbls, k1LoW/ndiag
Do you want to create pull requests? (y/n) [y]: y

Copying k1LoW/my-bullets pull request #3 to k1LoW/tbls ... https://github.com/k1LoW/tbls/pull/999 as draft
Copying k1LoW/my-bullets pull request #3 to k1LoW/ndiag ... https://github.com/k1LoW/ndiag/pull/333 as draft
$

実際は

  • 追加もしくは修正したファイルのみサポート(削除やリネームは未対応)
  • ファイルのパーミッションは一律 100644 v0.3.0 で修正しました
  • オリジナルPull Requestのコミットは強制で1つにまとめられる
  • ラベルやAssigneesはコピーされない

といった感じで本当の意味での「コピー」ではないのですが、それでも毎回Pull Requestタイトルや文章をコピペしなくて良いだけだいぶ楽です。

とりあえず社内のGHESに k1low/my-bullets リポジトリを作成して、Pull Request発射基地としてみました。

1コマンドでPull Requestがコピーできてしまうので、ついつい濫用しそうですが気をつけていこうと思います。