GitHubで保護されたブランチにコミットしたい事ってありませんか?そのやり方を解説します。
ブランチの保護とは?
特定のブランチに直接コミットできないようにブランチの保護ルールというものを設定することが可能です。例えば、自分も含めてすべてのユーザーにmain
ブランチへのコミットやマージができないように設定して、プルリエクエストのレビューを必須にします。そうする事で誤ってコミットしたりマージする可能性を半減させる事ができます。
参考リポジトリ
下記、リポジトリで実際に運用してます。
紹介
GitHubアクションを使ったUnityパッケージのリリース自動化
- パッケージマニフェストのバージョンを更新する
- リリースを生成する
- タグを作成する
- Unity Test Framework (旧 Test Runner)でテストする
- パッケージの生成をする
- 生成したパッケージをリリースページにアップロードする
GitHub Appを使う
ブランチの保護には、Bypass listというものがあります。このBypass listに追加したアカウントは保護ルールをパスできます。ここにGitHub Appを設定し、GitHub Appからコミットする事で、ブランチの保護を回避し安全にリリースをおこなう事ができます。
- Repository admin (Allow for pull requests only): 自分は、プルリクエストのみパス
- App (Always allow): AppのPermissionの範囲内はパス
GitHub Appの生成
生成ページを開く
- 右上のアイコンをクリック
- Settingsをクリック
- Developer settingsをクリック
生成
New GiHub Appをクリック
GitHub Appを作成します。
- GitHub App nameに適当に入力、ユニークである必要があります
- Homepage URLに
http://localhost
と入力 - WebfookのActiveを選択解除する
Permissionsを下記のように指定。指定後保存してください。
Permissions | Read and write |
---|---|
Administration | Read and write |
Contents | Read and write |
Metadata | Read-only |
Pull requests | Read-only |
App情報を取得
生成したAppから必要情報を取得します。
App IDを控える
App IDは、Repository secretsのBOT_APP_IDに設定します。
Private keyの生成
Generate a private key
から設定。ファイルがPCにダウンロードされます。
このキーは、Repository secretsのBOT_PRIVATE_KEYに設定します。
Appのインストール
アカウントにAppをインストールします。
All repositoriesを選択してインストール実行 (対象リポジトリを選択する事も可)
リポジトリに設定する
ルールの設定
設定したいリポジトリのブランチ保護ルールを開き、Bypass listにAppを設定してください。
リポジトリ > Settings > Rules > Rulesets
シークレットの設定
上記で取得したデータをNew repository secret
から設定します。
BOT_APP_ID
アプリのIDを設定
例) 1130092
BOT_PRIVATE_KEY
PCにダウンロードしたアプリのシークレットの中身をコピペ
例)
-----BEGIN RSA PRIVATE KEY-----
省略
-----END RSA PRIVATE KEY-----
リポジトリ > Settings > Secrets and variables > Actions
コード
あとは、Appからコミットなどをおこなうように設定します。やり方は簡単で、Appトークンを生成して、そのトークンをsecrets.GITHUB_TOKEN
の代わりに渡します。
参考: .github/workflows/reusable-update-packagejson.yaml
# Appトークンの生成
- name: Generate Token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.BOT_APP_ID }}
private-key: ${{ secrets.BOT_PRIVATE_KEY }}
- uses: actions/checkout@v4
with:
ref: ${{ inputs.ref }}
persist-credentials: false #チェックアウトする時は指定する
- name: Push changes
uses: ad-m/github-push-action@master
with:
# 生成したtokenを渡す
github_token: ${{ steps.app-token.outputs.token }}
branch: ${{ inputs.ref }}
tags: false
場合によって、Git認証情報を設定する必要があります。
エラーが出る場合は、設定してください。(生成したトークンが必要です。)
参考: .github/workflows/reusable-create-release.yaml
- name: Configure Git Authentication with Custom Token
run: |
git config --global url."https://x-access-token:${{ steps.app-token.outputs.token }}@github.com/".insteadOf "https://github.com/"
ブランチの保護をしていないのにエラーが出る場合
保護を設定していないのにPermissionエラーが出る場合、以下の設定を確認してみてください。
- リポジトリの
Settings > Actions > General > Workflow permissions
を開く - Workflow permissionsをRead and write permissionsに設定