actions/create-github-app-token でほかのリポジトリを操作できなかった話

Today I Learned

TL;DR

  • actions/create-github-app-token の v1.2.1 時点では、生成された GitHub App のインストールアクセストークンで別のリポジトリを操作できない
    • GitHub Actions から別のプライベートリポジトリを clone するという操作が不可能
  • ほかのリポジトリを操作できるインストールアクセストークンを生成するには、これまで通り自前で実装するかサードパーティの action を利用する必要がある
  • 別のリポジトリを操作したいという Issue が登録されているので、対応されるのを待ちたい

背景

GitHub Actions で インストールアクセストークン(以降、GitHub App トークン)を生成するには次の 2 つの方法をとる必要があった。

  • サードパーティの action を利用する
  • GitHub App トークンを取得する処理を自前で実装する

このブログでも、サードパーティの action を使って GitHub App トークンを利用する方法を記事にした。

GitHub Personal Access Token の代わりに GitHub App のインストールアクセストークンを使って GitHub Actions を実行する手順を説明する
ひよこまめ

そんな中、ついに GitHub が GitHub App トークンを生成する action を提供していることが、X(旧 Twitter)で話題になっていた。
早速、これまで使っていたサードパーティの action からこの action に置き換えてみたが、プライベートリポジトリを clone できなかった。

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.2.1

Warning

以下のワークフローは動きません。

name: Clone a private repository

on: pull_request

jobs:
  clone:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    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 }}

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

原因

ソースコード を読んでみると、GitHub App トークンを生成する箇所の repositoryNames の引数に、自分自身のリポジトリ名だけを渡していた。

lib/main.js(一部抜粋)
// https://github.com/actions/create-github-app-token/blob/49ce228ea7cddec9f88dd09c5b7740dbac82d7ba/lib/main.js

// Get owner and reponname from GITHUB_REPOSITORY
const [owner, repo] = repository.split("/");

// ...省略...

const authentication = await auth({
  type: "installation",
  installationId: installation.id,
  repositoryNames: [repo], // 自分自身のリポジトリ名だけを渡している
});

このため、操作対象のリポジトリに GitHub App をインストールしたとしても、ワークフローを動かすリポジトリのみに操作対象が絞られてしまう。
v1.2.1 時点では、action のオプションから操作できるリポジトリを渡せるようにはなっていない。
リポジトリの README にも、次のように記載されている。

The token is scoped to the current repository.

まとめ

この記事を執筆している時点で最新バージョンである v1.2.1 の actions/create-github-app-token では、生成した GitHub App トークンで操作できるのは自分のリポジトリのみである。
そのため、GitHub Actions からプライベートリポジトリを clone するなど、ほかのリポジトリを操作する場合には、自前で実装するかサードパーティの action を利用する必要がある。
ただ、別のリポジトリを操作したいという Issue が登録されているので、対応されることを期待している。