# 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. 快速安装(使用脚本) ```bash # 运行 Jenkins 安装脚本 bash install_jenkins.sh ``` #### 2. 手动安装 ```bash # 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 密钥路径) #### 3. 创建流水线任务 - 新建任务 → 选择 "流水线" 类型 - 在 Pipeline 脚本中配置: ```groovy 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(如果未安装) ```bash # CentOS/RHEL sudo yum install -y docker sudo systemctl start docker sudo systemctl enable docker ``` #### 2. 安装 Drone Server ```bash # 创建 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 ```bash # 运行 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` 文件: ```yaml 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 等) ### 安装步骤 ```bash # 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`: ```yaml 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 接收脚本 ```bash # 创建目录 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. 创建构建脚本 ```bash 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 服务 ```bash # 使用 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 | 自定义脚本 | --- ## 下一步 1. 选择适合的方案 2. 运行对应的安装脚本 3. 配置 Gerrit 集成 4. 创建第一个流水线任务 如需帮助,请参考各方案的详细安装脚本。