更新bundle版本后CircleCI出现Timing type error报错
故障根因
该故障是bundle更新后RSpec测试分片/加权执行相关依赖版本变动导致的,和单个spec文件本身无关——报错随文件删除顺移,是因为测试执行器按文件列表顺序扫描,第一个匹配失败的文件会被打印在报错里,删掉第一个就轮到下一个被命中。
核心报错逻辑对应:
- 开头的
Error autodetecting timing type是测试分片工具(CircleCI自带分片、knapsack、rspec-queue这类均会触发该逻辑)的提示:工具无法自动识别历史测试运行时长记录的格式,且传入的测试文件路径和记录内存储的路径格式不匹配(相对路径/绝对路径不一致),无法完成文件匹配。 - 日志中
Example file from timings: ""直接说明工具读取到的历史时长记录是空的,根本没有可用于匹配的有效数据。 - Devise相关的弃用警告只是版本兼容提示,不会触发进程退出,真正导致退出码1的是末尾的
No examples found.:因为路径匹配完全失败,RSpec没有加载到任何有效测试用例,直接异常退出。
修复方案
- 先检查CircleCI测试分片配置,确认bundle更新时是否升级了分片相关的gem包,新版本对路径匹配的校验更严格,需要保证传入RSpec的测试文件路径格式,和历史timing记录里存储的路径格式完全统一(要么全部用项目根目录起始的相对路径,要么全部用服务器绝对路径)。
- 检查CI工作区配置,确认历史测试时长记录的存储、读取路径配置正确,没有因为配置变动导致每次执行都读到空的timing文件。
- 可以临时关闭分片/加权执行逻辑,直接运行
bundle exec rspec做验证,如果命令能正常识别所有测试用例,即可确认问题完全出在分片工具的配置或版本兼容上。 - Devise的弃用警告不影响测试主流程,待主问题修复后,将项目中引用
Devise::Models::Authenticatable::BLACKLIST_FOR_SERIALIZATION的代码替换为Devise::Models::Authenticatable::UNSAFE_ATTRIBUTES_FOR_SERIALIZATION即可,一般是未升级的devise第三方扩展会触发该提示。
内容的提问来源于stack exchange,提问作者Gotey
相关产品推荐
相关产品推荐

