最近はPATの代わりにGitHub Appsを使って認証できるらしい。
PRがマージされたらアプリにversion bumpとタグ付けとReleaseの作成をしてみたときの備忘録。
GitHub Appsを作る
GitHub Appの追加
Settings > Developer settingsの「New GitHub App」から。
以下を入力していけばOK
- 「GitHub App name」にアプリ名
- 「Homepage URL」にアプリのURL
- とりあえず、GitHubアカウントのプロフィールページを設定
- 「Expire user authorization tokens」にチェックを入れたまま
- アプリのトークンは有効期限付きに
- 「Webhook」の「Active」のチェックを外す
- 今回はいらないので無効化
- 「Permissions」の設定
- タグ付けとpushがしたいので以下の形
- ContentsのRead & Write
- Pull requestsのRead & Write
- タグ付けとpushがしたいので以下の形
- 「Only on this account」にチェック
- 個人用なので非公開設定
秘密鍵の生成
アプリが作成できたら、「Private keys」を生成する
「<app_name>.<date>.private-key.pem」がダウンロードするので、
大事に保管しておく。
「About」にある「App ID」も後で使うので、控えておく
アプリのインストール
「Settings > Developer settings > GitHub Apps > <アプリ名>」の
「Install App」タブから。
インストールするアカウントを選択する。
対象のリポジトリを選択できるので、お好みで。
インストールが完了すると、ブランチやアカウントのSettingsにある
「Installed GitHub Apps」や「Applications」に表示される。
作ったアプリを使ってみる
App IDと秘密鍵からアプリのトークンを生成してくれるActionがあるので、
それを使ってアプリのトークンでいろいろしてみる。
シークレットの設定
tibdex/github-app-token用に2つのシークレットを追加
GH_APP_ID... 「About」にある「App ID」GH_APP_PRIVATE_KEY... ダウンロードした秘密鍵の中身
GH_APP_PRIVATE_KEYは、こんな感じでクリップボードにコピーして
貼り付ければOK
$ cat <app_name>.<date>.private-key.pem | pbcopy
アプリの名前やメールアドレスを調べる
bump verion時のコミットをアプリからにしたいので、
https://api.github.com/users/<アプリ名>[bot]を使って調べる。
github-actions[bot]の場合はこんな感じ。
$ curl -s "https://api.github.com/users/github-actions\[bot\]" | jq -r '{"login":.login, "id":.id}'
{
"login": "github-actions[bot]",
"id": 41898282
}
このidとloginの値を使って組み立てればOK。
GH_USER_EMAIL: <id>+<login>@users.noreply.github.com GH_USER_NAME: <login>
メールアドレスの形式はnoreplyの形式
workflow.ymlで使ってみる
name: Add Tag And Release on marge
on:
pull_request:
branches:
- main
types: [closed]
env:
GH_USER_EMAIL: <your-app-id>+<your-app-name>[bot]@users.noreply.github.com
GH_USER_NAME: <your-app-name>[bot]
TAG_VERSION_PREFIX: v
jobs:
create_release:
# マージされたときのみ実行する
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
# トークンの生成
- name: Generate token
id: generate_token
uses: tibdex/github-app-token@v1
with:
app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_PRIVATE_KEY }}
# アプリのトークンを使ってcheckoutする
- uses: actions/checkout@v3
with:
token: ${{ steps.generate_token.outputs.token }}
- uses: actions/setup-node@v3
with:
node-version: "16"
# コミット時にuser.nameなどが必要なためアプリのを利用
- name: Configuire
run: |
git config --global user.name ${{ env.GH_USER_NAME }}
git config --global user.email ${{ env.GH_USER_EMAIL }}
# npm versionでバージョンを上げる
- name: Bump Package Version
run: |
npm version patch --tag-version-prefix=${{ env.TAG_VERSION_PREFIX }}
# コミットとタグをpush
- name: Push Commit and Tag
run: |
git push origin --follow-tags
# 新しいバージョンをpackage.jsonから取得
- name: Get Package Version
run: |
version=`npm pkg get version`
echo "NEW_VERSION=${{ env.TAG_VERSION_PREFIX }}${version}" >> $GITHUB_ENV
# 新しいバージョンのタグでリリースノートを作成
- name: Create Release
run: gh release create ${{ env.NEW_VERSION }} --generate-notes
env:
# アプリのトークンでghコマンドを実行
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
npm version patchでコミットなどをしてるけど、
npm version patch --no-git-tag-versionでコミットしないこともできる。
ハマったポイント
- コミットやタグ作成がアプリからにならない
actions/checkout@v3の時点でtokenの設定が必要- checkout時にローカルにトークンが保存され、それがその後使われる
v1.0.1と1.0.1の2つのタグができる
有効期限があるので「Personal Access Token」より安全で、
代行者としてアプリが利用できるのは便利(*´ω`*)
「Content Write」を使いたい場合、pushやコミットなど権限が広いので、
tibdex/github-app-token@v1ではなく、ちゃんとアプリを作るほうが安全そう。。
アプリをちゃんとつくれば、全リポジトリで利用できるので、
毎回workflowsを用意しなくて良くなるのでさらに便利に(*´ω`*)
参考にしたサイト様
- GitHubと連携する新しいアプリの形:GitHub Appsの作り方 - Qiita
- そのマシンユーザー不要ですよ!GitHub Appsを使ってGitHub Actionsを利用しよう
- Personal Access TokenからGitHub Appsに移行する | by Matsuno Yusuke | スタディスト Tech Blog
- scala-stewardを独自に作ったGitHub App(bot)で動かす方法 - xuwei-k's blog
- GitHub Apps + GitHub Actionsで必要なアクセス権限のみ付与した一時的なアクセストークンを発行する | DevelopersIO
- GitHub APIを使うBotたちのGitHub Appsへの移行 - KAYAC engineers' blog
- Gitのリモートリポジトリとして個人用アクセストークンが必要なリモートリポジトリを複数設定する方法
- Github ActionsでGITHUB_TOKEN以外を使用する