くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

GitHub Appsをほんの少しためしてみる

最近は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
  • 「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
}

このidloginの値を使って組み立てれば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.11.0.1の2つのタグができる
    • npm versionでは、デフォルトでvプレフィックスがつく
    • npm pkg get versionでは、プレフィックスがない
    • gh release create時にタグがないので作られてしまう。。
    • --tag-version-prefixなどをつかい、おなじになるように設定

有効期限があるので「Personal Access Token」より安全で、
代行者としてアプリが利用できるのは便利(*´ω`*)

「Content Write」を使いたい場合、pushやコミットなど権限が広いので、
tibdex/github-app-token@v1ではなく、ちゃんとアプリを作るほうが安全そう。。

アプリをちゃんとつくれば、全リポジトリで利用できるので、
毎回workflowsを用意しなくて良くなるのでさらに便利に(*´ω`*)

参考にしたサイト様