GitHub ActionsでPrivate Repositoryをcloneする際にGitHub Appsで発行したtokenを使う

#GitHub

背景

GitHub Actions で CI を実行する際に、職場の Organization 内にある Private Repository で管理している package を clone したい場合 API Token が必要になる。Personal Access Token (PAT)を使うのが最も手軽だが、特定アカウントにひも付き expiration 設定も推奨なので CI 用途に向いていない。Deploy Keys を利用する方法もあるがアクセスするリポジトリ毎に秘密鍵の設定が必要だったり運用上のネックがある。

ここでは Organization に自前の GitHub Apps をインストールし、CI 実行時に短時間の有効期限付き token を払い出してもらって使用する手順を書く。

GitHub Apps の作成方法

Token を発行するための GitHub Apps 作成方法は詳しい記事が幾つかあって参考になった。

今回のように別の Private Repository を clone したい場合は Apps の権限で Contents に Read-only を指定しておけば事足りる。

あとは App ID と作成した Private Key を GitHub Actions の Secret に登録して下準備は終わり。

Token の発行と利用

GitHub Actions での Token 発行は getsentry/action-github-app-token などを使えば簡単。たとえば Private Repository で管理している npm package を利用する workflow は以下のようになる。

- name: Get GitHub API token id: get-github-token uses: getsentry/action-github-app-token@v1 with: app_id: ${{ secrets.CI_GITHUB_APP_ID }} private_key: ${{ secrets.CI_GITHUB_APP_PRIVATE_KEY }} - name: Install packages env: GITHUB_TOKEN: ${{ steps.get-github-token.outputs.token }} run: | git config --global url."https://x-access-token:$GITHUB_TOKEN@github.com/org-name/".insteadOf git@github.com:org-name/ npm install

余談として GitHub Apps から発行した token で HTTPS アクセスを行う場合 Basic 認証の ID に x-access-token、password に token を指定しておく必要がある。

Installations with permissions on contents of a repository, can use their installation access tokens to authenticate for Git access. Use the installation access token as the HTTP password

Authenticating with GitHub Apps - GitHub Docs

普段 PAT 等を利用する場合は ID に token を指定し、 password はx-oauth-basic、もしくは省略できる。

you can simply use an OAuth token for the username and either a blank password or the string x-oauth-basic when cloning a repository.

Easier builds and deployments using Git over HTTPS and OAuth | The GitHub Blog

こちらの形式に慣れていたので GitHub Apps の作法を知らず、repository へのアクセスが失敗して地味にハマったのだった。

Tweet