GitHub Appマニフェストとは
GitHub Appマニフェストとは、あらかじめ設定済みのGitHub Appの登録情報を共有できる仕組みです (マニフェストから GitHub App を登録する - GitHub Docs)。マニフェストにはアプリの権限やイベント、Webhook URLなど必要な設定内容が含まれており、それを使ってユーザーが素早く新しいGitHub Appを作成(登録)できます (Registering a GitHub App from a manifest - GitHub Docs) (マニフェストから GitHub App を登録する - GitHub Docs)。マニフェスト経由でGitHub Appを登録すると、GitHub側で自動的にそのアプリのWebhookシークレット(秘密のトークン)、プライベートキー(PEM形式)、クライアントシークレット、およびGitHub App IDが生成されます (マニフェストから GitHub App を登録する - GitHub Docs)。このようにマニフェストを使うことで、ユーザーは複雑な設定を一から入力する手間を省き、決められた構成でアプリを登録できるのが特徴です。
マニフェストを使ったGitHub App登録フロー
GitHub Appマニフェストを用いた登録フローは、OAuth認証に似た3段階のハンドシェイク手順で行われます (マニフェストから GitHub App を登録する - GitHub Docs)。以下のステップに従って、新しいGitHub Appをマニフェストから登録します。
-
GitHubへのリダイレクトとマニフェスト送信 – ユーザーをGitHubのアプリ作成ページにリダイレクトし、そこでマニフェスト(JSON形式の設定情報)を送信します。具体的には、個人アカウントの場合は
https://github.com/settings/apps/new
(Organizationに作成する場合はhttps://github.com/organizations/組織名/settings/apps/new
)に対して、HTTP POSTでmanifest
というパラメーターを含めてリクエストします (Registering a GitHub App from a manifest - GitHub Docs)。manifest
パラメーターの値はJSONエンコードされた文字列で、これにGitHub Appの設定内容を記述します (Registering a GitHub App from a manifest - GitHub Docs)。必要に応じて、CSRF対策用のstate
パラメーター(推測困難なランダム文字列)も付与できます (Registering a GitHub App from a manifest - GitHub Docs) (マニフェストから GitHub App を登録する - GitHub Docs)。ユーザーがリンクをクリックするとGitHubの「新規GitHub App作成」ページが開き、そこに事前に指定された内容が反映されます(アプリ名はマニフェストで指定していれば編集可能な形で表示され、未指定の場合はユーザーが入力できます (Registering a GitHub App from a manifest - GitHub Docs))。-
マニフェストに含める主な設定項目: マニフェストJSONには以下のようなフィールドを含めます (マニフェストから GitHub App を登録する - GitHub Docs) (マニフェストから GitHub App を登録する - GitHub Docs)。
-
name
: アプリの名称(例:"My GitHub App"
)。省略するとユーザーが作成時に入力します (Registering a GitHub App from a manifest - GitHub Docs)。 -
url
: アプリのホームページURL(必須) (マニフェストから GitHub App を登録する - GitHub Docs)。 -
hook_attributes
: Webhookの設定オブジェクトで、少なくとも受信先のurl
(Webhookペイロードを受け取るサーバーのURL)を指定します (マニフェストから GitHub App を登録する - GitHub Docs)。active
を省略すればデフォルトでtrue
(有効)になります (マニフェストから GitHub App を登録する - GitHub Docs)。 -
redirect_url
: ユーザーがGitHub上でアプリ作成を完了した後にリダイレクトされる先のURLです (マニフェストから GitHub App を登録する - GitHub Docs)。通常これは自分のサービス側のエンドポイントになります。 -
callback_urls
: ユーザーがアプリをインストールして認可した後にリダイレクトするURLのリストです(最大10個まで指定可) (マニフェストから GitHub App を登録する - GitHub Docs)。OAuth連携を併用する場合などに利用します。 -
setup_url
: (任意)アプリインストール後に追加のセットアップが必要な場合に誘導するURL (マニフェストから GitHub App を登録する - GitHub Docs)。 -
description
: アプリの説明文 (マニフェストから GitHub App を登録する - GitHub Docs)。 -
public
: アプリを公開するかどうかのフラグです。true
にするとGitHub上で他のユーザーがインストール可能な公開アプリになり、false
にすると自分(所有者)だけがインストール可能なプライベートアプリとなります (マニフェストから GitHub App を登録する - GitHub Docs)。 -
default_permissions
: アプリがリポジトリやOrganizationに対して要求する権限(アクセス許可)の設定です (マニフェストから GitHub App を登録する - GitHub Docs)。キーに権限名(例:issues
)、値にアクセスレベル(read
またはwrite
など)を指定したオブジェクトで表します (Registering a GitHub App from a manifest - GitHub Docs)。例えば"issues": "write"
のように記述します(詳細な権限名は公式ドキュメントを参照 (Registering a GitHub App from a manifest - GitHub Docs))。 -
default_events
: アプリがサブスクライブするデフォルトのイベントの一覧です (マニフェストから GitHub App を登録する - GitHub Docs)。例えば["issues", "issue_comment"]
のように、Webhookで受け取りたいイベント種類を配列で指定します。 -
request_oauth_on_install
:true
に設定すると、アプリインストール直後にユーザーに対して追加のOAuth認可を要求します (マニフェストから GitHub App を登録する - GitHub Docs)。通常、アプリがユーザーアカウント権限での操作を必要とする場合に使用します。 -
setup_on_update
:true
にすると、ユーザーがアプリのインストール設定を更新した後に、指定したsetup_url
へリダイレクトします (マニフェストから GitHub App を登録する - GitHub Docs)。
-
※上記JSON全体を文字列にエンコードして
manifest
パラメータに設定します。必要な項目をあらかじめ指定しておくことで、ユーザーは最小限の入力(主にアプリ名の確認程度)で済むようになります。例えば、次のようなマニフェストJSONを組み立てて送信できます (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn) (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn):{ "name": "Octoapp", "url": "https://www.example.com", "hook_attributes": { "url": "https://example.com/github/events" }, "redirect_url": "https://example.com/redirect", "callback_urls": ["https://example.com/callback"], "public": true, "default_permissions": { "issues": "write", "checks": "write" }, "default_events": ["issues", "issue_comment", "check_suite", "check_run"] }
-
マニフェストに含める主な設定項目: マニフェストJSONには以下のようなフィールドを含めます (マニフェストから GitHub App を登録する - GitHub Docs) (マニフェストから GitHub App を登録する - GitHub Docs)。
-
GitHubからのリダイレクト受信 – ユーザーがGitHub上で「Create GitHub App」(アプリ作成)を実行すると、GitHubは先ほどマニフェストで指定した
redirect_url
にユーザーのブラウザをリダイレクトします (Registering a GitHub App from a manifest - GitHub Docs)。このリダイレクト先URLには、クエリパラメータとして一時的なcode
(コード)が付与されます (Registering a GitHub App from a manifest - GitHub Docs)。例えば次のように、https://example.com/redirect?code=...
という形式でコードが渡されます (Registering a GitHub App from a manifest - GitHub Docs)。もし先ほどstate
パラメータを付けていれば、それも同様に返ってくるので、リダイレクト先で受け取ったstate
値が送信前のものと一致するか確認することでセキュリティ検証を行います (Registering a GitHub App from a manifest - GitHub Docs)。この
code
は一度きりかつ**短時間(1時間以内)**のみ有効なコードであり、後述の手順でアプリ情報を取得するために使用します (マニフェストから GitHub App を登録する - GitHub Docs) (マニフェストから GitHub App を登録する - GitHub Docs)。 -
一時コードの交換とアプリ情報の取得 – サービス(あなたのアプリケーション)のサーバー側では、受け取った
code
を使ってGitHubのAPIエンドポイントにPOSTリクエストを送り、先ほど作成されたGitHub Appの詳細情報を取得します (Registering a GitHub App from a manifest - GitHub Docs)。このAPIは**「Create a GitHub App from a manifest」**と呼ばれるエンドポイントで、URLは次の形式になります (REST API endpoints for GitHub Apps - GitHub Docs):POST https://api.github.com/app-manifests/<コード>/conversions
(
<コード>
の部分は受け取った一時コードに置き換えてください。)このリクエストに成功すると、応答(JSON)の中に先ほど作成されたGitHub Appの情報が含まれています。具体的には、アプリID (id
)、アプリのスラッグ名 (slug
)、クライアントIDおよびクライアントシークレット(OAuth用)、Webhookシークレット、そしてプライベートキー(pem)などが返ってきます (REST API endpoints for GitHub Apps - GitHub Docs) (REST API endpoints for GitHub Apps - GitHub Docs)。GitHubはWebhookシークレットを自動生成し、プライベートキーもこの時点で発行します (マニフェストから GitHub App を登録する - GitHub Docs)。これらの値はサーバー側で安全に保管し、後続の処理(例えば環境変数に設定してアプリで利用する等)に使用します (Registering a GitHub App from a manifest - GitHub Docs) (マニフェストから GitHub App を登録する - GitHub Docs)。なお、このcode
を使った交換(変換)処理は1時間以内に完了させる必要があります (マニフェストから GitHub App を登録する - GitHub Docs)。時間が経過するとコードは無効となり、再度最初からやり直す必要があります。※上記エンドポイントへのアクセスは、GitHubユーザーの適切な認証コンテキストで行う必要があります(通常、GitHubにログイン済みのユーザーが自分のアカウントにアプリを作成するので、そのユーザー権限でのAPI呼び出しとなります)。エンドポイントは乱用防止のためレート制限があります (Registering a GitHub App from a manifest - GitHub Docs)。
以上がマニフェストフローの基本的な流れです。まとめると、事前定義されたアプリ設定(マニフェスト)をユーザー経由でGitHubに送り、一時コードを受け取り、そのコードを使ってアプリの認証情報を取得するというプロセスになります。この手順により、ユーザーは自分のアカウント(またはOrganization)に新しいGitHub Appを登録し、そのクレデンシャル情報を開発者側(あなたのサービス)が受け取ることができます。
具体的な使用例と実装パターン
上記のマニフェストフローは、実際のWebアプリケーションや統合サービスで広く利用されています。以下に、GitHub APIを活用した実装例や活用シナリオを紹介します。
-
実装例: サーバー側でのコード交換処理 – マニフェストからの登録完了後に受け取るコードを、実際にAPI経由で変換する手順を簡単なスクリプトで示します。例えば、受け取った
code
を使ってcURLコマンドでGitHub APIにリクエストする場合、以下のようになります(必要に応じて認証ヘッダーやAPIバージョンヘッダーを付与):curl -X POST -H "Accept: application/vnd.github+json" \ https://api.github.com/app-manifests/<取得したコード>/conversions
上記のようにリクエストを送信すると、ステータス201(Created)とともにJSON形式の応答が返ってきます (REST API endpoints for GitHub Apps - GitHub Docs) (REST API endpoints for GitHub Apps - GitHub Docs)。応答には先述の通り、
id
,slug
,html_url
(GitHub上のアプリページURL)、client_id
,client_secret
,webhook_secret
,pem
などのフィールドが含まれます (REST API endpoints for GitHub Apps - GitHub Docs) (REST API endpoints for GitHub Apps - GitHub Docs)。これらをパースして保存することで、プログラム上でGitHub Appの認証情報を扱えるようになります。例えばNode.js製のフレームワークProbotでは、このAPI応答を受け取って.env
ファイルにAPP_ID
やPRIVATE_KEY
(pem)、WEBHOOK_SECRET
を自動で書き込み、アプリがすぐに動作できるようにしています (Registering a GitHub App from a manifest - GitHub Docs)。 -
使用シナリオ: Probotによる開発と共有 – ProbotはGitHub App開発向けのNode.jsフレームワークで、マニフェストフローを簡単に利用できるようにしています (Registering a GitHub App from a manifest - GitHub Docs)。Probotでアプリを作成すると、プロジェクト内の
app.yml
ファイルに今回説明したマニフェストの内容(権限やイベント等)を記述します (Registering a GitHub App from a manifest - GitHub Docs)。Probotが生成するローカルのウェブページには「Register GitHub App」というボタンが用意されており、開発者や利用者はそれをクリックするだけでマニフェストに基づいたGitHub Appを自分のアカウントに登録できます (Registering a GitHub App from a manifest - GitHub Docs)。登録後、Probotは自動的に返されたAPP_ID
やPRIVATE_KEY
などを取得し、環境変数経由でアプリケーションにセットします (Registering a GitHub App from a manifest - GitHub Docs)。これにより、開発者は手動でキーをコピーすることなく、すぐにアプリ開発や動作検証を始められます。 -
使用シナリオ: 社内ツールによる大量アプリ作成 – マニフェストフローは社内向けツールでも活用されています。ある事例では、JenkinsとGitHubを統合するために多数のGitHub Appを作成する必要がありましたが、手作業でアプリを一つひとつ登録するのは煩雑でミスが起こりがちでした (Create a GitHub App from a manifest)。そこで社内Webアプリを用意し、GitHub Appマニフェストを利用して必要な設定が事前に施されたアプリを自動作成する仕組みを導入しました (Create a GitHub App from a manifest) (Create a GitHub App from a manifest)。このツールでは、ユーザー(社内管理者)がWeb UI上で必要事項を選ぶと裏側でマニフェストを生成し、GitHubのアプリ作成ページにリダイレクトします。ユーザーがGitHub上で承認すると自社サービスにコードが返り、ツールがそのコードを使って自動的にアプリのIDや秘密鍵を取得・安全な保管まで行います (Create a GitHub App from a manifest)。このようにして各チーム専用のGitHub Appを次々と迅速に作成し、権限設定ミスも防止しています (Create a GitHub App from a manifest)。
-
使用シナリオ: サードパーティサービスでの簡単インストール – 外部の統合サービスでも、マニフェストフローによりユーザーにスムーズな設定体験を提供している例があります。例えば、自前のGitHub Actionsランナーを管理するサービス「RunsOn」では、利用者が2〜3回クリックするだけで自分のOrganizationに必要なGitHub Appを登録できるようマニフェストを活用しています (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn)。ユーザーがサービス上で「GitHub Appを設定する」といったボタンを押すと、裏でマニフェストがGitHubに送られ、すぐにコードが返されます。サービス側でそのコードを交換してアプリの秘密鍵などを取得し、自動的に設定を完了してくれるため、ユーザーは複雑な手順を意識せず統合を利用開始できます (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn)。
これらの例から分かるように、GitHub Appマニフェストによる登録は開発者やサービス提供者にとって非常に便利な手段であり、ユーザーにとってもシンプルな操作で必要なアプリ連携を行えるメリットがあります。
マニフェスト利用のメリット
GitHub Appマニフェストを活用することで得られる主なメリットは以下のとおりです。
-
設定の自動化と迅速化: Webインターフェースで一つひとつ権限やURLを入力してアプリ登録する手間を省けます。クリック数回でアプリ登録と必要情報の取得まで完了するため、セットアップがスピーディーです (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn) (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn)。手動入力に比べてミスも減り、確実に正しい設定でアプリを作成できます (Create a GitHub App from a manifest)。
-
一貫性と再利用性: マニフェスト(JSONまたはYAMLファイル)としてアプリの構成を定義しておくことで、同じ設定を繰り返し再利用できます。例えば開発用・本番用に同じ権限のアプリをそれぞれ作成するといった場合でも、マニフェストを使えば構成のばらつきを防げます (Registering a GitHub App from a manifest - GitHub Docs)。設定内容をリポジトリで管理し、バージョン管理することも可能です (Registering a GitHub App from a manifest - GitHub Docs)。
-
ユーザーへの簡便さ: エンドユーザー(アプリを自分のGitHubアカウントに導入する人)は、複雑な設定手順を踏む必要がありません。開発者側で用意したリンクを踏み、名前を確認して作成を承認するだけで、必要な権限・Webhookが設定されたアプリが自動生成されます (マニフェストから GitHub App を登録する - GitHub Docs) (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn)。特に、GitHubに不慣れなチームメンバーのオンボーディングを助けたり、複雑な統合設定をシンプルにしたりするのに有効です (Registering a GitHub App from a manifest - GitHub Docs)。
-
秘密情報の安全な受け渡し: マニフェストフローでは、アプリのクライアントシークレットやプライベートキー(pem)などの秘密情報をAPI経由で直接取得できます (Registering a GitHub App from a manifest - GitHub Docs)。ユーザーが自分で秘密鍵を生成してコピー・貼り付けするといった手間やリスクを避け、開発者側で安全に受け取り処理できます (Create a GitHub App from a manifest)。これにより、人為的ミスを減らしつつ自動的に自分のサービス内へ鍵情報を取り込めます。
-
コミュニティや顧客との共有: マニフェストは他のユーザーと簡単に共有できます (マニフェストから GitHub App を登録する - GitHub Docs)。例えば自社サービスの利用者に対し、必要なGitHub Appをマニフェスト経由で提供すれば、利用者は自分のアカウントにワンクリックでアプリを用意できます (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn)。GitHub公式マーケットプレイスを通さず独自にアプリを配布したい場合や、GitHub Enterprise環境向けにアプリ設定を配布する場合にも役立ちます (Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs) (Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs)。
以上のように、マニフェストによる方法は迅速・確実なセットアップとシームレスなシークレット共有を実現し、開発・運用上の利点が大きいです。
他のGitHub App登録方法との比較
GitHub Appを登録する方法にはマニフェスト以外にもいくつか選択肢があります。それぞれの特徴を比較すると次の通りです。
-
手動での登録(GitHub設定画面で作成): GitHubの「Developer settings > GitHub Apps」から新規アプリを作成する従来の方法です。フォームに名称や説明、コールバックURL、Webhook URL、必要な権限・イベント等をすべて自分で入力します (Create a GitHub App from a manifest)。作成後、プライベートキーの生成やWebhookシークレットのコピーも自分で行う必要があります。メリットはGitHub上で直接設定できる安心感がありますが、手順が煩雑で入力ミスの可能性があります。また多数のアプリを一貫した設定で作成するには不向きです (Create a GitHub App from a manifest)。
-
URLクエリパラメーターによる事前設定: マニフェストほどではありませんが、あらかじめ設定を埋め込んだカスタムURLを共有してアプリ登録を簡略化する方法もあります (Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs)。例えば、必要なパラメータ(
name
やdescription
、callback_url
、各種権限指定など)をクエリ文字列に含めた専用URLをユーザーに提供すると、そのリンクから開かれるGitHubの登録ページでは値が事前入力された状態になります (Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs) (Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs)。ユーザーは不足項目を補って送信するだけで済むため多少の手間削減になります。ただし秘密情報の自動取得はできないため、結局ユーザーが作成後に自分で秘密鍵を取得してサービス側に登録する必要があります。また、マニフェストのようなコード交換のステップがないため、開発者側が登録完了を自動検知したり情報を直接得たりすることはできません (Create a GitHub App from a manifest)。簡易的なリンク共有で済む反面、完全な自動化にはつながらない点がマニフェストとの違いです。 -
マニフェスト(今回紹介した方法): 上記の通り、ユーザー操作の簡略さと開発者側での自動処理の双方を実現する方法です (マニフェストから GitHub App を登録する - GitHub Docs) (Create a GitHub App from a manifest)。リンク先に事前設定を埋め込みつつ、コードハンドシェイクにより秘密情報を安全に取得できる点で他の方法より優れています。唯一の欠点は、完全にプログラムだけでアプリを登録することはできずユーザーの関与が必要なことです(ユーザーがGitHub上で「作成」を承認するステップは省略できません) (Create a github app programmatically without user interaction? - Stack Overflow)。しかしこれはGitHubのセキュリティポリシー上避けられない部分であり、裏を返せばユーザーに明示的な許可を得たうえで安全にアプリを発行できるとも言えます。
まとめると、手動登録は柔軟ですが手間がかかり、URLパラメーター方式は一部自動化できるものの秘密情報取得には対応していません。それに対してマニフェスト方式はユーザー体験と自動化のバランスが良く、他の方法よりも迅速かつ正確にGitHub Appを展開できる点で優れています (Use GitHub App manifests to symplify your GitHub App registration flow - RunsOn) (Create a GitHub App from a manifest)。用途に応じて使い分けられますが、再現性のある設定や多数展開が求められる場合、マニフェストからの登録が有力な選択肢となるでしょう。 (Registering a GitHub App using URL parameters - GitHub Enterprise Server 3.11 Docs)