プッシュルール

正規表現を使って、コミット内容やブランチ名、ファイルの詳細に基づいてプッシュを拒否することで、リポジトリにプッシュできるものとできないものをさらに管理できます。

概要

GitLabはすでに保護ブランチを提供していますが、Gitタグの削除を防いだり、コミットメッセージに特別な書式を強制したりといった特別なルールが必要な場合があります。

プッシュルールは、基本的にはGit のフックをあらかじめ受け取っておくもので、ユーザーフレンドリーなインターフェイスで簡単に有効にすることができます。 管理者であればグローバルに、あるいはプロジェクトごとに定義することができるので、必要に応じてプロジェクトごとに異なるルールを適用することができます。

ユースケース

どのプッシュ・ルールにもそれぞれの使用例がありますが、いくつかの例を考えてみましょう。

特定の参照を持つコミットメッセージ

ワークフローに次のような要件があるとします:

  • すべてのコミットは、たとえばJiraのイシューを参照する必要があります:Refactored css. Fixes JIRA-123.
  • で git タグを削除することはできません。git push

JIRA\-\d+のように、コミットメッセージに Jira イシューが含まれていることを要求する簡単な正規表現を書くだけです。

これで、ユーザーがBugfixというメッセージを含むコミットをプッシュしようとすると、プッシュが拒否されるようになります。Bugfix according to JIRA-123のようなメッセージを含むコミットのみがプッシュを受け付けます。

ブランチ名の制限

あなたの会社ではブランチ名に厳格なポリシーがあり、ブランチ名に依存する GitLab CI/CD ジョブ (feature,hotfix,docker,androidなど) があるため、ブランチを特定の名前で始めさせたいとします。

しかし、開発者がそのポリシーを覚えているとは限りません。そのため、さまざまなブランチにプッシュしてしまい、CIパイプラインが期待通りに動かなくなってしまうかもしれません。 プッシュルールでブランチ名をグローバルに制限することで、そのようなミスを防ぐことができます。 プッシュルールにマッチしないブランチ名は、すべて却下されます。

デフォルトブランチの名前は、ブランチ名の正規表現 (regex) の指定にかかわらず常に許可されることに注意しましょう。 GitLab がこのように設定されているのは、マージは通常デフォルトブランチをターゲットにするためです。 他のターゲットブランチがある場合は、それを正規表現に含めてください (プッシュルールの有効化を参照ください)。

デフォルトのブランチもデフォルトでは保護されたブランチとなっており、ユーザーが直接プッシュすることを制限しています。

カスタムプッシュルール

より高度なサーバーフックを使用することで、管理エリア>プッシュルールで利用可能なプッシュルールではなく、カスタムプッシュルールを作成することが可能です。

詳細はサーバーフックを参照してください。

プッシュルールの有効化

Note:GitLab管理者はAdmin Area > Push Rulesでグローバルにプッシュルールを設定することができ、すべての新しいプロジェクトに継承されます。 後からプロジェクトの設定で上書きすることができます。 グループレベルで設定することもできます。
  1. プロジェクトの設定 >リポジトリに移動し、Push Rulesを展開します。
  2. ご希望のルールを設定してください。
  3. Save Push Rulesをクリックすると、変更が有効になります。

以下のオプションがあります。

プッシュルール GitLabバージョン 説明
タグの取り外しgit push Starter7.10 git pushを使って git タグを削除することを禁じます。 タグはこれまで通りウェブ UI から削除することができます。
作成者がGitLabユーザーかどうかを確認します。 Starter7.10 既存のGitLabユーザーに作成者(メール)によるコミットを制限します。
コミッター制限 プレミアム10.2 GitLab は現在の認証ユーザーがコミットしていないコミットを拒否します。
コミットがGPGで署名されているかチェック プレミアム10.1 GPGで署名されていないコミットを拒否します。GPGで署名されたコミットを読み取ります。
シークレットをGitにコミットしないようにする方法 Starter8.12 GitLabはシークレットが含まれている可能性のあるファイルを拒否します。どのようなファイルが禁止されているかを読んでください。
コミットメッセージによる制限 Starter7.10 この正規表現にマッチするコミットメッセージのみプッシュを許可します。 どのコミットメッセージでも許可する場合は空のままにします。 マルチラインモードを使用します。無効にするには(?-m)を使用します。
コミットメッセージによる制限(否定一致) Starter11.1 この正規表現にマッチしないコミットメッセージのみプッシュが許可されます。 どのようなコミットメッセージでも許可する場合は空のままにします。 マルチラインモードを使用します。これは(?-m)を使って無効にすることができます。
ブランチ名で制限 Starter9.3 この正規表現にマッチするブランチ名のみがプッシュされます。 どのようなブランチ名でも許可する場合は、空のままにします。
コミット作成者の電子メールによる制限 Starter7.10 この正規表現にマッチするコミット作成者のEメールのみがプッシュを許可されます。 任意のEメールを許可する場合は空のままにしてください。
禁止ファイル名 Starter7.10 この正規表現にマッチするコミットされたファイル名は、プッシュすることができません。 任意のファイル名を許可する場合は、空のままにします。
最大ファイルサイズ Starter7.12 このファイルサイズ (MB 単位) を超える追加または更新されたファイルを含むプッシュは拒否されます。 任意のサイズのファイルを許可するには 0 を設定します。 git LFS によって追跡されるファイルは除外されます。
ヒント:GitLabではプッシュルールの正規表現にRE2構文を使用しています。

リポジトリにシークレットをプッシュしないようにします。

GitLab Starter8.12 で導入されました

クレデンシャルファイルやSSH秘密鍵などのシークレットを含むファイルは、決してソース管理にコミットすべきではありません。 GitLabでは、リポジトリへのプッシュを許可しないファイルの事前定義された拒否リストをオンにすることで、リモートリポジトリにこれらのコミットが到達するのを阻止することができます。

シークレットをGitにコミットしないようにするチェックボックスを選択すると、files_denylist.yml (このファイルを表示するときに、GitLabのバージョンとして正しいブランチであることを確認してください)から読み取った正規表現に一致するファイルがある場合に、GitLabはリポジトリへのプッシュを防ぎます。

注意:すでにコミットされているファイルは、このプッシュルールによって制限されることはありません。

以下は、これらの正規表現によって拒否されるものの例です:

#####################
# AWS CLI credential blobs
#####################
.aws/credentials
aws/credentials
homefolder/aws/credentials

#####################
# Private RSA SSH keys
#####################
/ssh/id_rsa
/.ssh/personal_rsa
/config/server_rsa
id_rsa
.id_rsa

#####################
# Private DSA SSH keys
#####################
/ssh/id_dsa
/.ssh/personal_dsa
/config/server_dsa
id_dsa
.id_dsa

#####################
# Private ed25519 SSH keys
#####################
/ssh/id_ed25519
/.ssh/personal_ed25519
/config/server_ed25519
id_ed25519
.id_ed25519

#####################
# Private ECDSA SSH keys
#####################
/ssh/id_ecdsa
/.ssh/personal_ecdsa
/config/server_ecdsa
id_ecdsa
.id_ecdsa

#####################
# Any file with .pem or .key extensions
#####################
*.pem
*.key

#####################
# Any file ending with _history or .history extension
#####################
pry.history
bash_history