go mod vendorについて調べてみた記事の中でPersonal Access Token(PAT)を使用して一時的にprivateリポジトリの中を閲覧するができるようにしました。
今回、そのような一時的なPATの発行で利用したactions/create-github-app-tokenについて調べてみようと思います。
actions/create-github-app-tokenとは
Github Appにaccess tokenをインストールさせることのできるactionです。
Github Appとは、Githubの機能を操作することで、特別なユースケースでも対応できるように機能を拡張させることのできるツールです。
特定のニーズやワークフローに合わせて、GitHubの動作や表示をカスタマイズしたり、自動化したり、他のツールと連携させたりすることができます。
先述したactionを使うことで、Github Appにリポジトリの閲覧権限などを付与することができ、安全にGithub Appに権限を一時的に付与することができます。
actions/create-github-app-tokenを使うメリット
1.一時的にaccess tokenを発行できる
まず、PATを発行してGithub Appに登録することがなぜ良くないのか説明します。
PATは、複数の権限を設定できるのと同時にExpireDateとして有効期限を設定できます。
ここでExpireDateに有効期限を設定した場合と無期限にした場合で2つ考えてみようと思います。
-
有効期限を設定した場合
有効期限を設定した場合、有効期限が切れた場合に手動でPATを発行し直す必要が出てきます。 -
無期限にした場合
無期限にした場合、有効期限を設定した場合と違い、メンテナンスの必要はなくなりますが、万が一PATが漏れた場合に悪用される可能性があります。
これに関してはもちろん有効期限内であった場合も同様です。
このように、PATの手動発行は、メンテナンスの難しさとセキュリティリスクという点で課題を抱えています。
actions/create-github-app-tokenを使用することで、有効期限が1時間のaccess tokenがworkflowの実行時に適宜自動発行されることになるので、再発行といったメンテナンスや有効期限を設定しなくてもよくなるので、手動発行よりも安全に発行することができます。
2.公式のactionとして利用することができる
actions/create-github-app-tokenが登場するよりも前にサードパーティー製のactionが登場していました。
しかし、サードパーティ製だと公式のactionと比較して、セキュリティ的な面での信頼が低くなります。
なので、公式のアクションを使用することで信頼性が高く行うことができます。
使ってみる
1.Github Appの準備
Developers settingsからGithub Appを選択し、New Github AppからAppを作成します。

Webhookはオンになっていますが、最初はいらないのでチェックは外します。

権限を設定します。
contentsをread-onlyにします。
こうすることでrepositoryの中身をGithubAppが閲覧することができます。

ここまでできたら、Create Github Appを選択します。
今回は個人用のアカウントでしか使わないのでOnly on this accountを選択します。

2.GithubAppのインストール
上でAppを作成した後、下のように作成したAppを該当リポジトリにインストールします。

3.repositoryの設定
Github AppのIDをvariablesとして登録します。
次に秘密鍵を生成します。
これはDeveloper Settingsから該当のGithub AppのEditを選択し、下の方にスクロールすることで見つけることができます。

秘密鍵は生成するとローカルにダウンロードされます。
catコマンドで秘密鍵が下の形式で表示されるのでそれをコピーします。
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
4.workflowを組む
実際にworkflowを組んでみます。
name: build
on:
pull_request:
types: [opened, synchronize, reopened]
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e #v2.0.6
id: generate-token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
- name: Configure Git for private modules
run: |
git config --global url."https://x-access-token:${{ steps.generate-token.outputs.token }}@github.com".insteadOf "https://github.com"
env:
GOPRIVATE: github.com/maooz4426/*
- name: Set up Go
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
with:
go-version-file: "go.mod"
- name: Install dependencies
run: go mod vendor
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb
- name: Build and push
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83
with:
context: .
push: false # PRなのでpushしない場合
tags: |
myapp:latest
myapp:pr-${{ github.event.number }}
cache-from: type=gha
cache-to: type=gha,mode=max
今回紹介しているactionは下部になります。
- uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e #v2.0.6
id: generate-token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
idの部分はこれを設定することでactionで作成されたaccess tokenを参照することができます。
steps.generate-token.outputs.token
withには、先ほど準備していたAPP_IDとPRIVATE_KEYを参照させています。
そして下の部分でgoがprivateリポジトリを見れるように設定しています。
これは生成したaccess tokenをURLに含めることでみることのできるURLをhttps://github.comというエイリアスにあてています。
こうすることでhttps://github.comにアクセスしようとすると暗黙的にhttps://x-access-token:${{ steps.generate-token.outputs.token }}@github.comに置き換えて、goのモジュールをダウンロードできるようにしています。
- name: Configure Git for private modules
run: |
git config --global url."https://x-access-token:${{ steps.generate-token.outputs.token }}@github.com".insteadOf "https://github.com"
こうすることで発行したAccess Tokenを使用してprivateリポジトリを閲覧することができます。
まとめ
actions/create-github-app-token を活用することで、GitHub Actionsのワークフロー内でプライベートリポジトリへ安全にアクセスするためのアクセストークンを自動的かつ一時的に発行できます。
従来のGITHUB_TOKEN (リポジトリのスコープに限定される) ではなく、GitHub Appのアクセストークンを利用するケースは、プライベートリポジトリへの参照が必要なGitHub Actionsワークフローで特に有効な選択肢になると思いました。





