其他
搭建或优化跨平台 CI/CD 自动化流水线时,用分阶段构建…
适用于设计或改进 CI/CD 自动化流水线、部署策略、测试策略和 DevOps 工作流时。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
搭建或优化跨平台 CI/CD 自动化流水通用
解决思路
- 自动化所有可自动化的环节。
- 快速失败并建立快速反馈回路。
- 一次构建、多次部署。
- 实施基础设施即代码。
- 实践持续改进。
- 在每个阶段维护安全。
- 按 Build -> Test -> Security -> Deploy (Staging) -> Deploy (Production) 设计流水线阶段。
- Build 阶段执行 npm ci --prefer-offline 和 npm run build。
- Build 阶段用 artifacts.paths 保存 dist/,并设置 expire_in: 1 day。
- Build 阶段用 cache.key 为 ${CI_COMMIT_REF_SLUG},cache.paths 为 node_modules/。
- Build 阶段使用依赖缓存加速构建。
- Build 阶段为下游阶段生成构建产物。
- Build 阶段固定依赖版本以保证可复现。
- Build 阶段使用多阶段 Docker 构建缩小镜像。
- Test 阶段使用 parallel.matrix 按 TEST_TYPE: [unit, integration, e2e] 并行,script 执行 npm run test:${TEST_TYPE}。
- Test 阶段配置 coverage 正则匹配 '/Coverage: \d+\.\d+%/'。
- Test 阶段用 artifacts.reports.junit 保存 test-results.xml,并用 coverage_report 的 cobertura 格式和 coverage/cobertura-coverage.xml。
- 单元测试保持快速、隔离,并在每次提交运行。
- 集成测试验证组件之间的交互。
- 端到端测试验证用户工作流。
- 性能测试检查性能回归。
- Security 阶段使用 parallel.matrix 按 SCAN_TYPE: [sast, dependency, secrets] 并行,script 执行 ./security-scan.sh ${SCAN_TYPE}。
- Security 阶段设置 allow_failure: false。
- 安全扫描包括 SAST 静态应用安全测试。
- 安全扫描包括 DAST 动态应用安全测试。
- 安全扫描包括依赖扫描以检查有漏洞的包。
- 安全扫描包括秘密检测以查找泄露凭证。
- 安全扫描包括容器扫描以分析 Docker 镜像。
- Deploy staging 阶段配置 environment.name 为 staging,environment.url 为 https://staging.example.com,script 执行 ./deploy.sh staging,rules 在 $CI_COMMIT_BRANCH == "develop" 时触发。
- Deploy production 阶段配置 environment.name 为 production,environment.url 为 https://example.com,script 执行 ./deploy.sh production,rules 在 $CI_COMMIT_BRANCH == "main" 时手动触发 when: manual。
- Blue-Green 部署维护两个相同环境,依次执行 ./deploy-to-inactive.sh、./run-smoke-tests.sh、./switch-traffic.sh、./cleanup-old-environment.sh。
- Blue-Green 部署提供零停机、通过切回流量即可回滚、以及在生产类环境完整测试。
- Canary 部署依次执行 ./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。
- Canary 部署先发布到 5% 流量,监控错误率和延迟,指标健康则逐步增加比例,最后全量发布或根据数据回滚。
- Rolling 部署执行 kubectl rollout restart deployment/app,然后用 kubectl rollout status deployment/app --timeout=5m 检查状态。
- Rolling 部署配置 maxUnavailable 和 maxSurge。
- Rolling 部署由健康检查决定发布节奏,失败时自动回滚。
- Feature flags 通过 featureFlags.isEnabled('new-checkout') 决定返回 <NewCheckout /> 或 <LegacyCheckout />。
- Feature flags 支持把未启用功能部署到生产、逐步放量、A/B 测试、以及无需部署即可快速关闭功能。
- 环境层次按 Development -> Testing -> Staging -> Production 管理。
- 每个环境尽可能镜像生产,隔离数据和秘密,并使用基础设施即代码。
- 环境变量使用全局 variables 如 APP_NAME: my-app,以及环境特定变量如 .staging 的 ENV: staging 和 API_URL: https://api.staging.example.com,.production 的 ENV: production 和 API_URL: https://api.example.com。
- 绝不硬编码秘密。
- 使用秘密管理工具(如 Vault、AWS Secrets Manager)。
- 将配置与代码分离。
- 记录所有必需变量。
- 基础设施即代码使用 Terraform 等定义 aws_ecs_service,包含 name、cluster、task_definition,并将 desired_count 按 var.environment == "production" ? 3 : 1 设置。
- Terraform 的 deployment_configuration 设置 maximum_percent: 200 和 minimum_healthy_percent: 100。
- 测试遵循测试金字塔:E2E 测试少、集成测试一些、单元测试多。
- 测试并行化设置 parallel: 4,并执行 npm test -- --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL。
- 测试数据管理使用 fixtures 保持一致,测试之间重置数据库状态,使用 factories 生成动态测试数据,避免在生产数据上测试。
- 处理 flaky 测试配置 retry.max: 2,when 为 runner_system_failure、stuck_or_timeout_failure。
- flaky 测试策略包括隔离、对已知问题加 retry、调查并修复根因、跟踪 flaky 测试指标。
- 监控流水线指标:Lead time(提交到生产时长)、Deployment frequency(部署频率)、Change failure rate(部署失败百分比)、Mean time to recovery(修复失败时间)。
- 部署后健康检查执行 ./deploy.sh、./wait-for-healthy.sh --timeout=300、./run-smoke-tests.sh。
- 实现 readiness probes、liveness probes、startup probes、部署后 smoke tests。
- 告警配置 notify:failure 在 when: on_failure 时执行 ./send-alert.sh --channel=deployments --status=failed;notify:success 在 when: on_success 时执行 ./send-notification.sh --channel=deployments --status=success。
- Secrets 管理使用 CI/CD secret variables,执行 echo "$DEPLOY_KEY" | base64 -d > deploy_key,chmod 600 deploy_key,部署后 after_script 执行 rm -f deploy_key。
- Secrets 最佳实践:定期轮换、使用短期凭证、审计秘密访问、绝不记录秘密。
- 流水线安全限制生产部署:deploy:production 仅在 $CI_COMMIT_BRANCH == "main" 时手动触发,allow_failure: false,environment.name 为 production,deployment_tier 为 production。
- 流水线安全控制包括分支保护规则、必需审批、审计日志、签名提交。
- 依赖安全执行 npm audit --audit-level=high 和 ./check-licenses.sh,并设置 allow_failure: false。
- 缓存配置 key.files 为 package-lock.json,paths 为 node_modules/,policy 为 pull-push。
- 缓存策略:在运行之间缓存依赖,使用基于内容的缓存键,按分支分离缓存,定期清理过期缓存。
- 并行化流水线 stages 为 build、test、deploy;拆分 test:unit 执行 npm run test:unit,test:integration 执行 npm run test:integration,test:e2e 执行 npm run test:e2e。
- 产物管理在 build 阶段设置 artifacts.paths 为 dist/,expire_in 为 1 week,when 为 on_success。
- 产物最佳实践:设置合适过期时间、只存必要产物、使用产物压缩、清理旧产物。
- 自动回滚在 deploy 脚本中执行 ./deploy.sh 和 ./health-check.sh || ./rollback.sh。
- 手动回滚配置 rollback 阶段为 deploy,when: manual,执行 ./get-previous-version.sh 和 ./deploy.sh --version=$PREVIOUS_VERSION。
- 数据库回滚使用可逆迁移,测试回滚流程,考虑数据兼容性,准备备份恢复流程。
- 流水线文档记录阶段和目的、必需环境变量、部署流程、故障排查指南、回滚流程。
- Runbooks 覆盖部署失败、回滚流程、环境搭建、事件响应。
- 持续改进跟踪构建成功率、平均构建时间、测试覆盖率趋势、部署频率、事件频率。
- 定期评审包括每周流水线性能评审、每月安全评估、每季度流程改进、每年工具评估。
适用边界 · 注意事项
- 项目尚无自动化构建、测试或部署需求,或只是一次性脚本/原型时,完整 CI/CD 流水线可能过重。
- 没有环境隔离、健康检查、监控和可靠回滚能力时,不要直接启用生产自动部署、蓝绿或金丝雀发布。
- 强监管或必须人工审批的场景不能完全依赖自动部署,需保留审批门禁和审计。