关于 ci-cd-best-practices
面向 DevOps 团队的 CI/CD 实践指南,覆盖流水线设计、测试、安全、部署策略与回滚,帮助规划自动化交付流程。
主要功能
- 01构建、测试、安全与部署阶段
- 02蓝绿、金丝雀和滚动部署
- 03测试分层与并行执行
- 04密钥与依赖项安全管理
- 05流水线监控和回滚策略
适用场景
- 01设计自动化构建与发布流水线
- 02规划渐进式生产环境部署
- 03在流水线中加入安全扫描
- 04定义部署失败后的回滚流程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill ci-cd-best-practices安装后在 Claude Code 中输入/ci-cd-best-practices确认已加载。
详细介绍
CI/CD 最佳实践
你是持续集成和持续部署领域的专家,遵循自动化流水线、测试策略、部署模式和 DevOps 工作流方面的行业最佳实践。
核心原则
- 自动化所有可以自动化的事项
- 快速失败,及时反馈
- 一次构建,多次部署
- 将基础设施作为代码来管理
- 持续改进
- 在每个阶段确保安全
流水线设计
流水线阶段
典型的 CI/CD 流水线包含以下阶段:
Build -> Test -> Security -> Deploy (Staging) -> Deploy (Production)
1. 构建阶段
build:
stage: build
script:
- npm ci --prefer-offline
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 day
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
最佳实践:
- 使用依赖缓存来加快构建
- 生成供后续阶段使用的构建制品
- 固定依赖版本以确保可复现性
- 使用多阶段 Docker 构建来减小镜像体积
2. 测试阶段
test:
stage: test
parallel:
matrix:
- TEST_TYPE: [unit, integration, e2e]
script:
- npm run test:${TEST_TYPE}
coverage: '/Coverage: \d+\.\d+%/'
artifacts:
reports:
junit: test-results.xml
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
测试层级:
- 单元测试:快速、隔离,并在每次提交时运行
- 集成测试:测试组件之间的交互
- 端到端测试:验证用户工作流
- 性能测试:检查是否出现性能回退
3. 安全阶段
security:
stage: security
parallel:
matrix:
- SCAN_TYPE: [sast, dependency, secrets]
script:
- ./security-scan.sh ${SCAN_TYPE}
allow_failure: false
安全扫描类型:
- SAST:静态应用安全测试
- DAST:动态应用安全测试
- 依赖扫描:检查是否存在易受攻击的软件包
- 机密检测:查找泄露的凭据
- 容器扫描:分析 Docker 镜像
4. 部署阶段
deploy:staging:
stage: deploy
environment:
name: staging
url: https://staging.example.com
script:
- ./deploy.sh staging
rules:
- if: $CI_COMMIT_BRANCH == "develop"
deploy:production:
stage: deploy
environment:
name: production
url: https://example.com
script:
- ./deploy.sh production
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
部署策略
蓝绿部署
维护两个相同的环境:
deploy:blue-green:
script:
- ./deploy-to-inactive.sh
- ./run-smoke-tests.sh
- ./switch-traffic.sh
- ./cleanup-old-environment.sh
优势:
- 部署期间零停机
- 只需切回流量即可轻松回滚
- 可在类生产环境中进行完整测试
金丝雀部署
逐步向部分用户推出:
deploy:canary:
script:
- ./deploy-canary.sh --percentage=5
- ./monitor-metrics.sh --duration=30m
- ./deploy-canary.sh --percentage=25
- ./monitor-metrics.sh --duration=30m
- ./deploy-canary.sh --percentage=100
金丝雀发布阶段:
- 将 5% 的流量导向新版本
- 监控错误率和延迟
- 如果指标正常,则逐步提高流量比例
- 根据数据决定全面发布或回滚
滚动部署
逐步更新实例:
deploy:rolling:
script:
- kubectl rollout restart deployment/app
- kubectl rollout status deployment/app --timeout=5m
配置:
- 设置
maxUnavailable和maxSurge - 通过健康检查决定发布速度
- 失败时自动回滚
功能标志
将部署与发布解耦:
// Feature flag implementation
if (featureFlags.isEnabled('new-checkout')) {
return <NewCheckout />;
} else {
return <LegacyCheckout />;
}
优势:
- 将未启用的功能部署到生产环境
- 逐步推出功能
- 支持 A/B 测试
- 无需重新部署即可快速禁用功能
环境管理
环境层级
Development -> Testing -> Staging -> Production
每个环境都应:
- 尽可能贴近生产环境
- 使用隔离的数据和机密
- 将基础设施作为代码来管理
环境变量
variables:
# Global variables
APP_NAME: my-app
# Environment-specific
.staging:
variables:
ENV: staging
API_URL: https://api.staging.example.com
.production:
variables:
ENV: production
API_URL: https://api.example.com
最佳实践:
- 切勿将机密硬编码
- 使用机密管理工具(Vault、AWS Secrets Manager)
- 将配置与代码分离
- 记录所有必需的变量
基础设施即代码
# Terraform example
resource "aws_ecs_service" "app" {
name = var.app_name
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.app.arn
desired_count = var.environment == "production" ? 3 : 1
deployment_configuration {
maximum_percent = 200
minimum_healthy_percent = 100
}
}
测试策略
测试金字塔
/\
/ \ E2E Tests (Few)
/----\
/ \ Integration Tests (Some)
/--------\
/ \ Unit Tests (Many)
--------------
测试并行化
test:
parallel: 4
script:
- npm test -- --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL
测试数据管理
- 使用固定数据集来确保测试数据一致
- 在测试之间重置数据库状态
- 使用工厂生成动态测试数据
- 避免在测试中使用生产数据
不稳定测试处理
test:
retry:
max: 2
when:
- runner_system_failure
- stuck_or_timeout_failure
策略:
- 隔离不稳定的测试
- 针对已知问题添加重试逻辑
- 调查并修复根本原因
- 跟踪不稳定测试指标
监控与可观测性
流水线指标
跟踪以下指标:
- 前置时间:从提交到部署至生产环境所需的时间
- 部署频率:部署的频繁程度
- 变更失败率:失败部署所占的比例
- 平均恢复时间:修复故障所需的时间
健康检查
deploy:
script:
- ./deploy.sh
- ./wait-for-healthy.sh --timeout=300
- ./run-smoke-tests.sh
实现:
- 就绪探针
- 存活探针
- 启动探针
- 部署后的冒烟测试
告警
notify:failure:
stage: notify
script:
- ./send-alert.sh --channel=deployments --status=failed
when: on_failure
notify:success:
stage: notify
script:
- ./send-notification.sh --channel=deployments --status=success
when: on_success
CI/CD 安全
机密管理
# Use CI/CD secret variables
deploy:
script:
- echo "$DEPLOY_KEY" | base64 -d > deploy_key
- chmod 600 deploy_key
- ./deploy.sh
after_script:
- rm -f deploy_key
最佳实践:
- 定期轮换机密
- 使用短期凭据
- 审计机密访问
- 切勿记录机密
流水线安全
# Restrict who can run production deploys
deploy:production:
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual
allow_failure: false
environment:
name: production
deployment_tier: production
控制措施:
- 分支保护规则
- 必需的审批
- 审计日志
- 已签名的提交
依赖安全
dependency_check:
script:
- npm audit --audit-level=high
- ./check-licenses.sh
allow_failure: false
优化技巧
缓存
cache:
key:
files:
- package-lock.json
paths:
- node_modules/
policy: pull-push
缓存策略:
- 在多次运行之间缓存依赖项
- 使用基于内容的缓存键
- 为每个分支单独设置缓存
- 定期清理过期缓存
并行化
stages:
- build
- test
- deploy
# Run tests in parallel
test:unit:
stage: test
script: npm run test:unit
test:integration:
stage: test
script: npm run test:integration
test:e2e:
stage: test
script: npm run test:e2e
制品管理
build:
artifacts:
paths:
- dist/
expire_in: 1 week
when: on_success
最佳实践:
- 设置适当的过期时间
- 仅存储必要的制品
- 使用制品压缩
- 清理旧制品
回滚策略
自动回滚
deploy:
script:
- ./deploy.sh
- ./health-check.sh || ./rollback.sh
手动回滚
rollback:
stage: deploy
when: manual
script:
- ./get-previous-version.sh
- ./deploy.sh --version=$PREVIOUS_VERSION
数据库回滚
- 使用可逆迁移
- 测试回滚流程
- 考虑数据兼容性
- 制定备份恢复流程
文档
流水线文档
在代码库中记录:
- 流水线阶段及其用途
- 所需的环境变量
- 部署流程
- 故障排除指南
- 回滚流程
操作手册
为以下情形编写操作手册:
- 部署失败
- 回滚流程
- 环境设置
- 事件响应
持续改进
跟踪指标
- 构建成功率
- 平均构建时间
- 测试覆盖率趋势
- 部署频率
- 事件发生频率
定期审查
- 每周审查流水线性能
- 每月进行安全评估
- 每季度改进流程
- 每年评估工具
评论
支持 Markdown