最近、GitHub Cloudではブランチルール(Rulesets)に「Push Ruleset」という新機能が追加され、リポジトリへの不適切なファイルのPushを未然に防ぐための制御がさらに強化されました。
※ Push Rulesetは2024年9月10日にGAとなりました。
この記事では、Push Rulesetの概要と活用方法について説明します。
Push Rulesetとは?
Push Rulesetは、リポジトリに対するPush操作を細かく制御できる設定です。
これにより、特定の条件に合致するファイルのPushをブロックすることで、リポジトリの安全性やコードの品質を保つことができます。現在、GitHubでは4種類のPushルールが提供されています。
Restrict file paths
このルールは、特定のパスへのPushを制限します。
例えば、特定のディレクトリにPushされることを防ぎたい場合に、このルールを設定できます。
使用例:
secretsディレクトリ配下に対するPushは禁止する。
設定後、GitHub.com上でPushしてみます。
意図したとおりエラーが発生しました。
There was an error committing your changes: Please address the rule violations and try again.
参考までにGitクライアントでPushしてみます。
$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 345 bytes | 345.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
remote: error: GH013: Repository rule violations found for refs/heads/main.
remote: Review all repository rules at http://github.com/xxx/yyy/rules?ref=refs%2Fheads%2Fmain
remote:
remote: - GITHUB PUSH PROTECTION
remote: —————————————————————————————————————————
remote: Resolve the following violations before pushing again
remote:
remote: - File path is restricted
remote: Found 1 violation:
remote:
remote: secrets/testtest.txt
remote:
To https://github.com/xxx/yyy.git
! [remote rejected] main -> main (push declined due to repository rule violations)
error: failed to push some refs to 'https://github.com/xxx/yyy.git'
同じようにPushエラーになりましたね。
なぜエラーになったのか、メッセージもわかりやすいです。
Restrict file path length
ファイルパスが指定した長さを超える場合、そのファイルのPushを防ぐルールです。
深すぎるディレクトリ構造や長すぎるファイルパスを避けるために役立ちます。
使用例:
ファイルパスが20文字を超える場合にPushをブロックする。
設定後、GitHub.com上でPushしてみます。
はい、意図した通りエラーとなりました。
- 20文字はOK
- 21文字はNG
- Qファイルパスの長さって?
- A
リポジトリ直下から見たファイル名を含めた長さです。
例えば、「12345/67890/main1.py」の場合、「/」等も全部含めて20文字です。
- Qファイルパスを設定する理由って?
- A
OSやソフトウェアによっては、ファイルパスが長すぎる(例えば256文字以上)だと、認識できない場合があります。だからファイルパスを設定して、問題が生じないようにするんですね。
Restrict file extensions
指定した拡張子を持つファイルのPushを防ぐルールです。
例えば、実行ファイル(.exeや.sh)やバイナリファイルをリポジトリに含めたくない場合、このルールを使うことで安全性を確保できます。
使用例:
.exeファイルや.binファイルのPushを禁止し、ソースコード以外の不要なファイルが混入しないようにする。
設定後、GitHub.com上でPushしてみます。
狙い通り、エラーとなりました。
Restrict file size
指定したサイズ以上のファイルのPushを制限します。
デフォルトでは100MB以内のファイルはPush可能ですが、例えば10MB以上のファイルを制限することで、リポジトリの肥大化を防ぐことができます。
使用例:
1MBを超えるファイルのPushを禁止する。
設定後、GitHub.com上でPushしてみます。
ファイルのドラッグ&ドロップでPushしようとしましたが、エラーとなりました。
参考までにGitクライアントでも試してみました。
remote: - GITHUB PUSH PROTECTION
remote: —————————————————————————————————————————
remote: Resolve the following violations before pushing again
remote:
remote: - File size can not exceed 1 MB.
remote: Found 1 violation:
ちゃんと理由表示と共にPushエラーになりましたね。
Push Rulesetまとめ
Push Rulesetを活用することで、リポジトリに対する不適切な変更を防ぎ、コードの品質を維持するだけでなく、運用上のミスやトラブルを未然に防ぐことができます。また、ルールを事前に定義することで、開発チーム全体の作業効率や信頼性が向上します。
項目 | 制限内容 |
---|---|
Restrict file paths | 特定パスへのPushを制限する。 |
Restrict file path length | ファイルパスの長さを制限する。 |
Restrict file extensions | ファイル拡張子を制限する。 |
Restrict file size | ファイルサイズを制限する。 |
従来、GitHub Enterprise Server版のフック処理でなければ出来なかったことが、GitHub Cloudでも出来るようになりました。どんどん便利になりますね。
コメント