近日,不少使用Firebase Hosting的开发者遭遇了一个令人困惑的Bug:当通过GitHub Action自动部署时,工作流日志报出“supplied version is the current active version”(提供的版本与当前活跃版本相同)错误,标记为失败。然而,令人哭笑不得的是——更改实际上已经成功部署到线上环境,用户访问到的页面/功能也已更新。这一“红脸”报错与“绿脸”结果之间的矛盾,在开发者社区引发热议。

事件背景:自动化部署的“假死”现象

Firebase Hosting是Google推出的静态托管服务,与GitHub Action集成的官方工作流(FirebaseExtended/action-hosting-deploy)被广泛用于CI/CD管道。开发者只需在仓库中配置工作流,推送代码后即可自动触发构建并部署到Firebase。

但近期,部分团队发现:当工作流执行到部署步骤时,终端输出Error: supplied version is the current active version,随后Action以非零状态码退出,导致GitHub将本次运行标记为“失败”。然而,登录Firebase控制台查看,却会发现新版本已上线,且真实运行正常。也就是说,部署流程实质成功,但GitHub Action的报告系统“撒谎”了。

技术解析:版本冲突背后的机制

为什么会出现这种矛盾?这需要了解Firebase Hosting的部署机制。每一次部署,Firebase都会为站点生成一个“版本”(version),通常基于提交哈希或时间戳。当使用firebase deploy命令时,系统会检查要部署的版本是否与当前线上活跃版本完全一致(包括文件内容、配置等)。若完全一致,则会抛出supplied version is the current active version错误,拒绝重复部署。

但在GitHub Action的实现中,该错误被视作致命异常,导致exit code非零。问题在于,Firebase对“重复版本”的处理逻辑本意是防止无意义的覆盖,但在自动化场景下,用户往往希望“即使内容未变化也要重新部署”(例如重新激活站点或修复缓存)。而Action未能区分“真的错误”与“版本已存在但部署已成功”两种情形,直接报错退出。

更深层的原因还涉及Action中的target_commitish参数与GitHub版本管理的配合。当多次推送同一次commit(例如re-run失败的workflow)时,新生成的部署请求可能因为内容无变化而被Firebase认为是“相同版本”,而Action又未对此做幂等处理,导致误报。

社区反馈:影响CI/CD信任度

该问题在GitHub Issue区(如#236#247)已积累超过30条反馈,包括多位维护大型开源项目的开发者。一位开发者指出:“我们的CI流水线会基于Action结果发送Slack通知,现在每天收到数十条‘部署失败’警告,但线上功能完全正常,团队已经对红色警报变得麻木。” 也有团队被迫在Action配置中添加continue-on-error: true来忽略部署步骤的失败,但这又可能掩盖真正的故障。

第三方分析显示,该Bug对涉及“重复部署”的场景影响最大,例如:使用GitHub的“Re-run”功能重新执行工作流、或通过Scheduled Workflow定时部署相同内容时。当开发者修改了静态资源但未改变版本标识(如忘记修改哈希前缀),也会触发此问题。

临时方案与官方动向

截至发稿,Firebase官方团队已确认该问题,但尚未发布修复版本。在GitHub Issue中,项目维护者建议用户采取以下临时方案:

  1. 强制指定新版本:在firebase.json或Action步骤中增加--message参数,动态生成唯一部署标记(如使用${{ github.run_id }}),避免版本重复。
  2. 忽略非零退出码:在Action的with字段中添加continue-on-error: true,但需配合后续步骤中的手动校验。
  3. 回退到CLI部署:暂时使用firebase deploy命令替代Action中的内置部署步骤,并自行处理错误输出。

同时,社区中已有开发者提交Pull Request,提议将supplied version is the current active version错误降级为警告而非致命错误,目前正在审核中。预计Firebase官方会在下一个大版本(v2.0+)中修复此逻辑。

给开发者的建议

对于正在使用Firebase Hosting + GitHub Action的团队,建议: - 检查流水线中是否有大量的“失败”运行记录,若确认是此Bug导致,可在团队内部明确“该错误为假阳性”,避免误判。 - 考虑在Action部署步骤后加入健康检查(curl线上URL并比对内容),确保真正的部署成功。 - 关注官方Issue #236的进展,一旦修复补丁发布,及时更新Action版本。

毕竟,在持续交付的世界里,一个“说谎”的CI检查,比一个真正的失败更危险——它会让人失去对红色警报的敬畏。