名称: 部署检查器 描述: 部署前验证清单和自动化就绪评估。
部署检查器技能
部署前验证清单和自动化就绪评估。
指令
您是一个部署就绪专家。当调用时:
-
部署前验证:
- 代码质量检查通过
- 所有测试通过
- 构建成功
- 依赖项更新且安全
- 环境变量配置
- 数据库迁移就绪
-
安全检查:
- 代码中无秘密
- 安全头配置
- 身份验证/授权测试
- 输入验证实施
- HTTPS启用
- 速率限制配置
-
性能验证:
- 负载测试完成
- 资源限制配置
- 缓存策略实施
- 数据库索引优化
- CDN配置(如适用)
-
基础设施检查:
- 健康检查配置
- 监控和告警设置
- 日志配置
- 备份策略就位
- 回滚计划文档化
- DNS和SSL配置
-
生成检查清单:创建部署就绪报告,包含是否部署决策
部署检查清单
部署前(发布前)
代码质量
- [ ] 所有测试通过(单元、集成、端到端)
- [ ] 代码审查完成并批准
- [ ] 代码检查通过(无警告)
- [ ] 代码覆盖率满足阈值(>80%)
- [ ] 无已知严重bug
- [ ] 破坏性变更文档化
- [ ] API合约验证
构建与依赖项
- [ ] CI/CD中构建成功
- [ ] 依赖项更新
- [ ] 安全漏洞解决
- [ ] 包大小在可接受范围内
- [ ] 源映射生成(如适用)
- [ ] Docker镜像构建并推送
数据库
- [ ] 迁移在测试环境测试
- [ ] 迁移回滚计划就绪
- [ ] 迁移前备份创建
- [ ] 数据库索引优化
- [ ] 数据验证脚本运行
- [ ] 连接池配置
环境配置
- [ ] 环境变量文档化
- [ ] 秘密安全存储(不在代码中)
- [ ] 功能标志配置
- [ ] CORS设置验证
- [ ] API密钥轮换(如需要)
- [ ] 第三方服务配置
安全
- [ ] 身份验证测试
- [ ] 授权规则验证
- [ ] 输入验证实施
- [ ] SQL注入预防验证
- [ ] XSS预防实施
- [ ] CSRF令牌配置
- [ ] 安全头设置
- [ ] 速率限制启用
- [ ] HTTPS强制
- [ ] 秘密管理器配置
性能
- [ ] 负载测试完成
- [ ] 性能基准满足
- [ ] 数据库查询优化完成
- [ ] 缓存策略实施
- [ ] CDN配置(如适用)
- [ ] 资源限制设置
- [ ] 自动扩缩配置
部署期间(发布时)
基础设施
- [ ] 健康检查端点工作
- [ ] 监控仪表板就绪
- [ ] 告警配置
- [ ] 日志集中化
- [ ] 错误跟踪启用(Sentry等)
- [ ] 备份策略验证
- [ ] SSL证书有效
- [ ] DNS记录更新
- [ ] 负载均衡器配置
部署策略
- [ ] 部署方法选择(蓝绿、金丝雀、滚动)
- [ ] 回滚计划文档化
- [ ] 数据库迁移策略定义
- [ ] 停机时间窗口沟通(如有)
- [ ] 部署操作手册准备
- [ ] 测试环境部署成功
沟通
- [ ] 利益相关者通知
- [ ] 变更日志准备
- [ ] 文档更新
- [ ] 支持团队简报
- [ ] 维护窗口安排(如需要)
- [ ] 状态页面更新
部署后(发布后)
验证
- [ ] 冒烟测试通过
- [ ] 健康检查通过
- [ ] 错误率正常
- [ ] 响应时间可接受
- [ ] 数据库迁移完成
- [ ] 功能标志验证
监控
- [ ] 应用日志审查
- [ ] 错误跟踪检查
- [ ] 性能指标审查
- [ ] 用户反馈监控
- [ ] 资源使用正常
- [ ] 告警配置和测试
文档
- [ ] 发布说明发布
- [ ] API文档更新
- [ ] 已知问题文档化
- [ ] 回滚程序测试
- [ ] 事件响应计划就绪
使用示例
@部署检查器
@部署检查器 --环境 生产
@部署检查器 --检查清单
@部署检查器 --自动化
@部署检查器 --报告
自动化检查脚本
Node.js 示例
// deployment-check.js
const chalk = require('chalk');
class DeploymentChecker {
constructor() {
this.checks = [];
this.passed = 0;
this.failed = 0;
}
async runChecks() {
console.log(chalk.bold('
🚀 部署就绪检查
'));
await this.checkTests();
await this.checkBuild();
await this.checkDependencies();
await this.checkEnvironment();
await this.checkSecurity();
await this.checkDatabase();
this.printSummary();
return this.failed === 0;
}
async checkTests() {
console.log(chalk.blue('📋 运行测试...'));
try {
await this.exec('npm test');
this.pass('所有测试通过');
} catch (error) {
this.fail('测试失败', error.message);
}
}
async checkBuild() {
console.log(chalk.blue('
🔨 构建应用...'));
try {
await this.exec('npm run build');
this.pass('构建成功');
} catch (error) {
this.fail('构建失败', error.message);
}
}
async checkDependencies() {
console.log(chalk.blue('
📦 检查依赖项...'));
try {
const result = await this.exec('npm audit --audit-level=high');
if (result.includes('0 vulnerabilities')) {
this.pass('无高/严重漏洞');
} else {
this.fail('发现安全漏洞');
}
} catch (error) {
this.fail('依赖项检查失败', error.message);
}
}
async checkEnvironment() {
console.log(chalk.blue('
🌍 检查环境...'));
const required = [
'DATABASE_URL',
'JWT_SECRET',
'API_KEY',
'REDIS_URL'
];
for (const envVar of required) {
if (process.env[envVar]) {
this.pass(`${envVar} 已设置`);
} else {
this.fail(`${envVar} 缺失`);
}
}
}
async checkSecurity() {
console.log(chalk.blue('
🔒 安全检查...'));
// 检查代码中的秘密
try {
const result = await this.exec('git secrets --scan');
this.pass('代码中未发现秘密');
} catch (error) {
this.fail('检测到代码中的秘密');
}
// 检查HTTPS
if (process.env.FORCE_HTTPS === 'true') {
this.pass('HTTPS强制启用');
} else {
this.fail('HTTPS未强制启用');
}
}
async checkDatabase() {
console.log(chalk.blue('
💾 数据库检查...'));
// 检查迁移是否最新
try {
await this.exec('npm run db:check-migrations');
this.pass('数据库迁移就绪');
} catch (error) {
this.fail('数据库迁移问题');
}
}
pass(message) {
console.log(chalk.green(` ✓ ${message}`));
this.passed++;
}
fail(message, details = '') {
console.log(chalk.red(` ✗ ${message}`));
if (details) {
console.log(chalk.gray(` ${details}`));
}
this.failed++;
}
printSummary() {
console.log(chalk.bold('
📊 摘要
'));
console.log(chalk.green(` 通过: ${this.passed}`));
console.log(chalk.red(` 失败: ${this.failed}`));
if (this.failed === 0) {
console.log(chalk.green.bold('
✅ 就绪部署
'));
} else {
console.log(chalk.red.bold('
❌ 未就绪部署
'));
process.exit(1);
}
}
async exec(command) {
const { execSync } = require('child_process');
return execSync(command, { encoding: 'utf8' });
}
}
// 运行检查
const checker = new DeploymentChecker();
checker.runChecks();
部署报告模板
# 部署就绪报告
**环境**: 生产
**日期**: 2024-01-15
**版本**: v2.3.0
**发布经理**: @username
---
## 总体状态
🟢 **就绪部署**
**分数**: 95/100
- ✅ 关键检查: 10/10
- ✅ 高优先级: 18/20
- ⚠️ 中等优先级: 28/30
- ✅ 低优先级: 39/40
---
## 关键检查 (10/10) ✅
- ✅ 所有测试通过 (1,234 测试, 0 失败)
- ✅ 构建成功
- ✅ 无严重漏洞
- ✅ 数据库迁移测试
- ✅ 环境变量配置
- ✅ HTTPS启用
- ✅ 健康检查工作
- ✅ 回滚计划文档化
- ✅ 监控配置
- ✅ 测试环境部署成功
---
## 高优先级 (18/20) ✅
- ✅ 代码审查批准
- ✅ 安全扫描通过
- ✅ 性能基准满足
- ✅ 负载测试完成
- ✅ 错误跟踪启用
- ✅ 速率限制配置
- ✅ 备份策略验证
- ✅ SSL证书有效
- ⚠️ API文档需要更新 (2 端点)
- ⚠️ 缓存预热脚本未测试
---
## 中等优先级 (28/30) ⚠️
- ✅ 代码检查通过
- ✅ 代码覆盖率: 87% (目标: 80%)
- ✅ 包大小: 245KB (在限制内)
- ⚠️ 搜索端点轻微性能问题
- ⚠️ 1 个TODO注释在关键路径
---
## 测试结果
**单元测试**: ✅ 856 通过, 0 失败
**集成测试**: ✅ 234 通过, 0 失败
**端到端测试**: ✅ 144 通过, 0 失败
**总计**: 1,234 测试在 2m 34s
**覆盖率**:
- 语句: 87.4%
- 分支: 82.1%
- 函数: 89.3%
- 行: 86.8%
---
## 安全扫描结果
**依赖项**: ✅ 无严重/高漏洞
**秘密扫描**: ✅ 未检测到秘密
**HTTPS**: ✅ 强制启用
**安全头**: ✅ 配置
- X-Frame-Options: DENY
- X-Content-Type-Options: nosniff
- Strict-Transport-Security: max-age=31536000
**身份验证**: ✅ 测试
**速率限制**: ✅ 100 请求/15分钟 每IP
---
## 性能指标
**负载测试结果** (10,000 并发用户):
- 平均响应时间: 234ms ✅ (目标: <500ms)
- P95 响应时间: 456ms ✅ (目标: <1s)
- P99 响应时间: 789ms ✅ (目标: <2s)
- 错误率: 0.02% ✅ (目标: <0.1%)
- 吞吐量: 12,345 请求/秒 ✅
**数据库**:
- 查询响应时间: <50ms ✅
- 连接池: 配置 (最小: 5, 最大: 50) ✅
- 索引: 优化 ✅
---
## 基础设施状态
**健康检查**: ✅ 全部通过
- /health: 200 OK (5ms)
- /ready: 200 OK (8ms)
- 数据库: 连接
- Redis: 连接
- 外部API: 可达
**监控**: ✅ 配置
- 应用指标: Datadog
- 错误跟踪: Sentry
- 日志: CloudWatch
- 运行时间监控: Pingdom
**告警配置**:
- 错误率 > 1%
- 响应时间 P95 > 1s
- CPU > 80%
- 内存 > 85%
- 数据库连接 > 45
---
## 数据库迁移
**状态**: ✅ 就绪
要应用的迁移:
1. `20240115_add_user_preferences` - 测试 ✅
2. `20240115_create_notifications_table` - 测试 ✅
**回滚计划**: ✅ 文档化
**备份**: ✅ 创建 (15GB, 2024-01-15 10:00 UTC)
---
## 部署计划
**策略**: 蓝绿部署
**估计时长**: 15 分钟
**停机时间**: 无
**回滚时间**: 2 分钟
**步骤**:
1. 部署到绿色环境
2. 运行冒烟测试
3. 切换10%流量到绿色
4. 监控10分钟
5. 切换50%流量到绿色
6. 监控10分钟
7. 切换100%流量到绿色
8. 保持蓝色环境24小时(快速回滚)
---
## 部署前操作项
### 必须修复(阻碍)
- 无 ✅
### 应该修复(推荐)
- ⚠️ 更新新端点的API文档
- ⚠️ 测试缓存预热脚本
### 可选修复
- 考虑为边缘案例添加更多端到端测试
- 更新变更日志最新变更
---
## 风险评估
**总体风险**: 🟢 低
**识别风险**:
1. **数据库迁移** (低风险)
- 缓解: 测试环境测试, 回滚计划就绪
2. **流量峰值** (低风险)
- 缓解: 负载测试, 自动扩缩配置
3. **第三方API** (中等风险)
- 缓解: 断路器实施, 回退配置
---
## 回滚计划
**触发条件**:
- 错误率 > 5%
- 响应时间 P95 > 2s
- 关键功能损坏
**回滚步骤**:
1. 切换流量回蓝色环境 (30 秒)
2. 调查问题
3. 修复并重新部署
**数据回滚**:
- 数据库备份可用 (15 分钟恢复)
- 迁移回滚脚本测试
---
## 沟通计划
**通知发送**:
- ✅ 工程团队
- ✅ 产品团队
- ✅ 支持团队
- ✅ 利益相关者
**状态页面**: 更新
**变更日志**: 就绪发布
**文档**: 更新
---
## 签字确认
**技术负责人**: ✅ 批准 - @tech-lead
**QA**: ✅ 批准 - @qa-lead
**DevOps**: ✅ 批准 - @devops-lead
**产品**: ✅ 批准 - @product-manager
---
## 最终推荐
🟢 **批准部署**
所有关键检查通过。识别的小问题不阻碍部署。
建议按计划进行部署。
**计划部署**: 2024-01-15 14:00 UTC
**部署窗口**: 14:00 - 14:30 UTC
最佳实践
蓝绿部署
- 零停机
- 即时回滚
- 切换前完整测试
- 保持旧环境快速恢复
金丝雀部署
- 渐进式推出 (1% → 10% → 50% → 100%)
- 每个阶段监控指标
- 错误时自动回滚
- 低风险
滚动部署
- 逐个实例更新
- 无停机
- 自动健康检查
- 比蓝绿慢
数据库迁移
- 始终先在测试环境测试
- 创建回滚脚本
- 迁移前备份
- 可能时避免破坏性变更
- 使用功能标志进行模式变更
备注
- 除非关键,否则不在周五部署
- 始终有回滚计划
- 部署后第一小时密切监控
- 文档化一切
- 尽可能自动化
- 在类生产环境测试
- 使用功能标志进行渐进式推出
- 保持部署小而频繁
- 部署期间团队可用
- 庆祝成功部署!