如何在 Vercel 上实现 CI/CD 流程?
Vercel CI/CD 的核心机制是什么?
Vercel 采用 Git-push-to-deploy 模型——推送代码即触发构建和部署,无需手动配置流水线。它支持 GitHub、GitLab、Bitbucket 三种 Git 提供商,部署触发条件包括:推送代码到分支、创建/合并 Pull Request、推送标签。
三种部署环境各有分工:Production 对应主域名,使用生产环境变量;Preview 为每个分支或 PR 生成唯一 URL,方便团队评审;Development 用于本地开发,通过 Vercel CLI 访问。
如何配置 Vercel 的自动部署?
在 Vercel Dashboard 中 Import Git Repository,授权后选择仓库并配置构建设置即可。vercel.json 中可自定义 buildCommand、outputDirectory、installCommand 等字段。
环境变量按环境隔离管理:在 Dashboard 的 Settings > Environment Variables 中添加,或用 vercel env add API_KEY production 通过 CLI 设置。代码中通过 process.env.API_KEY 访问。
关键点:环境变量区分 Production、Preview、Development 三种作用域,部署时自动注入对应环境的变量。
Vercel 如何实现零停机部署?
Vercel 的零停机部署依赖两个核心机制:
Skew Protection(倾斜保护):新版本部署上线后,旧版本的客户端请求仍能正确路由到对应的服务端资源,避免因客户端缓存导致的版本不匹配错误。
原子切换:Vercel 不是逐步替换实例,而是在新构建完成后一次性切换流量。旧部署保持可用直到所有活跃请求完成,确保没有请求被中断。
回滚也很快:vercel rollback 或在 Dashboard 中一键回退到任意历史部署。
Preview 部署在团队协作中有什么价值?
每个 PR 自动生成一个独立的预览 URL,评审者可以直接在浏览器中查看变更效果,无需本地拉取代码。这意味着:
- 设计师和产品经理可以参与评审,不依赖开发环境
- 多个 PR 的预览环境互相隔离,不会相互干扰
- 预览部署使用 Preview 环境变量,可以连接测试数据库等独立资源
在 vercel.json 中可以控制哪些分支触发部署:git.deploymentEnabled 字段可以禁用特定分支模式的自动部署。
如何在 Vercel CI 中集成测试?
单元测试:在 package.json 的 postinstall 脚本中运行测试,或通过 buildCommand 前置测试命令。但注意构建超时限制,Hobby 计划最长 10 分钟,Pro 计划最长 45 分钟。
E2E 测试:用 Playwright 等工具对 Preview URL 运行集成测试。关键步骤是拿到预览部署的 URL 后再执行测试,而非测试本地开发服务器。
外部 CI 集成:在 GitHub Actions 中用 vercel build 在本地构建,再用 vercel deploy --prebuilt 部署已构建产物。这种方式把测试、Lint 等步骤放在 Vercel 构建之外,避免构建超时。
Vercel 的构建缓存如何工作?
Vercel 自动缓存 node_modules 和构建产物。对于 Next.js 项目,增量静态再生(ISR)在构建时只重新生成变化的页面,而非全站重建。
在 Monorepo 场景下,Turborepo 的远程缓存可以跨团队成员和 CI 运行共享构建产物——未修改的包直接复用缓存,跳过重新构建。这能把 CI 时间从分钟级降到秒级。
配置方式:在 vercel.json 的 build.env 中设置缓存 key,或通过 Turborepo 的 turbo.json 配置缓存策略。
面试追问:持续交付和持续部署有什么区别?
持续交付(Continuous Delivery)要求所有变更通过自动化测试,但部署到生产环境需要手动审批。持续部署(Continuous Deployment)则完全移除手动环节,通过所有检查的代码直接上线。
在 Vercel 上,默认行为接近持续部署——合并到主分支自动部署到 Production。如果需要审批环节,可以用 Vercel 的 Deployment Protection 或在 Git 侧配置分支保护规则,要求 PR 审批后才能合并。
面试追问:如何处理部署失败?
首先通过 vercel logs deployment-url 查看部署日志定位原因。常见失败原因包括:依赖版本冲突、环境变量缺失、构建超时。
处理流程:立即回滚到上一个稳定部署,然后在 Preview 环境中修复问题,验证通过后再合并。Vercel 的部署历史完整保留,任意历史版本都可以一键回滚。