持续集成与部署 (CI/CD)
约 793 字大约 3 分钟
CI/CD持续集成自动化部署
2024-08-13
概述
CI/CD 是现代软件开发的核心实践,通过自动化流程提高软件交付效率和质量。
代码提交 → 自动化构建 → 自动化测试 → 自动化部署
↑ ↓
└────────────── 反馈循环 ───────────────┘持续集成 (CI)
核心原则
- 频繁提交代码
- 自动化构建
- 自动化测试
- 快速反馈
常见 CI 工具
| 工具 | 特点 |
|---|---|
| GitHub Actions | 与 GitHub 深度集成 |
| GitLab CI | GitLab 内置 |
| Jenkins | 开源、插件丰富 |
| Travis CI | GitHub 常用 |
持续部署 (CD)
部署策略
1. 蓝绿部署
┌─────────────┐ ┌─────────────┐
│ 蓝环境 │ │ 绿环境 │
│ (当前生产) │ ──▶ │ (新版本) │
└─────────────┘ └─────────────┘- 两套相同环境,一套运行当前版本,一套部署新版本
- 切换时只需切换流量
- 缺点:资源消耗大
2. 金丝雀发布
- 先将新版本部署到少量服务器
- 验证无误后逐步扩大范围
- 风险可控
# 示例:Kubernetes Canary Deployment
apiVersion: v1
kind: Service
metadata:
name: my-app
spec:
selector:
app: my-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-canary
spec:
replicas: 1 # 少量金丝雀实例3. 滚动更新
- 逐步替换旧版本实例
- 资源消耗较小
- 适合无状态服务
GitHub Actions
基本结构
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npm test
- run: npm run build
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "Deploying..."常用 Action
| Action | 用途 |
|---|---|
| actions/checkout | 检出代码 |
| actions/setup-node | 设置 Node.js |
| actions/cache | 缓存依赖 |
| azure/login | Azure 登录 |
| google-github-actions/auth | GCP 认证 |
Docker 基础
常用命令
# 构建镜像
docker build -t myapp:latest .
# 运行容器
docker run -d -p 3000:3000 myapp:latest
# 查看运行中的容器
docker ps
# 查看镜像
docker images
# 进入容器
docker exec -it <container_id> /bin/bashDockerfile 示例
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Kubernetes 基础
核心概念
| 概念 | 描述 |
|---|---|
| Pod | 最小部署单元,包含一个或多个容器 |
| Deployment | 管理 Pod 副本数,支持滚动更新 |
| Service | 为 Pod 提供稳定的访问入口 |
| Ingress | HTTP/HTTPS 路由 |
| ConfigMap | 配置信息 |
| Secret | 敏感信息 |
常用命令
# 部署应用
kubectl apply -f deployment.yaml
# 查看 pods
kubectl get pods
# 查看日志
kubectl logs <pod-name>
# 扩缩容
kubectl scale deployment myapp --replicas=3
# 滚动更新
kubectl set image deployment/myapp myapp=myapp:v2环境管理
多环境配置
开发环境 (dev) → 开发人员测试
预发布环境 (staging) → 生产环境前验证
生产环境 (prod) → 最终用户配置文件管理
// config/index.js
const env = process.env.NODE_ENV || 'development';
const config = {
development: {
apiBase: 'http://localhost:3000',
},
staging: {
apiBase: 'https://staging-api.example.com',
},
production: {
apiBase: 'https://api.example.com',
},
};
module.exports = config[env];最佳实践
- 小步快跑: 频繁提交,小批量发布
- 自动化一切: 构建、测试、部署
- 回滚计划: 始终保持回滚能力
- 监控告警: 及时发现并处理问题
- 环境一致性: 开发、测试、生产环境统一
- 安全第一: 敏感信息使用 secrets
