最近は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以外を使用する