功能特性
即时回滚
了解如何借助 Virex 的部署历史,零停机地即时回滚到任意历史部署版本。
Virex 上的每次部署都是不可变的,并会被永久存储。这意味着您只需单击一次,即可即时回滚到应用程序的任意历史版本——无需重新构建,零停机时间。
回滚的工作原理
当您部署到 Virex 时:
- 您的应用程序会被构建并分配一个唯一的部署 ID
- 构建产物会被永久存储
- 部署被激活(流量被路由到该部署)
- 之前的部署保持可用,可随时即时回滚
回滚只是切换接收流量的部署。由于旧部署已经存在,因此不需要构建时间——即时完成。
当前: deployment-abc123 (v2.1.0)
↓ 回滚
激活: deployment-xyz789 (v2.0.0) ← 即时切换
通过控制台回滚
最简单的回滚方式是通过 Virex 控制台:
- 进入您的项目
- 点击侧边栏中的 Deployments
- 找到您想要恢复的部署
- 点击 ⋮ 菜单并选择 Promote to Production
- 确认回滚
回滚立即生效——通常在 1 秒内完成。
通过 CLI 回滚
使用 Virex CLI 进行回滚:
# 回滚到上一个部署
virex rollback
# 回滚到指定的部署
virex rollback deployment-xyz789
# 按提交 SHA 回滚到某个部署
virex rollback --commit abc1234
# 按标签回滚到某个部署
virex rollback --tag v2.0.0
查看部署列表
查看您的部署历史:
virex deployments list
ID STATUS CREATED COMMIT BRANCH
deployment-abc Active 2 hours ago def456 main
deployment-xyz Ready 1 day ago abc123 main
deployment-123 Ready 3 days ago 789xyz main
deployment-456 Ready 1 week ago 456def main
通过 API 回滚
使用 Virex API 自动化回滚:
curl -X POST https://api.virex.example.com/v1/deployments/deployment-xyz789/promote \
-H "Authorization: Bearer $VIREX_TOKEN" \
-H "Content-Type: application/json"
响应:
{
"id": "deployment-xyz789",
"status": "active",
"promotedAt": "2024-01-15T10:30:00Z",
"previousDeployment": "deployment-abc123"
}
自动回滚
基于健康检查配置自动回滚:
// virex.config.js
export default {
rollback: {
automatic: true,
triggers: {
// 错误率超过 5% 时回滚
errorRate: 0.05,
// p95 延迟超过 2 秒时回滚
latencyP95: 2000,
// 健康检查连续失败 3 次时回滚
healthCheckFailures: 3,
},
// 自动回滚前等待 5 分钟,避免频繁抖动
cooldown: '5m',
},
};
健康检查
定义健康检查端点:
export default {
healthCheck: {
path: '/api/health',
interval: '30s',
timeout: '5s',
expectedStatus: 200,
},
};
当某个部署未通过健康检查时,Virex 会自动回滚到最近一次健康的部署。
部署保留策略
默认情况下,Virex 会无限期保留所有部署。您可以配置保留策略:
export default {
deployments: {
retention: {
// 永久保留所有生产环境部署
production: 'forever',
// 预览部署保留 30 天
preview: '30d',
// 至少保留最近 50 个部署
minimum: 50,
},
},
};
回滚通知
在发生回滚时接收通知:
export default {
notifications: {
rollback: {
slack: '#deployments',
email: ['ops@yourcompany.com'],
webhook: 'https://your-webhook.com/rollback',
},
},
};
通知负载:
{
"event": "rollback",
"project": "your-project",
"from": {
"id": "deployment-abc123",
"commit": "def456",
"createdAt": "2024-01-15T10:00:00Z"
},
"to": {
"id": "deployment-xyz789",
"commit": "abc123",
"createdAt": "2024-01-14T10:00:00Z"
},
"reason": "manual", // 或 "automatic"
"triggeredBy": "user@example.com"
}
回滚策略
即时回滚(默认)
流量立即切换到之前的部署:
100% 流量 → 旧部署
适用于:需要立即解决的紧急问题。
渐进式回滚
缓慢地将流量切回之前的部署:
virex rollback deployment-xyz789 --gradual --duration 10m
流量切换过程:
0m: 100% 新版本 → 0% 旧版本
2m: 80% 新版本 → 20% 旧版本
5m: 50% 新版本 → 50% 旧版本
10m: 0% 新版本 → 100% 旧版本
适用于:验证回滚不会引入新问题。
数据库注意事项
回滚只影响应用程序代码,不会影响数据库。请考虑以下模式:
向后兼容的迁移
始终编写同时兼容新旧代码的迁移:
-- 好的做法:添加带默认值的列
ALTER TABLE users ADD COLUMN preferences JSONB DEFAULT '{}';
-- 坏的做法:重命名列(会破坏旧代码)
ALTER TABLE users RENAME COLUMN name TO full_name;
功能开关(Feature Flags)
使用功能开关将部署与功能发布解耦:
if (featureFlags.isEnabled('new-checkout')) {
return <NewCheckout />;
}
return <OldCheckout />;
这样您可以在不回滚部署的情况下回滚功能。
最佳实践
- 定期测试回滚 — 不要等到紧急情况才第一次尝试回滚
- 使用部署标签 — 为重要版本打标签以便识别
- 设置自动回滚 — 让 Virex 在用户之前发现问题
- 回滚后持续监控 — 验证回滚是否解决了问题
- 记录回滚流程 — 确保团队都知道如何回滚
故障排查
回滚未生效
检查部署是否处于 “Ready” 状态:
virex deployments get deployment-xyz789
找不到旧部署
检查您的保留策略。如果部署已被清理,您需要从该提交重新部署:
virex deploy --commit abc123
数据库不兼容
如果旧代码与当前数据库 schema 不兼容,您可能需要:
- 先回滚数据库迁移
- 然后回滚部署
请务必先在预发环境测试回滚场景。