どうも、昨日結婚した者です。
僕は普段、基盤チームとしていろいろな仕組みを社に展開しているのですが、例えば利用しているDockerイメージなどの変更に伴い全社のすべてのリポジトリを書き換えたいことがあります。そういうときは数によっては、ちまちまCloneして書き換えてpushしたり、Issueを立てて同僚と協力してローラー作戦をすることもあります。こういった作業をもう一生やりたくないと思ったので、Github APIベースで、コンテンツを取得して、書き換えて、PRするというコードを書きました。Cloneしない実装になっているのでレートリミットに気をつければ、少ないリソースで書き換えを行うことができます。
実行方法
Docker Imageでまとめてあるので、コマンドラインから環境変数を渡します。GHESを利用する場合は -e GITHUB_API=https://your-server/api/v3
のようにAPIのエンドポイントも渡してください。
$ docker run -e GITHUB_TOKEN=$GITHUB_TOKEN -e CONFIG_PATH=/tmp/config.yml -v `pwd`/config.yml:/tmp/config.yml pyama/github-replacer
設定ファイルは下記のようなフォーマットです。
# config.yml
update-self-hosted-runner: # ルール名、ログなどで使用
repo_pattern: "pyama86/.*" # リポジトリを絞る正規表現
file_pattern: ".github/.*" # ファイル名を絞る正規表現
content_pattern: "runs-on: self-hosted" # 置換対象文字列の正規表現
replace: "runs-on: normal" # 置換後文字列
実行するとこんな感じのPRが出来上がります。
それなりの規模の開発をやっていると、全リポジトリ書き換えたい!!!という動機はそれなりにあると思うので、ご活用いただければ幸いです。