以下是企业级 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 选择 yN
  • Canonical URL:填写实际访问地址,如 http://10.1.1.28:8080/
  • Authentication method:建议选择 DEVELOPMENT_BECOME_ANY_ACCOUNTLDAP(如你已部署 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 公钥

  2. 登录 Gerrit Web UI

  3. 进入用户设置 → SSH Keys → 添加公钥

  4. 克隆项目仓库

    git clone ssh://<user>@:29418/

  5. 提交代码并推送审查

    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 CreatedChange MergedComment Added 等。
  • 精准匹配项目与分支

    • 可配置 Gerrit 项目名、分支名、路径等触发条件,支持正则表达式。
    • 例如:只在 refs/heads/master 分支提交时触发构建。
  • 构建结果反馈到 Gerrit

    • Jenkins 构建完成后,会将结果(成功/失败)反馈到 Gerrit 的代码审查页面。
    • 可配置投票等级,如 Verified +1/-1
  • 支持静默期(Silent Period)

    • 可设置等待时间,避免频繁触发构建,适合高频提交场景。
  • 支持多 Gerrit Server 配置

    • 可同时连接多个 Gerrit 实例,适用于大型企业或多项目环境。
  • 事件监听机制

    • 插件通过 SSH 连接 Gerrit,监听 stream-events 实时事件流,确保触发及时可靠。

使用场景示例

Gerrit事件类型 Jenkins行为
Patchset Created 自动触发构建
Change Merged 执行部署或发布任务
Comment Added 根据评论内容触发特定构建

配置建议

  • 在 Gerrit 中创建专用 Jenkins 用户,并配置 SSH 公钥。
  • 将该用户加入 Gerrit 的 Service UsersNon-Interactive Users 组。
  • 在 Jenkins 中配置 Gerrit Server 地址、端口、认证方式。
  • 在 Job 中添加 “Gerrit Trigger” 构建触发器,并设置项目匹配规则。

以下是我成功配置 Jenkins 与 Gerrit Trigger 插件的完整文档汇总:

Jenkins 与 Gerrit Trigger 插件集成配置文档(适用于 LDAP 用户)

一、插件安装

  1. 登录 Jenkins 管理后台。
  2. 进入 插件管理可选插件
  3. 搜索并安装 Gerrit Trigger Plugin
  4. 安装完成后重启 Jenkins。

二、Jenkins 主机 SSH 密钥配置

  1. 使用 Jenkins 用户生成 SSH 密钥:

    sudo -u jenkins ssh-keygen -t rsa -b 4096 -f /var/lib/jenkins/.ssh/id_rsa
    
  2. 设置权限:

    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. 激活用户

  2. jenkins-bot 登录一次 Gerrit Web UI,或通过 REST API 激活。

  3. 添加 SSH 公钥

  4. 登录 Gerrit Web UI → SettingsSSH Public Keys

  5. 粘贴 Jenkins 主机上的 id_rsa.pub 内容。

  6. 分配权限组

jenkins-bot 添加至以下权限组(或等效自定义组):

权限组名称 作用说明
Non-Interactive Users 禁用 shell,适合机器人账户
Service Users 系统集成用户基本权限
Stream Events Access 允许执行 stream-events 命令
Verified Label Access 构建结果反馈 Gerrit(+1/-1)
  1. jenkins服务器上验证连接

    sudo -u jenkins ssh -i /var/lib/jenkins/.ssh/id_rsa jenkins-bot@ -p 29418

确认能看到 Gerrit 欢迎信息。

四、Jenkins 配置 Gerrit Server

  1. 进入 Jenkins → 系统管理 → Gerrit Trigger → Global Configuration。
  2. 添加 Gerrit Server:

    • 名称:如 Gerritserver
    • 主机地址:Gerrit地址如 10.1.19.28
    • 端口:29418
    • 用户名:jenkins-bot
    • 私钥路径:/var/lib/jenkins/.ssh/id_rsa
  3. 设置线程参数:

    • 接收线程数:3
    • 发送线程数:1
    • 缓存过期时间:360
  4. 保存配置并确认状态为 ✅。

五、配置 Jenkins Job 触发器

  1. 创建或编辑 Jenkins Job。
  2. 在“构建触发器”中勾选 Gerrit Trigger
  3. 配置触发条件:

    • 项目名(支持正则)
    • 分支名(如 refs/heads/master
    • 事件类型(如 Patchset Created)
  4. 可选:配置构建结果反馈 Gerrit:

    • 设置 Verified 标签权限
    • 构建后步骤中添加反馈动作

六、验证集成效果

  1. 在 Gerrit 提交一个新的 Patchset。
  2. Jenkins 自动触发对应 Job。
  3. 构建完成后,结果反馈至 Gerrit 审查页面(如 Verified +1)。

Jenkins 与 Gerrit 集成测试案例

一、环境准备

  1. Gerrit 服务器配置

  2. 地址:http://10.1.19.28:8080

  3. 创建项目:test
  4. 创建用户:jenkins-bot
  5. jenkins-bot 添加 SSH 公钥:

    • 登录 Gerrit → Settings → SSH Public Keys → 添加 id_rsa.pub 内容
  6. Jenkins 环境配置

  7. 安装插件:

    • Gerrit Trigger
    • Gerrit Code Review Plugin
  8. 创建 Freestyle 项目:gerrit-test-job
  9. 配置 SSH:

    • Jenkins 使用 jenkins-bot 用户的 id_rsa 私钥连接 Gerrit
    • 测试连接:

      ssh -p 29418 jenkins-bot@10.1.19.28
      

二、Jenkins 项目配置

  1. 启用 Gerrit Trigger

  2. 勾选 “Gerrit Trigger”

  3. Gerrit 服务器配置:

    • Host: 10.1.19.28
    • Port: 29418
    • Username: jenkins-bot
    • SSH Key: 指向 id_rsa 文件路径
  4. 配置触发器

  5. Gerrit 项目:test

  6. 分支:refs/heads/master
  7. 事件类型:Patchset Created

  8. 构建步骤

  9. 添加 Shell 构建命令:

    echo "开始构建 Gerrit Patchset"
    echo "构建成功"
    
  10. 构建结果反馈

  11. 成功时:

    • Verified: +1
    • Message: 构建成功,验证通过
  12. 失败时:

    • 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 页面显示:

  3. Patchset 被成功创建

  4. Jenkins 自动打标签:

    • Verified: +1
    • Message: 构建成功,验证通过

测试成功标志

项目 状态
SSH 连接验证 ✅ 成功
Jenkins 构建触发 ✅ 成功
构建日志输出 ✅ 正常
Gerrit Patchset 打标签 ✅ Verified +1
Copyright © https://yan-jian.com 2023 all right reserved更新时间: 2026-01-12 17:31:29

results matching ""

    No results matching ""