こんにちは!アドベントカレンダー2本いっちゃう?と言われ営業さんもびっくりな「はい!もちろん書かせていただきます!」と元気よく返事をしてしたもののネタに困っていたガチムチですが、藁にもすがる思いで見つけたGithubネタを投稿します。
とある日のこと
自分が所属しているチームで管理しているrepositoryにPRを作成しレビュー依頼を行いました。
そのときにPR画面に大きな違和感を感じました。
あれ?これ、マージできるぞ!
設定を確認するとブランチのプロテクションルールが私の財布のように空っぽでした。
1匹いるなら...
こういった問題は、1つあると全体的に疑わしくなってします。まるで1匹いると何匹もいる奴らのようです。
チームで管理しているレポジトリを足元良し!の要領で1つずつチェックしていくのは、屈強なメンタルと絶対に間違えない自負が必要となります。
もちろん私のような一流の窓際コピペエンジニアには、そんなものは持ち合わせてないので、なんとか自動化(コピペ)できないかと考えました。
最初はPRのテンプレートをrepositoryに添えるような感覚で同じようなものがないかと血眼になって探しました(10分ぐらい)が見つかりませんでした。(もしかしたらあるかも)
アドベントカレンダーも差し迫った日曜に「ちょっと今日調べ物が、、、」と嫁に言うも「あ?」と言われ、休日のママリバティのために精根尽き果てるまで公園戦士にジョブチェンジさせられた私は、子供に「一人で滑り台滑ってきてよ」と謎のクエストを実行させられているときにGithub API使ってなんとかしようと決意しました。
ちなみに滑っている最中は誰も見てなくて、なんかただただ滑った人みたいになっていました。滑り台だけに。
結局どうなったか?
一流の窓際コピペエンジニアは翌営業日の朝までになんとかすればいいと知っています。だから窓際コピペエンジニアなのです。
とりあえず、間に合ったということで雑なシェルを載せてきます。
私が所属しているチームでは、Githubのチームに管理するrepositoryをすべて入れているので、Githubのチームから辿るようにしました。
また、もし設定が入っていないrepositoryは最低限の設定を追加するようにしました。
※jqがインストールされてないと動きません。
#!/bin/bash
ORG="オーガニゼーション"
TEAMS="チーム"
BASIC="ユーザー名:パーソナルトークン"
# repositoryの一覧を取得する(アーカイブされたrepositoryは除く)
REPOSITORIES=(`curl -s -u $BASIC https://api.github.com/orgs/$ORG/teams/$TEAMS/repos | jq -r '.[] | select(.archived == false) | .name'`)
for REPOSITORY in "${REPOSITORIES[@]}"
do
# defaultブランチ名を取得
DEFAULT_BRANCH=`curl -s -u $BASIC https://api.github.com/repos/$ORG/$REPOSITORY | jq -r .default_branch`
# プロテクションが行われているか?
IS_PROTECTED=`curl -s -u $BASIC https://api.github.com/repos/$ORG/$REPOSITORY/branches/$DEFAULT_BRANCH | jq .protected`
if "${IS_PROTECTED}"; then
echo $REPOSITORY $DEFAULT_BRANCH is protected.
else
# プロテクションが行われていないときに、最低限のプロテクションをセットする
echo $REPOSITORY $DEFAULT_BRANCH is not protected.
curl -s -u $BASIC -X PUT https://api.github.com/repos/$ORG/$REPOSITORY/branches/$DEFAULT_BRANCH/protection -d '{"required_pull_request_reviews": {"dismiss_stale_reviews": true,"require_code_owner_reviews": false,"required_approving_review_count": 1}, "enforce_admins": false, "required_status_checks": null, "restrictions": null}'
echo update $REPOSITORY $DEFAULT_BRANCH protects
fi
done
最初設定が入っていないrepositoryの一覧を表示するだけにしたのですが、結局設定を入れるので、apiで行うようにしました。
本当はciとのインテグレーションがあったらうんぬんかんぬんしてもっと上質なプロテクションルールにしたかったのですが、めんどくさかった最低限の設定を入れるにとどめておきました。
まとめ
Githubのapiをまともに触ったことなかったのですが、repositoryの情報やprotectionの設定をかなり詳細に取得できるので、もともとやりたかったprotectionの設定をtemplate化してrepositoryに添えると勝手に設定を反映させてくれたり、設定と違ったら(なんかallow_forcepushがonになっているアルとか)教えてくれたりするものがあってもいいなーと思いました。
一年通してrepositoryの管轄部署が変わったりすることがあると思います。それ以外にも古からオーパーツのように存在するrepositoryを管理していたり、大量のrepositoryを管理しているチームなどがあったら、年の瀬の大掃除ということで、一度プロテクションルールをチェックしてみてはいかがでしょうか。