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

GitHub Action for creating a GitHub App Installation Access Token - actions/create-github-app-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 されている