近日,大量Azure DevOps用户反馈,Azure Pipeline中的“测试重跑”(Test reruns)功能突然停止工作,导致持续集成/持续部署(CI/CD)流程中出现测试失败后无法自动重试的情况。该故障自北京时间2025年3月10日16时起陆续被报告,截至发稿时,微软尚未发布完全修复的官方公告,仅建议用户通过手动触发或修改流水线配置作为临时应对方案。

故障详情:测试重跑按钮“失灵”

根据多位开发者在社交媒体及微软开发者社区中的描述,当Azure Pipeline中的测试步骤失败后,原本应当出现的“重跑失败测试”(Rerun failed tests)按钮或相关自动化重试机制不再生效。用户点击按钮后,页面无响应或返回“操作失败”的通用错误提示。部分用户尝试通过YAML配置文件中的retry策略进行自动重试,同样遭遇任务停滞或忽略重试逻辑的情况。

受影响的范围涵盖使用Azure Pipelines进行持续测试的各类项目,包括基于.NET、Java、Python、Node.js等主流语言构建的流水线。测试类型涉及单元测试、集成测试以及UI自动化测试。由于测试重跑是保证代码质量的关键环节——尤其是在合并请求(PR)验证流程中——该故障导致大量开发团队的构建管道处于“部分失败”状态,无法顺利合并代码。

用户影响:开发效率骤降,紧急排查机制失效

“我们的CI/CD流水线中有超过200个测试用例,其中约15%是脆弱的集成测试,经常因环境抖动而失败。过去依赖重跑功能,失败后自动重试两次就能通过。现在每次失败都需要人工审查然后手动触发整个构建,效率下降了至少三倍。”一位来自某金融科技公司的DevOps工程师在接受采访时表示。

更严重的是,许多团队将测试重跑作为自动化门禁的一部分:如果测试在重跑后仍然失败,则标记为真正的问题。当前机制失效,导致开发人员无法区分“临时性失败”与“真实缺陷”,大量合并请求被阻塞,或者被迫绕过测试门禁直接合并,引入质量风险。

微软官方回应:正在调查,未给出修复时间表

微软Azure DevOps团队于3月11日凌晨在Azure状态页面上更新了事件报告,将问题定性为“服务功能异常”,受影响服务为“Azure Pipelines – Test Management”。声明中提到:“我们已注意到部分用户无法使用测试重跑功能,正在积极调查根本原因。初步怀疑与近期一次后端配置更新有关,但尚未确认。”

截至发稿,微软未提供具体的修复时间窗口,也没有给出受影响区域的完整列表。有用户从Azure支持渠道获得的回复是“建议暂时将流水线中的测试重跑逻辑改为手动步骤,或使用第三方工具如自定义脚本实现重试”。但对于大型企业而言,修改数百条流水线的YAML配置并非易事。

临时解决方案与替代思路

针对当前故障,技术社区已总结出几种临时应对方案:

  1. 手动触发重跑:在Pipeline运行历史中,选择失败的Stage,使用“重新运行整个Stage”而非“重跑失败测试”按钮。缺点是会重新执行所有测试,浪费时间和计算资源。

  2. 修改YAML重试策略:在测试任务中加入retryCountOnTaskFailure参数(注意该参数在部分场景下也可能受故障影响),或使用condition函数配合脚本实现自定义重试。

  3. 降级为本地重试:在测试运行器(如JUnit、pytest)本身配置重试机制,例如pytest的--reruns参数,避免依赖Pipeline层重试。

  4. 切换至其他CI/CD平台:部分团队已紧急将关键项目的流水线迁移至GitHub Actions或GitLab CI作为备份,但迁移成本较高。

深层思考:云服务可靠性再受质疑

这并非Azure Pipelines首次出现功能级故障。2024年曾发生过“并行作业配额错误”和“日志流中断”等事件。此次测试重跑功能失效,再次暴露了云原生CI/CD工具对单一服务依赖的风险。对于大型软件项目而言,测试重跑不是“便利功能”,而是维持交付节奏的必需组件。

有业内人士呼吁,企业应建立“功能依赖矩阵”,对云服务的非核心功能设定降级预案,例如在Azure Pipeline故障时自动切换到自托管Agent或本地运行测试的逻辑。同时,微软需要提升服务变更的灰度发布和回滚机制,避免类似配置更新导致大面积功能失效。

最新进展

截至3月12日上午,Azure状态页面仍未将问题状态从“调查中”变更为“修复中”。有用户报告,在北美部分区域(如East US)重跑功能已间歇性恢复,但全球其他区域仍不可用。微软表示将在24小时内发布更详细的技术说明。

对于依赖Azure Pipelines的团队而言,当前最明智的做法是立即评估受影响程度,实施上述临时方案,并为后续可能的长期故障做好准备。我们也将持续跟踪此事,第一时间报道修复进展。