3、代码仓库管理:GitLab/GitHub 的权限、分支保护与 Webhook 配置
好,咱们进入第三课。代码仓库管理,说白了就是管好你的代码、管好你的人、管好你的自动化流程。
我见过太多团队,代码仓库乱成一锅粥。有人直接往 master 推代码,有人把密钥硬编码在仓库里,还有人手动触发构建... 嗯,这些坑我都踩过。今天咱们就把 GitLab 和 GitHub 上最核心的三件事讲透:权限怎么设、分支怎么保护、Webhook 怎么配。
3.1 权限模型:谁可以做什么
先说说权限。你想想看,一个几十人的开发团队,如果每个人都能删分支、改设置,那不乱套了?
我个人习惯,权限管理遵循「最小权限原则」—— 只给每个人完成工作所需的最小权限。
GitLab 权限层级
GitLab 的权限分五个级别,从低到高:
| 权限级别 | 角色 | 典型操作 |
|---|---|---|
| Guest | 访客 | 查看 issue、查看 wiki |
| Reporter | 报告者 | 查看代码、下载项目、创建 issue |
| Developer | 开发者 | 推送代码、创建分支、创建 MR |
| Maintainer | 维护者 | 合并 MR、管理 CI/CD、管理仓库设置 |
| Owner | 所有者 | 删除项目、转移项目、管理所有设置 |
我在项目中遇到过,有人把整个团队都设成 Maintainer,结果新人误操作删了 CI 配置。所以我的建议是:开发者给 Developer 就够了,Maintainer 只给核心成员。
GitHub 权限层级
GitHub 的权限模型类似,但叫法不同:
| 权限级别 | 角色 | 典型操作 |
|---|---|---|
| Read | 读取者 | 查看代码、查看 issue |
| Triage | 分类者 | 管理 issue、管理 PR 标签 |
| Write | 写入者 | 推送代码、创建分支、创建 PR |
| Maintain | 维护者 | 合并 PR、管理仓库设置(不含敏感操作) |
| Admin | 管理员 | 完全控制,包括删除仓库 |
3.2 分支保护:守住你的主分支
分支保护,说白了就是给主分支加把锁。我曾经见过一个团队,master 分支没有任何保护,结果有人直接 push 了一个未编译通过的代码,整个 CI 全红了... 那叫一个惨。
GitLab 分支保护配置
在 GitLab 中,进入 Settings → Repository → Protected Branches。我通常这样配:
- 允许合并的角色: Maintainer + Developer(但建议只给 Maintainer)
- 允许推送的角色: 没人(所有变更必须通过 MR)
- 代码所有者审批: 开启,要求特定文件(如 CI 配置)必须由指定人审批
举个例子,假设你要保护 main 分支:
# 通过 GitLab API 设置分支保护
curl --request POST \
--header "PRIVATE-TOKEN: <your_token>" \
--data "name=main&push_access_level=0&merge_access_level=40" \
"https://gitlab.example.com/api/v4/projects/<project_id>/protected_branches"
这里 push_access_level=0 表示不允许任何人直接推送,merge_access_level=40 表示只有 Maintainer(权限值 40)可以合并。
GitHub 分支保护规则
GitHub 的配置在 Settings → Branches → Add rule。我常用的规则:
- Require pull request reviews before merging: 至少 1 个审批
- Dismiss stale pull request approvals: 当有新提交时,自动清除旧审批
- Require status checks to pass before merging: 必须通过 CI 检查
- Include administrators: 管理员也要遵守这些规则(这个很重要!)
3.3 Webhook 配置:让仓库主动通知
Webhook 是什么?说白了就是一个「回调」。当仓库里发生某些事件(比如 push、PR、issue)时,GitLab/GitHub 会自动向你的服务器发送一个 HTTP POST 请求。
我习惯用 Webhook 做两件事:
- 触发 CI/CD 流水线: 代码一推送,自动开始构建
- 通知协作工具: 比如发消息到钉钉、Slack 或飞书
GitLab Webhook 配置
路径:Settings → Webhooks。关键字段:
- URL: 接收 Webhook 的服务器地址(比如 Jenkins 的 Generic Webhook Trigger)
- Secret Token: 一个自定义密钥,用于验证请求来源(强烈建议设置!)
- Trigger: 选择触发事件,我通常勾选「Push events」和「Merge request events」
举个例子,配置 Jenkins 的 Webhook:
# Jenkins 的 Generic Webhook Trigger 插件配置
URL: http://jenkins.example.com/generic-webhook-trigger/invoke
Token: my-secret-token-123
# GitLab 端配置
URL: http://jenkins.example.com/generic-webhook-trigger/invoke
Secret Token: my-secret-token-123
Trigger: Push events, Merge request events
这里要注意,URL 和 Token 必须完全匹配。我见过有人把 Token 写错了,结果 Webhook 一直触发失败,排查了半天才发现是大小写问题。
GitHub Webhook 配置
路径:Settings → Webhooks → Add webhook。配置项类似:
- Payload URL: 接收地址
- Content type: 建议用
application/json - Secret: 同样建议设置
- Which events: 我通常选「Just the push event」或「Send me everything」
X-GitHub-Event: ping 或 X-Gitlab-Event: Push Hook 之外的请求。
3.4 实战:一个完整的权限+保护+Webhook 配置示例
好,咱们来一个完整的例子。假设你有一个 Java 项目,团队有 5 个人,你希望:
- 只有你(管理员)能合并到 main 分支
- 所有合并必须通过 CI 检查
- 代码推送后自动触发 Jenkins 构建
第一步:设置权限
在 GitLab 中,把 4 个开发人员设为 Developer,你自己设为 Maintainer。
第二步:保护 main 分支
# 通过 GitLab UI 设置
Settings → Repository → Protected Branches
Branch: main
Allowed to merge: Maintainers
Allowed to push: No one
Code owner approval: Required
第三步:配置 Webhook
Settings → Webhooks
URL: http://jenkins.example.com/generic-webhook-trigger/invoke
Secret Token: my-jenkins-token
Trigger: Push events, Merge request events
SSL verification: Enable (如果 Jenkins 有 HTTPS)
第四步:在 Jenkins 中配置
# Jenkins Pipeline 示例
pipeline {
agent any
triggers {
GenericTrigger(
genericVariables: [
[key: 'BRANCH', value: '$.ref']
],
token: 'my-jenkins-token',
causeString: 'Triggered by GitLab Webhook'
)
}
stages {
stage('Build') {
steps {
echo "Building branch: ${BRANCH}"
sh 'mvn clean package'
}
}
}
}
3.5 常见问题与排查
最后,分享几个我踩过的坑:
- Webhook 没触发? 先检查网络连通性。我遇到过公司内网防火墙把 Webhook 请求拦截了的情况。
- 权限设置不生效? 检查一下是不是有「继承权限」。GitLab 的 Group 权限会覆盖 Project 权限。
- 分支保护规则冲突? 如果你同时设置了多个规则,GitHub 会取「最严格」的那个。GitLab 则是按顺序匹配。
嗯,今天就讲到这里。代码仓库管理看似简单,但细节很多。你想想看,一个配置不当的 Webhook 可能导致构建失败,一个权限漏洞可能导致代码泄露。所以,花点时间把基础打牢,绝对值得。
下一章,咱们聊聊 CI/CD 流水线的核心 —— 构建与测试。到时候见。