はじめに
CI/CDの改善、効果測定のためにGitHubの情報を分析したり、ボットを作る機会があると思います。
今回は、Personal Access Tokenではなく、GitHub Appsを使ってREST APIを実行するところまでやってみます。
使用する言語はPythonです。
はじめてGitHub Appsを触るので、1つずつ確認します。
環境
GitHub Appsを作成する
GitHubにログイン後、画面右上にある自分のアイコンをクリックします。そこにSettings
があるので、クリックして移動します。
画面左にナビゲーションがあるので、一番下のDeveloper settings
をクリックします。
するとNew GitHub App
というボタンが出てくるので、このボタンをクリックします。
GitHub App name
などの赤いアスタリスク*がついている必須項目を入力します。
このとき、赤枠で囲ったExpipre user authorization tokens
にチェックを入れます。
GitHub App name
は一意でないといけないので、今回は名前のサフィックスに雑に文字を入れています。
名前は GitHub 全体で一意である必要があります。 既存の GitHub アカウントと同じ名前を使用することはできません。
https://docs.github.com/ja/apps/creating-github-apps/creating-github-apps/creating-a-github-app
Permissionは Organization permissions
やAccount permissions
がありますが、今回はRepository permissions
の以下の表にあるpermissionを付けます。(App作成後も変更ができるので、必要に応じて後から追加できます。)
name | permission |
---|
Actions | Read-only |
Contents | Read and write |
Metadata | Read-only |
Pull requests | Read-only |
permissionの設定が終わったらCreate GitHub App
をクリックして作成します。
作成が完了すると、 https://github.com/settings/apps/{app-name} のURLに行けるようになります。
https://github.com/settings/apps/{app-name} から下にスクロールするとPrivate keyを作成できます。
Generate a private key
のボタンを押します。
続いてInstall App
に移動し、Install
のボタンをクリックします。
Appの作成と準備はここで終わりです。
参考: GitHub App を作成する
jwtを生成する
GitHub アプリの JSON Web トークン (JWT) の生成を参考にjwtを生成します。
installation_idを取得する
トークンを作成するためにinstallation_idが必要なので、installationの一覧を取得します。
ハイライトした行を追加します。
List installations for the authenticated app
installation_id
が取れたので、次にトークンを発行します。
アクセストークンを発行する
URLを変更してアクセストークンを発行します。
無事 tokenが取れました。
Create an installation access token for an app
プライベートリポジトリの情報を取得する
tokenが取れるようになったので、プライベートリポジトリの情報を取得してみます。
Get a repository
まとめ
イメージしやすいように、あえてリファクタをせず、少しずつコードを付け足す形で実行してみました。
REST APIのドキュメントはGitHub APIについてにあるので、このページを見ながらGitHubを操作することができるようになりました。
APIのURLと権限の関係はGitHub Appに必要な権限を見ながら確認するといいと思います。
もし権限を正しく渡しているにもかかわらずResource not accessible by integration
が返ってくる場合は、APIがGitHub Appに対応しているかドキュメントを見て確認した方が良いです。
対応しているAPIは以下の画像のようにチェックマークが付いてます。
使ったコードは、blog-code/2023/04/github-rest-apiに置いています。
参考