CI-CD
CI/CD 是把"代码到上线"自动化:CI(持续集成)自动构建+测试每次提交,CD(持续交付/部署)把验证过的产物自动发布。目标是消灭"手工打包、上传、重启"的重复劳动和人为失误,让交付频率从"按月"提升到"按需"。CI 关注"提交后自动验证",CD 关注"验证通过后自动上线",常合称流水线(Pipeline)。
CI 与 CD 的边界
| 阶段 | 做什么 | 触发 | 失败处理 |
|---|---|---|---|
| CI 持续集成 | 拉代码→依赖安装→编译→单元测试→静态检查→构建产物 | 每次 push/PR | 阻断合并 |
| CD 持续交付 | CI 产物→集成测试→打包镜像→发布到测试/预发环境 | 通过 CI 后 | 人工确认可上线 |
| CD 持续部署 | 自动发布到生产 | 通过预发验证 | 自动回滚 |
常用工具
| 工具 | 定位 | 特点 |
|---|---|---|
| GitHub Actions | GitHub 内置 CI/CD | 仓库内 .github/workflows 定义,生态丰富 |
| GitLab CI | GitLab 内置 | .gitlab-ci.yml,自建 GitLab 常用 |
| Jenkins | 通用 CI 服务器 | 插件最全、部署灵活(Java 生态老牌) |
| Gitee/Gitea Actions | 国内平台 | 与 GitHub Actions 语法兼容 |
| ArgoCD | CD 专用(K8s) | GitOps 声明式部署(见 云原生) |
流水线最佳实践(GitHub Actions 示例)
# .github/workflows/deploy.yml
name: CI/CD
on:
push:
branches: [main]
jobs:
build-and-test: # CI 阶段
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with: { java-version: '17' }
- name: 编译与测试
run: mvn -B package
- name: 上传产物
uses: actions/upload-artifact@v4
with: { name: jar, path: target/*.jar }
deploy: # CD 阶段(依赖 CI 成功)
needs: build-and-test
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with: { name: jar }
- name: 构建并推送 Docker 镜像
run: |
docker build -t registry.example.com/app:${{ github.sha }} .
docker push registry.example.com/app:${{ github.sha }}
- name: 部署到服务器
run: ssh deploy@server "docker compose pull && docker compose up -d"环境变量与密钥
密码、Token 绝不写进仓库,用平台 Secret 管理(Actions 的 ${{ secrets.xxx }})——CI 日志默认会打码,但自己打印 Secret 值仍会泄露。环境差异化配置(测试/预发/生产)用各环境独立 Secret 或变量组。
关键实践
| 实践 | 说明 |
|---|---|
| 提交即构建 | 每次 push 都跑 CI,尽早暴露问题 |
| 单命令可复现 | mvn package/npm ci 等一条命令完成构建,CI 与本地一致 |
| 产物不可变 | 用 commit SHA/版本号打镜像标签,不用 latest(无法回滚) |
| 测试分快慢 | 单元测试每次跑,集成/E2E 在合并或夜间跑 |
| 失败即阻断 | CI 失败阻止合并,避免坏代码进主干 |
| 回滚要快 | CD 保留上一版本镜像,一键回滚 |
# 镜像标签用 commit SHA:可精确定位、可回滚
docker build -t app:$(git rev-parse --short HEAD) .
docker push app:$(git rev-parse --short HEAD)常见问题
| 问题 | 处理 |
|---|---|
| 构建在 CI 通过本地失败 | 统一 JDK/Node 版本、锁依赖(lock 文件)、容器化构建 |
| 流水线慢 | 依赖缓存(Maven ~/.m2、npm cache)、并行 job |
| 部署失败 | 先回滚上一版本,再查日志;部署与发布分离(蓝绿/金丝雀) |
| 密钥泄露 | 立即吊销轮换,改写 git 历史(见 版本控制) |
CI/CD 与 Docker 的镜像化部署、Kubernetes 的容器编排、云原生 的 GitOps(ArgoCD)构成现代化交付体系。