🔐

GitHub Actions からプロテクションルールを回避して Push する方法

に公開

はじめに

GitHub Actions のワークフローで、「自動的にファイルを更新して Push したい」というケースがあると思います。
しかし、ブランチプロテクションルールが設定されていると、直 Push が できません。

この記事では、GitHub App を作成して権限を委譲することで、プロテクションルールを回避しつつ安全に Push する方法を紹介します。

課題:プロテクションルール配下での Push

多くのチームでは、main ブランチに以下のようなプロテクションルールを設定していると思います:

  • 直 Push の禁止
  • Pull Request 必須
  • レビュー承認必須

これらは人間の開発者には有効ですが、GitHub Actions からドキュメントなどを自動更新したい場合にもルールが適用されてしまいます。

解決方法:GitHub App による権限委譲

GitHub App を作成すると、プロテクションルールを回避できる特別な権限を持ったトークンを発行できます。以下の手順で設定します。

1. GitHub App の作成

オーガニゼーションの場合:

  1. GitHub の Settings → Developer settings → GitHub Apps にアクセス
  2. 「New GitHub App」をクリック
  3. 以下を設定:
    • App name: your-org-bot など任意の名前
    • Homepage URL: リポジトリの URL など

2. 権限の設定

「Repository permissions」で以下を設定:

  • Contents: Read and write

3. アプリのインストール

  1. 作成した GitHub App の設定画面で「Install App」をクリック
  2. 「Only select repositories」で対象リポジトリを選択してインストール

4. ブランチプロテクションルールの設定

プロテクションルールを回避するには、ブランチ保護設定で GitHub App を許可する必要があります:

  1. リポジトリの Settings → Branches → Branch protection rules にアクセス
  2. main ブランチ(または対象ブランチ)のルールを編集
  3. 「Allow specified actors to bypass required pull requests」セクションで以下を設定:
    • チェックボックスを有効化
    • 「Add apps」から作成した GitHub App を選択して追加
  4. 「Save changes」をクリック

5. 認証情報の取得

  1. GitHub App の設定画面で App ID をメモ(例: 123456)
  2. 「Generate a private key」をクリックして .pem ファイルをダウンロード

6. Secrets の設定

リポジトリの Settings → Secrets and variables → Actions で以下を設定:

  • APP_ID: GitHub App の ID
  • PRIVATE_KEY: .pem ファイルの内容全体(-----BEGIN RSA PRIVATE KEY----- から -----END RSA PRIVATE KEY----- まで)

オプションで Variables に Bot 名を設定:

  • BOT_NAME: your-org-bot など

GitHub Actions での使用方法

以下のようなワークフローで使用できます:

name: Auto Update

on:
  workflow_dispatch:

jobs:
  update:
    runs-on: ubuntu-latest

    steps:
      # GitHub App トークンの取得
      - name: Generate token
        id: app-token
        uses: actions/create-github-app-token@v1
        with:
          app-id: ${{ secrets.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}

      - name: Checkout
        uses: actions/checkout@v4
        with:
          token: ${{ steps.app-token.outputs.token }}

      # 何らかのファイル更新処理
      - name: Update files
        run: |
          echo "Updated at $(date)" > updated.txt

      # GitHub App トークンで Commit & Push
      - name: Commit and Push
        env:
          GH_TOKEN: ${{ steps.app-token.outputs.token }}
        run: |
          git config user.name "${{ vars.BOT_NAME }}[bot]"
          git config user.email "${{ secrets.APP_ID }}+${{ vars.BOT_NAME }}[bot]@users.noreply.github.com"
          git add .
          git commit -m "chore: auto update"
          git push https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}

ポイント解説

  1. actions/create-github-app-token: GitHub App のトークンを生成する公式 Action
  2. user.email の形式: <APP_ID>+<BOT_NAME>[bot]@users.noreply.github.com とすることで、GitHub 上で Bot として認識される
  3. git pull --rebase: 並行実行される他のワークフローとの競合を防ぐ
  4. git diff --cached --quiet: 変更がない場合は空コミットを作らない
  5. トークン認証: https://x-access-token:${GH_TOKEN}@github.com/... で認証付き Push

まとめ

GitHub App を使用することで、プロテクションルールを回避して自動コミットが可能になりました。

参考

エックスポイントワン技術ブログ

Discussion