Skip to main content

功能特性

即时回滚

了解如何借助 Virex 的部署历史,零停机地即时回滚到任意历史部署版本。

Virex 上的每次部署都是不可变的,并会被永久存储。这意味着您只需单击一次,即可即时回滚到应用程序的任意历史版本——无需重新构建,零停机时间。

回滚的工作原理

当您部署到 Virex 时:

  1. 您的应用程序会被构建并分配一个唯一的部署 ID
  2. 构建产物会被永久存储
  3. 部署被激活(流量被路由到该部署)
  4. 之前的部署保持可用,可随时即时回滚

回滚只是切换接收流量的部署。由于旧部署已经存在,因此不需要构建时间——即时完成。

当前: deployment-abc123 (v2.1.0)
    ↓ 回滚
激活:  deployment-xyz789 (v2.0.0)  ← 即时切换

通过控制台回滚

最简单的回滚方式是通过 Virex 控制台:

  1. 进入您的项目
  2. 点击侧边栏中的 Deployments
  3. 找到您想要恢复的部署
  4. 点击 ⋮ 菜单并选择 Promote to Production
  5. 确认回滚

回滚立即生效——通常在 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 />;

这样您可以在不回滚部署的情况下回滚功能。

最佳实践

  1. 定期测试回滚 — 不要等到紧急情况才第一次尝试回滚
  2. 使用部署标签 — 为重要版本打标签以便识别
  3. 设置自动回滚 — 让 Virex 在用户之前发现问题
  4. 回滚后持续监控 — 验证回滚是否解决了问题
  5. 记录回滚流程 — 确保团队都知道如何回滚

故障排查

回滚未生效

检查部署是否处于 “Ready” 状态:

virex deployments get deployment-xyz789

找不到旧部署

检查您的保留策略。如果部署已被清理,您需要从该提交重新部署:

virex deploy --commit abc123

数据库不兼容

如果旧代码与当前数据库 schema 不兼容,您可能需要:

  1. 先回滚数据库迁移
  2. 然后回滚部署

请务必先在预发环境测试回滚场景。