コンテンツにスキップ

Rulesets

この章では、GitHub の新しいルール管理機能「Rulesets」について学びます。従来のブランチ保護ルールとの違いや、より柔軟な設定方法を解説します。

Rulesetsは、2023年に導入されたGitHubの新しいルール管理機能です。ブランチやタグに対するルールを、より柔軟かつ一元的に管理できます。

項目ブランチ保護Rulesets
対象ブランチのみブランチ + タグ
適用範囲リポジトリ単位リポジトリ or Organization
バイパス管理者のみ柔軟に設定可能
UI従来型新しいUI
API従来API新しいAPI
ステータス有効/無効有効/無効 + 評価モード
Rulesetsが適している:
- 複数リポジトリに同じルールを適用したい
- タグも保護したい
- 細かいバイパス権限を設定したい
- 新機能を活用したい
ブランチ保護が適している:
- シンプルな設定で十分
- 既存の設定を維持したい
- 従来のワークフローを変えたくない
  1. Settings → Rules → Rulesets
  2. New rulesetNew branch ruleset または New tag ruleset
  1. Organization Settings → Rules → Rulesets
  2. 複数リポジトリに一括適用可能
項目説明
Ruleset nameルールセットの名前
Enforcement statusActive / Disabled / Evaluate
Bypass listバイパスできるユーザー/チーム
Target branches/tags適用対象のパターン
ステータス説明
Activeルールを強制
Disabledルールを無効化
Evaluate違反を記録するが強制しない(テスト用)

新しいルールを導入する前のテストに便利:

1. Evaluate モードで設定
2. 1週間程度運用
3. 違反がないか確認
4. 問題なければ Active に変更
# 完全一致
main
# ワイルドカード
release/* # release/v1.0.0 などにマッチ
feature/** # feature/auth/login などにもマッチ
# 除外パターン(fnmatchではないので注意)
# Includeで追加、Excludeで除外を指定
Include:
- Default branch (main)
- release/*
- hotfix/*
Exclude:
- release/test-*
  1. リリースの保護: タグの誤削除を防止
  2. バージョン管理: タグの上書きを禁止
  3. 監査: タグの作成者を制限
  1. New ruleset → New tag ruleset
  2. Target tags にパターンを指定
# リリースタグを保護
v*
# セマンティックバージョニングのタグ
v[0-9]*.[0-9]*.[0-9]*
ルール説明
Restrict creationsタグ作成を制限
Restrict updatesタグの上書きを禁止
Restrict deletionsタグの削除を禁止
Require signed tags署名必須

特定のユーザー、チーム、またはアプリにルールのバイパスを許可:

バイパスできるアクター:
- Organization admin
- Repository admin
- 特定のチーム(例: release-managers)
- 特定のユーザー
- GitHub Apps(例: dependabot)
モード説明
Always常にバイパス可能
Pull request onlyPR経由のみバイパス可能
Bypass list:
- Organization admins: Always
- release-managers team: Pull request only
- dependabot[bot]: Always # 自動PRのため
ルール説明
Restrict creationsブランチ作成を制限
Restrict updates直接プッシュを制限
Restrict deletionsブランチ削除を禁止
Require linear historyマージコミット禁止
Require deployments to succeedデプロイ成功を必須
Require signed commits署名必須
Require a pull request before mergingPR必須
Require status checks to passCIチェック必須
Block force pushesforce push禁止
ルール説明
Required approvals必須承認数
Dismiss stale reviews新コミットで承認取消
Require review from Code OwnersCODEOWNERS承認必須
Require last push approval最終プッシュの承認必須
Require conversation resolution会話の解決必須

複数のRulesetがマッチする場合、すべてのルールが結合されます:

例:
Ruleset A (main): 承認1件、CIチェック必須
Ruleset B (release/*): 承認2件
release/v1.0.0 にマッチ:
- 承認2件(より制限的な方)
- CIチェック必須(Ruleset Aから)

同じ設定で異なる値がある場合:

  • 数値: より制限的な値を採用
  • ブール: 制限的な方を採用(true > false)

Terminal window
# Rulesetの一覧を取得
gh api repos/{owner}/{repo}/rulesets
# Rulesetの詳細を取得
gh api repos/{owner}/{repo}/rulesets/{ruleset_id}
# Rulesetを作成
gh api repos/{owner}/{repo}/rulesets \
--method POST \
--field name='main-protection' \
--field enforcement='active' \
...
# Organization Ruleset
name: org-wide-protection
enforcement: active
target_repositories:
- all # 全リポジトリに適用
conditions:
ref_name:
include:
- refs/heads/main
exclude: []
rules:
- type: pull_request
parameters:
required_approving_review_count: 1
dismiss_stale_reviews_on_push: true
Terminal window
# ルール評価のログを取得
gh api repos/{owner}/{repo}/rulesets/rule-suites
Terminal window
# 既存のブランチ保護ルールを確認
gh api repos/{owner}/{repo}/branches/main/protection
# Rulesetに設定を移行後
# ブランチ保護ルールを削除
gh api repos/{owner}/{repo}/branches/main/protection \
--method DELETE

項目内容
対象ブランチ + タグ
適用範囲リポジトリ / Organization
バイパスユーザー/チーム/アプリ単位で柔軟に
ステータスActive / Disabled / Evaluate
  1. 評価モードでテスト: 本番適用前に影響を確認
  2. Organization レベルで管理: 複数リポジトリに一括適用
  3. バイパスは最小限に: 必要な場合のみ許可
  4. タグも保護: リリースタグの誤操作を防止
  5. 命名規則を統一: ルールセット名でわかりやすく
Ruleset: main-protection
Enforcement: Active
Bypass list:
- Organization admins (Always)
Target branches:
- Include: Default branch
Rules:
- Require a pull request before merging
- Required approvals: 1
- Dismiss stale reviews on push: true
- Require review from Code Owners: true
- Require status checks to pass
- Required checks: test, lint
- Require branches to be up to date: true
- Block force pushes
- Restrict deletions

次の章では、CODEOWNERS設定について学びます。

Q1. Rulesetsのブランチ保護ルールとの主な違いはどれですか?

Q2. RulesetsのEnforcement statusで、違反を記録するが強制しないテストモードはどれですか?

Q3. Rulesetsで複数のルールセットがマッチする場合、どうなりますか?