最近、下記の資料を参考に GitHub Organization の運用を見直しました。
その中で、公開リポジトリ作成を禁止したかったのですが、現在 Team プランを利用しているため、GitHub の機能では実現できませんでした。1
公開リポジトリが作成された際に通知してくれる GitHub Apps はあったのですが、要求される権限が大きかったことや簡単に実現できそうだったので、新規に GitHub Apps を作成することにしました。
GitHub Apps
GitHub Apps は Personal Access Token(PAT) 等を用いずに、GitHub API にアクセスしてリポジトリの操作等を行うことができる機能です。
作成した GitHub Apps は Organization 単位でインストールでき、対象とするリポジトリも選択することができます。
PAT を利用しないため、個人ユーザに紐付かず、運用管理が楽なことや、GitHub API にアクセスする際には都度 short lived な token を発行してアクセスするためセキュリティ面でも安全です。
また event も subscribe することができるので、event を契機に何らかのアクションを実行することもできます。
作成自体は簡単で、GitHub の画面から作成することができます。
よくあるユースケースとして GitHub Action でデフォルトの権限では実現できない際に GitHub Apps を利用します。
Probot
今回、公開リポジトリが作成された際に event を受け取り、通知を行う必要があるため、別途 event を受け取るエンドポイントが必要になります。
1から作成するのは、short-lived な token の発行処理などを自前で書かないといけないため、今回 Probot という GitHub Apps の framework を利用しました。2
既に node がインストールされている環境では下記のコマンドでプロジェクトを作成することができます。
|
|
テンプレートが用意されているので、利用したいものを選択します。今回は basic-js
を選択します。
|
|
雛形作成完了後に app.yaml
という名前のファイルが作成されています。
app.yaml
を編集することで、作成する GitHub Apps の権限を編集することができます。
今回は subscribe する event として、public
と repository
。permission としては metadata:read
のみコメントを外します。
|
|
編集後、npm start
を実行することで、localhost:3000
から GitHub Apps の作成とインストールをすることができます。
インストール後、.env
に ID や SECRET 情報が記載されています。
|
|
smee.io という ngrok のようなサービスと連携するため、再度 npm start
をすると local 上で GitHub からの event を受け取れる状態になります。
コード
index.js
に処理を記載します。リポジトリが作成されたまたは公開されたイベントを受け取る処理は下記のようになります。
|
|
app.on
にそれぞれの event に対応する処理を記載します。
|
|
イベントの種類は下記のドキュメントを参照するか
GitHub 上でリポジトリを作成するなどの、実際にその event が発生する操作をすると、GitHub Apps の設定画面で発行された event を確認することができます。
実際の payload を確認することができるので、デバッグする際にも有用です。
Vercel でホスティング
GitHub からの webhook を受け取るために、どこかにホスティングをする必要があります。
SheepMedical では既に Vercel を利用していることもあり、Vercel の Serverless Functions を利用することにしました。
Serveless Functions で実行する都合上 api/github/webhooks/index.js
に下記のコードを追加します。
|
|
あわせて、root ディレクトリの index.js
も app.js
にリネームします。
.env
に記載されていた必要な環境変数を設定して Vercel にデプロイします。
最後に Github Apps の設定で webhook を Vercel で発行された url に変更します。
実際に公開リポジトリを作成すると下記のようなメッセージが設定したチャンネルに通知されます。
まとめ
GitHub Apps 自体は既に GitHub Action で利用していたのですが、event を受け取っての処理も probot のおかげか簡単に書くことができるなという印象を持ちました。
GitHub Apps を利用することで、セキュアに GitHub 周りの諸々を簡単に自動化できるので、今後も活用していきたいと思います。
最後に
SheepMedical では各種 SaaS を利用したデリバリー改善、サービスの安定性向上、DevSecOps のライフサイクル改善、自動化等に興味がある方を絶賛募集しています。(時期によっては募集を停止していることがあります。)