🔐
GitHub Actions からプロテクションルールを回避して Push する方法
はじめに
GitHub Actions のワークフローで、「自動的にファイルを更新して Push したい」というケースがあると思います。
しかし、ブランチプロテクションルールが設定されていると、直 Push が できません。
この記事では、GitHub App を作成して権限を委譲することで、プロテクションルールを回避しつつ安全に Push する方法を紹介します。
課題:プロテクションルール配下での Push
多くのチームでは、main ブランチに以下のようなプロテクションルールを設定していると思います:
- 直 Push の禁止
- Pull Request 必須
- レビュー承認必須
これらは人間の開発者には有効ですが、GitHub Actions からドキュメントなどを自動更新したい場合にもルールが適用されてしまいます。
解決方法:GitHub App による権限委譲
GitHub App を作成すると、プロテクションルールを回避できる特別な権限を持ったトークンを発行できます。以下の手順で設定します。
1. GitHub App の作成
オーガニゼーションの場合:
- GitHub の Settings → Developer settings → GitHub Apps にアクセス
- 「New GitHub App」をクリック
- 以下を設定:
-
App name:
your-org-botなど任意の名前 - Homepage URL: リポジトリの URL など
-
App name:
2. 権限の設定
「Repository permissions」で以下を設定:
-
Contents:
Read and write
3. アプリのインストール
- 作成した GitHub App の設定画面で「Install App」をクリック
- 「Only select repositories」で対象リポジトリを選択してインストール
4. ブランチプロテクションルールの設定
プロテクションルールを回避するには、ブランチ保護設定で GitHub App を許可する必要があります:
- リポジトリの Settings → Branches → Branch protection rules にアクセス
- main ブランチ(または対象ブランチ)のルールを編集
- 「Allow specified actors to bypass required pull requests」セクションで以下を設定:
- チェックボックスを有効化
- 「Add apps」から作成した GitHub App を選択して追加
- 「Save changes」をクリック
5. 認証情報の取得
- GitHub App の設定画面で App ID をメモ(例:
123456) - 「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 }}
ポイント解説
-
actions/create-github-app-token: GitHub App のトークンを生成する公式 Action -
user.email の形式:
<APP_ID>+<BOT_NAME>[bot]@users.noreply.github.comとすることで、GitHub 上で Bot として認識される -
git pull --rebase: 並行実行される他のワークフローとの競合を防ぐ -
git diff --cached --quiet: 変更がない場合は空コミットを作らない -
トークン認証:
https://x-access-token:${GH_TOKEN}@github.com/...で認証付き Push
まとめ
GitHub App を使用することで、プロテクションルールを回避して自動コミットが可能になりました。
Discussion