10 KiB
10 KiB
CI/CD 流水线部署方案
概述
当前项目已部署 Gerrit 代码审查系统(运行在 http://101.43.95.130:8080),本文档提供几种 CI/CD 流水线部署方案,可根据需求选择。
方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Jenkins | 功能强大、插件丰富、与 Gerrit 集成好 | 资源占用较大 | 企业级、复杂流水线 |
| Drone CI | 轻量级、现代化、Docker 原生 | 功能相对简单 | 中小型项目、容器化环境 |
| GitLab Runner | 独立运行、配置简单 | 需要单独配置 | 熟悉 GitLab CI 语法 |
| Webhook + 脚本 | 最轻量、完全自定义 | 需要自己开发 | 简单自动化需求 |
方案一:Jenkins(推荐)
特点
- ✅ 与 Gerrit 深度集成,支持事件触发
- ✅ 丰富的插件生态
- ✅ 成熟的流水线配置(Pipeline as Code)
- ✅ 支持分布式构建
安装步骤
1. 快速安装(使用脚本)
# 运行 Jenkins 安装脚本
bash install_jenkins.sh
2. 手动安装
# 1. 安装 Jenkins(CentOS/RHEL)
sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum install -y jenkins
# 2. 启动 Jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
# 3. 查看初始密码
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
# 4. 访问 Jenkins
# http://101.43.95.130:8080(如果端口冲突,Jenkins 默认使用 8080,需要修改)
Gerrit 集成配置
1. 安装 Gerrit Trigger 插件
- Jenkins 管理界面 → 插件管理 → 搜索 "Gerrit Trigger" → 安装
2. 配置 Gerrit 连接
- Jenkins 管理界面 → 系统配置 → Gerrit Trigger
- 添加 Gerrit Server:
- Name:
Gerrit-Server - Frontend URL:
http://101.43.95.130:8080 - SSH Port:
29418 - Username:
admin(或您的 Gerrit 用户名) - SSH Keyfile:
/home/renjianbo/.ssh/id_rsa(Gerrit SSH 密钥路径)
- Name:
3. 创建流水线任务
- 新建任务 → 选择 "流水线" 类型
- 在 Pipeline 脚本中配置:
pipeline {
agent any
triggers {
gerrit(
serverName: 'Gerrit-Server',
events: [
changeMerged(),
patchsetCreated()
],
project: 'plain:.*',
branch: 'plain:.*'
)
}
stages {
stage('构建') {
steps {
echo '开始构建...'
sh 'mvn clean package' // 或您的构建命令
}
}
stage('测试') {
steps {
echo '运行测试...'
sh 'mvn test'
}
}
stage('部署') {
steps {
echo '部署应用...'
// 您的部署脚本
}
}
}
post {
success {
echo '流水线执行成功'
}
failure {
echo '流水线执行失败'
}
}
}
方案二:Drone CI(轻量级)
特点
- ✅ 轻量级,资源占用小
- ✅ 基于 Docker,易于扩展
- ✅ 配置简单,YAML 格式
- ✅ 支持 Gerrit Webhook
安装步骤
1. 安装 Docker(如果未安装)
# CentOS/RHEL
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
2. 安装 Drone Server
# 创建 Drone 配置目录
sudo mkdir -p /opt/drone
cd /opt/drone
# 运行 Drone Server(使用 Docker)
docker run \
--volume=/opt/drone:/data \
--env=DRONE_GERRIT_SERVER=http://101.43.95.130:8080 \
--env=DRONE_GERRIT_USERNAME=admin \
--env=DRONE_RPC_SECRET=$(openssl rand -hex 16) \
--env=DRONE_SERVER_HOST=101.43.95.130:3000 \
--env=DRONE_SERVER_PROTO=http \
--publish=3000:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:latest
3. 安装 Drone Runner
# 运行 Drone Runner
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=101.43.95.130:3000 \
-e DRONE_RPC_SECRET=<从上面获取的密钥> \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=runner-1 \
--restart always \
--name runner \
drone/drone-runner-docker:latest
配置 Gerrit Webhook
在 Gerrit 项目中创建 .drone.yml 文件:
kind: pipeline
type: docker
name: default
steps:
- name: build
image: maven:3.8-openjdk-17
commands:
- mvn clean package
- name: test
image: maven:3.8-openjdk-17
commands:
- mvn test
- name: deploy
image: alpine
commands:
- echo "部署应用..."
在 Gerrit 项目设置中配置 Webhook:
- URL:
http://101.43.95.130:3000/hook - 触发事件:
change-merged,patchset-created
方案三:GitLab Runner(独立运行)
特点
- ✅ 独立运行,不需要 GitLab
- ✅ 使用 GitLab CI 语法
- ✅ 支持多种执行器(Docker、Shell 等)
安装步骤
# 1. 下载 GitLab Runner
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
sudo yum install -y gitlab-runner
# 2. 注册 Runner(需要 GitLab 实例,或使用本地配置)
sudo gitlab-runner register \
--non-interactive \
--url "http://localhost" \
--registration-token "your-token" \
--executor "shell" \
--description "Gerrit Runner"
# 3. 启动 Runner
sudo systemctl start gitlab-runner
sudo systemctl enable gitlab-runner
使用方式
在项目根目录创建 .gitlab-ci.yml:
stages:
- build
- test
- deploy
build:
stage: build
script:
- echo "构建项目..."
- mvn clean package
test:
stage: test
script:
- echo "运行测试..."
- mvn test
deploy:
stage: deploy
script:
- echo "部署应用..."
通过 Gerrit Webhook 触发 GitLab Runner 执行。
方案四:Webhook + 自定义脚本(最简单)
特点
- ✅ 最轻量,无需额外服务
- ✅ 完全自定义
- ✅ 资源占用最小
实现步骤
1. 创建 Webhook 接收脚本
# 创建目录
mkdir -p /opt/ci-scripts
cd /opt/ci-scripts
# 创建简单的 HTTP 服务器接收 Webhook
cat > webhook_receiver.py << 'EOF'
#!/usr/bin/env python3
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import subprocess
import os
class WebhookHandler(BaseHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
try:
event = json.loads(post_data.decode('utf-8'))
# 处理 Gerrit 事件
if event.get('type') == 'patchset-created':
project = event.get('change', {}).get('project')
branch = event.get('change', {}).get('branch')
# 执行构建脚本
script_path = f'/opt/ci-scripts/build.sh'
if os.path.exists(script_path):
subprocess.Popen(['bash', script_path, project, branch])
self.send_response(200)
self.end_headers()
except Exception as e:
print(f"Error: {e}")
self.send_response(500)
self.end_headers()
if __name__ == '__main__':
server = HTTPServer(('0.0.0.0', 9000), WebhookHandler)
print("Webhook receiver started on port 9000")
server.serve_forever()
EOF
chmod +x webhook_receiver.py
2. 创建构建脚本
cat > /opt/ci-scripts/build.sh << 'EOF'
#!/bin/bash
PROJECT=$1
BRANCH=$2
echo "构建项目: $PROJECT, 分支: $BRANCH"
# 克隆或更新代码
cd /tmp
if [ -d "$PROJECT" ]; then
cd $PROJECT
git pull
else
git clone ssh://admin@101.43.95.130:29418/$PROJECT
cd $PROJECT
fi
# 执行构建
# 根据项目类型执行不同的构建命令
if [ -f "pom.xml" ]; then
mvn clean package
elif [ -f "package.json" ]; then
npm install && npm run build
fi
echo "构建完成"
EOF
chmod +x /opt/ci-scripts/build.sh
3. 启动 Webhook 服务
# 使用 systemd 管理
sudo tee /etc/systemd/system/webhook-ci.service > /dev/null << EOSERVICE
[Unit]
Description=CI Webhook Receiver
After=network.target
[Service]
Type=simple
User=renjianbo
WorkingDirectory=/opt/ci-scripts
ExecStart=/usr/bin/python3 /opt/ci-scripts/webhook_receiver.py
Restart=always
[Install]
WantedBy=multi-user.target
EOSERVICE
sudo systemctl daemon-reload
sudo systemctl start webhook-ci
sudo systemctl enable webhook-ci
4. 配置 Gerrit Webhook
在 Gerrit 项目设置中添加 Webhook:
- URL:
http://101.43.95.130:9000 - 事件:
patchset-created,change-merged
推荐方案选择
🎯 个人小团队推荐(首选)
推荐:方案四 - Webhook + 自定义脚本
- ✅ 最轻量:资源占用最小,几乎零开销
- ✅ 最简单:无需安装复杂服务,直接运行脚本
- ✅ 完全可控:所有逻辑自己掌控,易于调试
- ✅ 快速部署:5分钟即可完成部署
- ⚠️ 适合场景:个人开发者、小团队、简单构建需求
备选:方案二 - Drone CI
- ✅ 现代化:轻量级 CI/CD 工具
- ✅ Docker 原生:适合容器化项目
- ✅ 配置简单:YAML 格式配置
- ⚠️ 需要 Docker:服务器需要安装 Docker
场景 1:企业级、复杂流水线
推荐:Jenkins
- 需要多环境部署
- 需要复杂的构建流程
- 需要详细的构建报告和通知
场景 2:中小型项目、容器化
推荐:Drone CI
- 项目规模中等
- 使用 Docker 容器
- 需要快速部署
场景 3:简单自动化
推荐:Webhook + 脚本
- 只需要简单的构建和部署
- 资源有限
- 完全自定义需求
端口规划
| 服务 | 端口 | 说明 |
|---|---|---|
| Gerrit | 8080 | 已部署 |
| Jenkins | 8081 | 避免与 Gerrit 冲突 |
| Drone CI | 3000 | Web 界面 |
| Webhook Receiver | 9000 | 自定义脚本 |
下一步
- 选择适合的方案
- 运行对应的安装脚本
- 配置 Gerrit 集成
- 创建第一个流水线任务
如需帮助,请参考各方案的详细安装脚本。