BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

GitHub Apps を使って GitHub Actions のワークフローでトークンを生成する

「GitHub Actions で Pull request を作成するワークフローを起動したら、別のワークフローを Pull Request のトリガーで起動したい」を実現するのが今回のことの発端です。

GitHub Actions では、デフォルトで GITHUB_TOKEN ってのがあって便利に使えますが、基本的に別のワークフローを起動することができません(workflow_dispatchrepository_dispatch を使ったワークフローの起動は可能) 。

そうすると問題は、pull request を作成するワークフローをデフォルトの GITHUB_TOKEN を使って実行しても、その Pull Request をトリガーとする別のワークフローは起動できないのです。

解決策として、強い permission を持っているトークンを使って pull request を作成するワークフローを実行することです。

permission の設定できるトークンを使うと言えば以下の2つ。

  • Personal Access Token (PAT)
  • GitHub App

サクッとやるなら PAT を使えばいいですが、個人アカウントに依存するのでチーム開発だとあんまよくないですよね。そこで GitHub Apps を使うのがおすすめです。

あと、似ている機能で OAuth apps もあります。OAuth apps と GitHub Apps の比較は以下のドキュメントが参考になります。

ということで前置きが長くなりましたが、GitHub App を作って GitHub Actions のワークフローで利用できるようにする旅を始めます。

GitHub Apps を構成する

GitHub Apps を新規に作成

GitHub App を新規に作成は、アカウントによって UI の遷移が異なるで分けて書いておきます。

  • 個人アカウントの repo の場合
    • 右上の自分のアバターアイコンをクリックして ”Settings" をクリック > 左側のメニューの下部にある "Developer settings" をクリック > "GitHub App" のページにある "New GitHub App" をクリック
  • Organization に属して repo の場合
    • 右上の自分のアバターアイコンをクリックして "Your organizations" をクリック
    • GitHub Apps を作りたい repo が属する organization をクリック
    • Organization のトップページが表示されるので上部メニューの "Settings" をクリック (権限が強くないと表示されない)
    • 左側のメニューの下部にある "Developer settings" をクリック > "GitHub App" をクリック
    • "New GitHub App" をクリック

これで新規作成の画面に辿りつきます。新規作成時、設定する項目が多いので全ては書きませんがいいくつかポイントを挙げておきます。

  • name: 大文字とか記号入れても最終的には小文字とハイフンでつないだ文字列になりますで最初からそういうネーミングにしておきましょう。ちなみにこの名前は global で一意になる必要があります。
  • "Active" (Webhook section): 今回 Webhook は不要なので "Active" のチェックは外します。
  • Permissions: 今回のユースケースだと "Repository permissions" でいくつか設定します。
    • "Actions" は "Read and write" をセットしました。
    • Pull request を作成するので "Pull requests" を "Read and write" をセットしました。
    • Actions の実行で repository secrets や repository variables を読む場合は "Secrets" や "Variables" の permission をセットします。

Permissions の詳細はこちらのドキュメントで確認できます。

作成すると、GitHub App の設定画面に遷移します。

画面下の方にある "Private Keys" セクションから private key を作成します (GitHub App 作成直後は上部に作成のリンクもでますが)。作成すると pem がダウンロードされます。

install

次は "Install App" をクリックして、利用する repo を定義します。

全ての repo で使うか個別に設定するかを選べますので用途に応じて設定します。後から変更もできますので目的が完全に決まってない場合は個別の repo のみにするのが無難です。

必要な情報をメモ

GitHub Actions でトークンを生成するためには、GitHub App の App ID と private key が必要になります。App ID は GitHub App の General にありますので、とりあえずこの画面を開いたままにしておきましょう。private key は勝手にダウンロードされているはずです。

GitHub Actions を構成する

Secret の登録

利用する repo を開き "Settings" をクリックします。

🚧 Secret の登録は強い権限が必要です。"Settings" のメニューがなかったりあっても Secrets を登録できない場合は権限不足ですので管理者に聞いてください。

"Secrets and variables" をクリックして展開し、その下にある "Actions" をクリック → "New repository secret" をクリックします。

GitHub の App ID と private key の2つを secret に登録します。

  • 1度の操作で1つの secret しか登録できないので2度 secret の追加を行います。
  • private key は、ダウンロードした pem をテキストエディタなどで開き、値をそのままはれば OK です。

GitHub Actions のワークフローを構成

今回、ワークフロー内でトークンの生成には Marketplace で公開さ入れてる tibdex/github-app-token を使いますが、公式ドキュメントでも書かれているので大丈夫でしょう。もし、GitHub の管理者の制約でこの Action が使えなければ、 tibdex/github-app-token が OSS で公開されているので参考に自作しましょう。

※ 追記

GitHub 公式の action がでたので、メンテナンス性からも今後はこっちを使っていくのがよいと思います。

とゆーことで、YAML のサンプルです (tibdex/github-app-token 版のままです。GitHub 公式バージョンはほぼ一緒なのでドキュメントをみてください) 。ほぼ公式ドキュメントのままですがやってることは (トリガーは省略してますが) pr-creation という branch の変更がある前提で、GitHub App のトークンを使って pr-creation branch から main branch への pull request を生成してます。

jobs:
  create_pr:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          ref: pr-creation
      - name: generate token
        id: generate_token
        uses: tibdex/github-app-token@v1
        with:
          app_id: ${{ secrets.BEACHSIDE_GH_AAP1_APP_ID }}      
          private_key: ${{ secrets.BEACHSIDE_GH_AAP1_PRIVATE_KEY }}
      - name: echo
        run: gh pr create --base main --title "Test PR from action" --body ""
        env:
          GH_TOKEN : ${{ steps.generate_token.outputs.token }}

これで、main branch に Pull request trigger のワークフローがあれば無事に起動します。

参考