以下是企业级 CI/CD 架构图说明 和 部署模板,适用于使用 Gerrit + Jenkins + Docker + Kubernetes 的现代化开发流程。
🧭 企业级 CI/CD 架构图说明
┌────────────────────────────────────────────────────────────┐
│ 开发者提交代码 │
│ git push → Gerrit (refs/for/master) │
└────────────────────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────────────────────┐
│ Gerrit 审查系统 │
│ - 创建 Change(变更) │
│ - 审查者评分、评论 │
│ - 触发 Jenkins 构建(Patchset Created) │
└────────────────────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────────────────────┐
│ Jenkins CI │
│ - 拉取代码 │
│ - 执行构建脚本(Maven/Gradle/NPM 等) │
│ - 单元测试、静态分析 │
│ - 构建 Docker 镜像 │
│ - 推送镜像到镜像仓库(如 Harbor 或 DockerHub) │
└────────────────────────────────────────────────────────────┘
↓
┌────────────────────────────────────────────────────────────┐
│ Kubernetes CD(部署阶段) │
│ - Jenkins 调用 kubectl 或 Helm 部署至 K8s 集群 │
│ - 自动化滚动更新 │
│ - Prometheus + Grafana 监控服务状态 │
└────────────────────────────────────────────────────────────┘
📦 部署模板(组件清单)
1. Gerrit 代码审查系统
- 部署方式:Docker 或 Linux 原生安装
- 端口:8080(HTTP),29418(SSH)
- 用户认证:LDAP / OAuth / 本地账户
- 审查流程:
refs/for/master推送触发审查
2. Jenkins 持续集成
- 部署方式:Docker 或 Kubernetes
插件:
- Gerrit Trigger Plugin
- Git Plugin
- Pipeline Plugin
- 构建脚本:Jenkinsfile(Groovy DSL)
3. Docker 镜像构建与仓库
- 构建工具:Dockerfile
- 镜像仓库:Harbor(推荐企业私有)或 DockerHub
- 安全策略:镜像签名、扫描漏洞
4. Kubernetes 持续部署
- 部署工具:kubectl、Helm
- 环境隔离:dev / staging / production 命名空间
- 自动化策略:滚动更新、回滚、探针检测
5. 监控与告警
- Prometheus:采集指标
- Grafana:可视化仪表盘
- Alertmanager:告警通知(邮件、Slack)
✅ 企业落地建议
| 项目 | 建议 |
|---|---|
| 安全性 | 使用 RBAC 控制 Jenkins 与 K8s 权限 |
| 审查流程 | Gerrit 审查通过后再触发部署 |
| 构建隔离 | 使用 Jenkins Agent 执行构建任务 |
| 镜像管理 | 定期清理旧版本,启用漏洞扫描 |
| 灰度发布 | 使用 K8s 的 Canary 或 Blue-Green 策略 |
Gerrit 部署教程
🧱 一、准备环境
✅ 安装 Java 17(推荐使用 Adoptium Temurin)
wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz
tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz
sudo mv jdk-17.0.10+7 /opt/java17
echo 'export JAVA_HOME=/opt/java17' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
java -version
确认输出为 Java 17。
📦 二、下载 Gerrit 3.9.9 安装包
wget https://gerrit-releases.storage.googleapis.com/gerrit-3.9.9.war
📁 三、初始化 Gerrit 站点
mkdir ~/gerrit_site
java -jar gerrit-3.9.9.war init --batch -d ~/gerrit_site
你将看到一系列配置提示:
- Reverse Proxy:根据是否使用 Nginx 选择
y或N - Canonical URL:填写实际访问地址,如
http://10.1.1.28:8080/ - Authentication method:建议选择
DEVELOPMENT_BECOME_ANY_ACCOUNT或LDAP(如你已部署 LDAP)
🔄 四、启动 Gerrit 服务
~/gerrit_site/bin/gerrit.sh start
访问地址:
http://<你的服务器IP>:8080
🔐 五、配置用户认证(可选)
✅ 使用开发模式登录
编辑配置文件:
[auth]
type = DEVELOPMENT_BECOME_ANY_ACCOUNT
重启服务后可直接选择用户名登录。
✅ 使用 LDAP 登录(如已部署)
[auth]
type = LDAP
gitBasicAuth = true
[ldap]
server = ldap://localhost
accountBase = ou=users,dc=myorg,dc=local
accountPattern = (&(objectClass=inetOrgPerson)(uid=${username}))
username = cn=admin,dc=myorg,dc=local
password = <你的LDAP密码>
🔌 六、常用插件安装(可选)
cd ~/gerrit_site/plugins
wget https://gerrit-ci.gerritforge.com/view/Plugins/job/plugin-replication-bazel-master/lastSuccessfulBuild/artifact/bazel-bin/plugins/replication/replication.jar
然后重启服务。
📌 七、常用命令
| 命令 | 说明 |
|---|---|
gerrit.sh start |
启动服务 |
gerrit.sh stop |
停止服务 |
gerrit.sh restart |
重启服务 |
gerrit.sh status |
查看状态 |
👨💻 八、开发者使用流程
1. 上传 SSH 公钥
- 登录 Gerrit Web UI
- 进入用户设置 → SSH Keys → 添加公钥
2. 克隆项目仓库
git clone ssh://<user>@<server-ip>:29418/<project-name>
3. 提交代码并推送审查
git checkout -b feature-branch
git add .
git commit -m "Add new feature"
git push origin HEAD:refs/for/master
📌 补充说明
- Gerrit 内建 Jetty Web 服务,默认监听 8080,无需 Nginx。
- 若需启用 HTTPS,可配置 Jetty 的 SSL 证书(非必须)。
- 若后续需要负载均衡或统一入口,再考虑引入 Nginx。
Nginx作为 Gerrit 的反向代理或负载均衡器
🧭 为什么将 Nginx 与 Gerrit 分离部署?
✅ 优势一:安全隔离
- Nginx 作为前端网关,暴露公网端口。
- Gerrit 作为后端服务,仅在内网运行,减少攻击面。
✅ 优势二:负载均衡与高可用
- Nginx 可代理多个 Gerrit 实例,实现负载均衡。
- 可结合 Keepalived 实现高可用架构。
✅ 优势三:统一入口与证书管理
- Nginx 统一处理 HTTPS 证书(如 Let's Encrypt)。
- 可配置 URL 重写、访问控制、缓存策略。
🛠️ 架构示意图
[开发者浏览器]
↓
HTTPS 443
↓
┌──────────────┐
│ Nginx 服务器 │ ← 公网访问
└──────────────┘
↓
HTTP 8081
↓
┌──────────────┐
│ Gerrit 服务器 │ ← 内网部署
└──────────────┘
⚙️ Nginx 配置示例(部署在独立服务器)
server {
listen 443 ssl;
server_name gerrit.yourdomain.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location / {
proxy_pass http://gerrit.internal.ip:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
📌 注意事项
| 项目 | 建议 |
|---|---|
| 网络连接 | 确保 Nginx 能访问 Gerrit 内网地址 |
| 认证方式 | Gerrit 配置为 HTTP 模式,使用 Nginx 处理认证 |
| 端口管理 | Gerrit 可监听 8081,Nginx 监听 443/80 |
| 日志分析 | Nginx 可记录访问日志,便于审计与监控 |
Gerrit Trigger 插件介绍
Gerrit Trigger 插件的核心作用是:当 Gerrit 中发生代码审查事件时,自动触发 Jenkins 构建任务,实现持续集成流程自动化。
🔧 插件主要功能
自动触发 Jenkins 构建
- 当 Gerrit 中创建新的 Patch Set(代码提交)时,自动触发 Jenkins Job。
- 支持多种事件类型:如 Patchset Created、Change Merged、Comment Added 等。
精准匹配项目与分支
- 可配置 Gerrit 项目名、分支名、路径等触发条件,支持正则表达式。
- 例如:只在
refs/heads/master分支提交时触发构建。
构建结果反馈到 Gerrit
- Jenkins 构建完成后,会将结果(成功/失败)反馈到 Gerrit 的代码审查页面。
- 可配置投票等级,如
Verified +1/-1。
支持静默期(Silent Period)
- 可设置等待时间,避免频繁触发构建,适合高频提交场景。
支持多 Gerrit Server 配置
- 可同时连接多个 Gerrit 实例,适用于大型企业或多项目环境。
事件监听机制
- 插件通过 SSH 连接 Gerrit,监听
stream-events实时事件流,确保触发及时可靠。
- 插件通过 SSH 连接 Gerrit,监听
🚀 使用场景示例
| Gerrit事件类型 | Jenkins行为 |
|---|---|
| Patchset Created | 自动触发构建 |
| Change Merged | 执行部署或发布任务 |
| Comment Added | 根据评论内容触发特定构建 |
📌 配置建议
- 在 Gerrit 中创建专用 Jenkins 用户,并配置 SSH 公钥。
- 将该用户加入 Gerrit 的
Service Users或Non-Interactive Users组。 - 在 Jenkins 中配置 Gerrit Server 地址、端口、认证方式。
- 在 Job 中添加 “Gerrit Trigger” 构建触发器,并设置项目匹配规则。
以下是我成功配置 Jenkins 与 Gerrit Trigger 插件的完整文档汇总:
🧩 Jenkins 与 Gerrit Trigger 插件集成配置文档(适用于 LDAP 用户)
📦 一、插件安装
- 登录 Jenkins 管理后台。
- 进入 插件管理 → 可选插件。
- 搜索并安装 Gerrit Trigger Plugin。
- 安装完成后重启 Jenkins。
🔐 二、Jenkins 主机 SSH 密钥配置
使用 Jenkins 用户生成 SSH 密钥:
sudo -u jenkins ssh-keygen -t rsa -b 4096 -f /var/lib/jenkins/.ssh/id_rsa设置权限:
sudo chown -R jenkins:jenkins /var/lib/jenkins/.ssh sudo chmod 700 /var/lib/jenkins/.ssh sudo chmod 600 /var/lib/jenkins/.ssh/id_rsa
🧑💼 三、Gerrit 上配置 LDAP 用户 jenkins-bot
假设 Gerrit 使用 LDAP 认证,
jenkins-bot是 LDAP 中的系统用户。
1. 激活用户
- 让
jenkins-bot登录一次 Gerrit Web UI,或通过 REST API 激活。
2. 添加 SSH 公钥
- 登录 Gerrit Web UI →
Settings→SSH Public Keys。 - 粘贴 Jenkins 主机上的
id_rsa.pub内容。
3. 分配权限组
将 jenkins-bot 添加至以下权限组(或等效自定义组):
| 权限组名称 | 作用说明 |
|---|---|
| Non-Interactive Users | 禁用 shell,适合机器人账户 |
| Service Users | 系统集成用户基本权限 |
| Stream Events Access | 允许执行 stream-events 命令 |
| Verified Label Access | 构建结果反馈 Gerrit(+1/-1) |
4. jenkins服务器上验证连接
sudo -u jenkins ssh -i /var/lib/jenkins/.ssh/id_rsa jenkins-bot@<gerrit-host> -p 29418
确认能看到 Gerrit 欢迎信息。
⚙️ 四、Jenkins 配置 Gerrit Server
- 进入 Jenkins → 系统管理 → Gerrit Trigger → Global Configuration。
添加 Gerrit Server:
- 名称:如
Gerritserver - 主机地址:Gerrit地址如
10.1.19.28 - 端口:
29418 - 用户名:
jenkins-bot - 私钥路径:
/var/lib/jenkins/.ssh/id_rsa
- 名称:如
设置线程参数:
- 接收线程数:3
- 发送线程数:1
- 缓存过期时间:360
- 保存配置并确认状态为 ✅。
🧪 五、配置 Jenkins Job 触发器
- 创建或编辑 Jenkins Job。
- 在“构建触发器”中勾选 Gerrit Trigger。
配置触发条件:
- 项目名(支持正则)
- 分支名(如
refs/heads/master) - 事件类型(如 Patchset Created)
可选:配置构建结果反馈 Gerrit:
- 设置
Verified标签权限 - 构建后步骤中添加反馈动作
- 设置
✅ 六、验证集成效果
- 在 Gerrit 提交一个新的 Patchset。
- Jenkins 自动触发对应 Job。
- 构建完成后,结果反馈至 Gerrit 审查页面(如
Verified +1)。
✅ Jenkins 与 Gerrit 集成测试案例
🧭 一、环境准备
1. Gerrit 服务器配置
- 地址:
http://10.1.19.28:8080 - 创建项目:
test - 创建用户:
jenkins-bot 为
jenkins-bot添加 SSH 公钥:- 登录 Gerrit → Settings → SSH Public Keys → 添加
id_rsa.pub内容
- 登录 Gerrit → Settings → SSH Public Keys → 添加
2. Jenkins 环境配置
安装插件:
- Gerrit Trigger
- Gerrit Code Review Plugin
- 创建 Freestyle 项目:
gerrit-test-job 配置 SSH:
- Jenkins 使用
jenkins-bot用户的id_rsa私钥连接 Gerrit 测试连接:
ssh -p 29418 jenkins-bot@10.1.19.28
- Jenkins 使用
🛠 二、Jenkins 项目配置
1. 启用 Gerrit Trigger
- 勾选 “Gerrit Trigger”
Gerrit 服务器配置:
- Host:
10.1.19.28 - Port:
29418 - Username:
jenkins-bot - SSH Key: 指向
id_rsa文件路径
- Host:
2. 配置触发器
- Gerrit 项目:
test - 分支:
refs/heads/master - 事件类型:Patchset Created
3. 构建步骤
添加 Shell 构建命令:
echo "开始构建 Gerrit Patchset" echo "构建成功"
4. 构建结果反馈
成功时:
- Verified: +1
- Message: 构建成功,验证通过
失败时:
- Verified: -1
- Message: 构建失败,请检查日志
🧪 三、测试流程
1. 克隆项目代码
git clone ssh://jenkins-bot@10.1.19.28:29418/test.git
cd test
2. 切换到代码分支
git checkout master
3. 修改文件并提交
echo "测试 Jenkins 构建" >> README.md
git add README.md
git commit -m "Update README for Jenkins test"
4. 推送到 Gerrit 进行评审
git push origin HEAD:refs/for/master
✅ 四、验证结果
1. Jenkins 构建日志显示:
Gerrit Trigger: Received Patchset Created event
开始构建 Gerrit Patchset
构建成功
2. Gerrit 页面显示:
- Patchset 被成功创建
Jenkins 自动打标签:
- Verified: +1
- Message: 构建成功,验证通过
🎉 测试成功标志
| 项目 | 状态 |
|---|---|
| SSH 连接验证 | ✅ 成功 |
| Jenkins 构建触发 | ✅ 成功 |
| 构建日志输出 | ✅ 正常 |
| Gerrit Patchset 打标签 | ✅ Verified +1 |