actions/create-github-app-token でインストールアクセストークンを発行しほかのリポジトリを操作する

Today I Learned
Info

2023 年 10 月 8 日 追記
actions/create-github-app-token v1.3.0 以降では、ワークフローから別のリポジトリを操作できるようになったため、この記事の内容を修正している。

この記事では、GitHub が提供する actions/create-github-app-token を使って、GitHub App のインストールアクセストークン(以降、GitHub App トークン)を発行し、プライベートリポジトリをクローンする方法を説明する。

GitHub App トークンを生成する方法

GitHub Actions で GitHub App トークンを生成するには次の 2 つの方法がある。

  • action を利用する
  • GitHub App トークンを取得する処理を自前で実装する

GitHub App トークンを生成できる action のひとつに、GitHub が提供する actions/create-github-app-token がある。
リポジトリを操作するトークンを扱うため action の利用には慎重にならざるを得ないが、GitHub が公式に出している actions であればサードパーティ製の action より安心して利用できる。

GitHub Action for creating a GitHub App Installation Access Token - GitHub - actions/create-github-app-token: GitHub Action for creating a GitHub App Installation Access Token
GitHub

動作を確認したパージョン

actions/create-github-app-token v1.5.0

GitHub App のセットアップ

最初に、GitHub App をセットアップする。
セットアップでは以下の作業を実施する。

  1. GitHub App を作成し、GitHub App で生成するトークンの権限を設定する
  2. 秘密鍵を発行する
  3. 次のリポジトリに GitHub App をインストールする
    • ワークフローを実行するリポジトリ
    • clone するプライベートリポジトリ
  4. ワークフローを実行するリポジトリに、GitHub App の ID と秘密鍵を登録する

これらの手順の詳細は、過去に書いた記事を参照してほしい。
GitHub App インストールアクセストークンを使って GitHub Actions を実行する:GitHub App のセットアップ

ワークフロー

次の内容で、ワークフローファイルを追加する。

プライベートリポジトリを clone するには、clone するリポジトリのオーナー(ユーザー名または組織名)を owner に指定する必要がある。
次のワークフローでは、ワークフローを実行するリポジトリと、clone するリポジトリが同じオーナーと仮定し、owner には github.repository_owner を指定している。

name: Clone a private repository

on: workflow_dispatch

jobs:
  clone:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    env:
      OWNER: ${{ github.repository_owner }}
    steps:
      - name: Generate GitHub App Token
        id: app_token
        uses: actions/create-github-app-token@v1
        with:
          app-id: ${{ secrets.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}
          owner: ${{ env.OWNER }} # 操作したいリポジトリのオーナーを指定する

      - name: Clone private repository
        env:
          GH_TOKEN: ${{ steps.app_token.outputs.token }}
        run: |
          # クローンするプライベートリポジトリ名に応じて <REPO_NAME> を書き換える
          git clone https://x-access-token:"$GITHUB_TOKEN"@github.com/${{ env.OWNER }}/<REPO_NAME>.git
          ls -la

動作確認

ワークフローのトリガーに workflow_dispatch を指定しているため、手動でワークフローを実行する。
実行すると、無事にプライベートリポジトリを clone できていることを確認できる。
スクリーンショット:プライベートリポジトリが clone されている