---
title: "Linux CI/CD 服务搭建实践：SVN、Review Board、Jenkins 与 Gerrit"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/linux-cicd-server-svn-jenkins-gerrit/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/03-软件工程与质量保障/CI-CD与质量保障/CI-CD工具链/【DevOps】Linux服务器实践（ReviewBoard，Jenki.md"
content_hash: 38169c6b3c9e0c67188f84f95f9f4b36b48800f39319ac249012a499441a9232
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# Linux CI/CD 服务搭建实践：SVN、Review Board、Jenkins 与 Gerrit

> **warning · 历史材料已通用化**
> 本文由早期服务器部署记录整理而来，已移除地址、账号、口令、密钥、域名、许可证和内部路径。原记录使用的 CentOS Linux 7 已于 2024 年 6 月 30 日停止维护，不应继续作为新部署的默认选择。

## 先确定部署边界

一套代码评审与持续集成环境通常包含：

- 版本控制：SVN 或 Git。
- 评审入口：Review Board（可连接 SVN/Git）或 Gerrit（以 Git 评审工作流为核心）。
- 自动化执行：Jenkins Controller 与一个或多个 Agent。
- 反向代理与 TLS：Nginx、Apache HTTP Server 或云负载均衡。
- 持久化存储：数据库、制品库、备份存储。
- 身份与密钥：Jenkins Credentials、系统密钥环或专用密钥管理服务。

生产环境应优先选择仍在安全支持期内的发行版或容器基础镜像，并把系统版本、服务版本、插件版本和恢复步骤记录在基础设施代码中。

## 安全基线

1. **不在笔记、脚本和命令行中写入真实凭据。** 使用凭据 ID、环境变量名或 `<placeholder>`。
2. **服务账号最小权限。** 构建账号只获得所需仓库、目录和发布目标的权限。
3. **减少暴露面。** 数据库和管理端口默认仅在内网开放；公网入口通过 TLS 反向代理，并同时检查主机防火墙和云安全组。
4. **凭据可轮换。** 不共享个人账号；撤销成员权限时不应影响其他流水线。
5. **备份必须演练恢复。** 至少覆盖配置、数据库、插件清单、凭据密文所依赖的主密钥和制品索引。

## SVN 与 Review Board

### SVN 服务

- 明确仓库根目录、认证方式、授权文件和备份策略。
- 若通过 HTTP(S) 暴露 SVN，TLS 应在反向代理或 Web 服务器终止。
- 自动化账号使用独立凭据，不复用开发者个人账号。
- 升级前验证客户端兼容性，并在副本上测试仓库恢复。

### Review Board

Review Board 需要 Web 服务、数据库及仓库访问凭据。部署时应：

- 为站点配置独立数据库用户；
- 通过管理界面或密钥管理机制保存仓库凭据；
- 限制管理界面来源并启用 TLS；
- 将站点配置、数据库和上传文件纳入备份。

具体安装命令会随发行版和 Review Board 版本变化，应以项目当前安装文档为准。

## Jenkins

### Controller 与 Agent

- Controller 负责调度、配置和状态管理，不承担高风险或高负载构建。
- 构建在隔离的 Agent 上执行；不同信任级别的项目不要共享高权限 Agent。
- 插件数量保持最小，升级前导出插件清单并在测试实例验证。

### 凭据

把 SVN/Git、制品库、签名和部署凭据存入 Jenkins Credentials，以凭据 ID 在流水线中引用。日志中避免输出环境变量、调试转储或包含秘密的命令参数。即便使用 `withCredentials`，也要防止不受信任的构建步骤读取同一进程或工作区中的秘密。

```groovy
withCredentials([usernamePassword(
  credentialsId: 'scm-service-account',
  usernameVariable: 'SCM_USER',
  passwordVariable: 'SCM_PASSWORD'
)]) {
  sh 'run-build-with-secret-from-environment'
}
```

示例只表达调用结构；实际脚本仍应关闭命令回显，并避免把秘密写入参数、文件或制品。

## Gerrit

Gerrit 与普通 Git 托管的关键差异是变更通常先进入评审引用，再由评审结果决定是否合入目标分支。部署时重点检查：

- SSH/HTTP Git 访问与 Web 入口的端口边界；
- 反向代理是否正确传递主机名、协议和认证头；
- 邮件、LDAP/OIDC 等外部集成是否使用独立服务账号；
- 数据库、索引、插件、仓库目录和配置文件是否能一致恢复。

## 故障排查顺序

1. 确认 DNS、路由、云安全组和主机防火墙。
2. 确认服务是否监听预期地址与端口。
3. 检查反向代理上游、TLS 证书链和转发头。
4. 用服务账号在 Agent 上独立验证仓库访问。
5. 检查磁盘、inode、文件权限、SELinux/AppArmor 和系统日志。
6. 最后检查 Jenkins 任务、插件与流水线配置，避免把网络或权限问题误判为插件故障。

## 参考资料

- [CentOS Linux 停止维护说明](https://www.centos.org/centos-linux/)
- [Jenkins Credentials Binding 插件](https://plugins.jenkins.io/credentials-binding)
- [Review Board 官方文档](https://www.reviewboard.org/docs/)
- [Gerrit 官方文档](https://www.gerritcodereview.com/)
