GitLabを単なる「コード置き場」だと思っていませんか? もしそうなら、あなたはまだGitLabの本当の力を見過ごしています。
今日は、GitLab管理者の隠し武器、「System Hooks」の世界へご案内しましょう。これは、プロジェクト単位のWebhookとは次元が違います。GitLabインスタンス全体の「すべての動き」を監視し、サーバーサイドで直接命令を下す、いわばGitLabの司令塔です。
今回は、「新しいリポジトリが作られた瞬間、自動的にルールを適用し、チームを招待する」という、大規模開発の現場で必須となる自動化を実装してみましょう。
—
1. WebhookとSystem Hooksの決定的な違い
初心者の方が最初につまずくのがここです。
- Project Webhook: 特定のプロジェクト内でのプッシュやマージを検知します。「このリポジトリが更新されたらSlackに通知する」といった用途ですね。
- System Hooks: インスタンス全体を統括します。ユーザーの作成、グループの作成、そしてリポジトリの新規作成といった「イベント」をキャッチします。
なぜこれが最強なのか?
開発者が勝手に作ったプロジェクトを野放しにすると、アクセス権の漏洩や、保護ブランチ設定忘れによる事故が多発します。System Hooksを使えば、「開発者が空のリポジトリを作った瞬間、管理者権限が強制的にガードを固める」という自動化が可能です。
—
2. 事前準備:司令塔を動かす場所
System Hooksは「GitLabから送られてくるJSON通知」を受け取るためのWebサーバーが必要です。今回はシンプルにPython (Flask) で受信機を作ります。
サーバーの役割:
1. GitLabからの通信を受け取る。
2. そのイベントが「プロジェクト作成 (project_create)」か確認。
3. GitLab APIを叩いて、必要な設定を流し込む。
—
3. 実装:プロジェクト作成と同時に「鉄壁の守り」を敷く
以下のスクリプトは、新しいプロジェクトが作成されたら、「特定のグループを自動招待」し、「mainブランチを保護」する最小限のハックです。
from flask import Flask, request
import requests
app = Flask(__name__)
GitLabのアクセストークンとURL
GITLAB_URL = “https://your-gitlab-instance.com”
PRIVATE_TOKEN = “your_admin_token”
@app.route(‘/webhook’, methods=[‘POST’])
def handle_hook():
data = request.json
# プロジェクト作成イベントのみに反応
if data.get(‘event_name’) == ‘project_create’:
project_id = data[‘project_id’]
# 1. 特定のグループ(例: QAチーム)をメンバーとして追加
add_member_url = f”{GITLAB_URL}/api/v4/projects/{project_id}/share”
requests.post(add_member_url, headers={‘PRIVATE-TOKEN’: PRIVATE_TOKEN}, json={
‘group_id’: 123, ‘group_access’: 30 # 30 = Developer権限
})
# 2. mainブランチを保護(強制適用)
protect_url = f”{GITLAB_URL}/api/v4/projects/{project_id}/protected_branches”
requests.post(protect_url, headers={‘PRIVATE-TOKEN’: PRIVATE_TOKEN}, json={
‘name’: ‘main’, ‘push_access_level’: 40, ‘merge_access_level’: 40
})
return “Applied security policies!”, 200
return “Ignored”, 200
if __name__ == ‘__main__’:
app.run(port=5000)
—
4. 設定の仕上げ:GitLabへの登録
コードができたら、GitLabに「このサーバーを監視してくれ」と伝えます。
1. 管理者設定へ: GitLabの「Admin Area」を開きます。
2. System Hooksを選択: 左メニューの「System Hooks」をクリック。
3. 登録:
- URLに `http://your-server-ip:5000/webhook` を入力。
- 「Project events」にチェックを入れる。
- 「Add system hook」を押す。
これだけで、今後あなたのGitLabで誰かがプロジェクトを作るたびに、このスクリプトが影の立役者として走り出し、セキュリティ設定を完璧に整えてくれます。
—
最後に:なぜこれをやるのか?
「自動化」は単なる効率化ではありません。「人間が忘れること」をシステムが肩代わりすることで、チームの安全性と速度を最大化する戦略です。
GitLabのSystem Hooksを使えば、組織が拡大しても管理コストは一定に保てます。これをマスターすれば、あなたはもう「設定作業に追われる管理者」ではなく、「インフラをコードで統治するアーキテクト」になれるはずです。
さあ、まずはローカルでこのフックを立ち上げるところから始めてみてください。あなたのGitLab運用が、今日から劇的に変わりますよ!