SonarCloud CI无法识别Ruby/SimpleCov覆盖率报告源文件
问题原因及解决方案
问题根源
SimpleCov生成的coverage.json中记录的是文件的绝对路径,但SonarCloud扫描器会以项目根目录(即GitHub Actions中的/home/runner/work/my-app/my-app/)为基准,将报告中的路径当作相对路径去查找文件。这就导致扫描器会尝试访问类似/home/runner/work/my-app/my-app/home/runner/work/my-app/my-app/app/lib/some_file.rb的不存在路径,从而抛出警告。
解决方案
修改SimpleCov的配置,强制生成相对于项目根目录的路径到覆盖率报告中,有两种常用方式:
方式一:使用use_relative_paths!
直接调用SimpleCov的内置方法强制生成相对路径:
require 'simplecov' require "simplecov_json_formatter" # 强制生成相对路径 SimpleCov.use_relative_paths! SimpleCov.formatter = SimpleCov::Formatter::JSONFormatter SimpleCov.start('rails') do add_filter ['/channels/', '/jobs/', '/mailers/'] end
方式二:显式设置项目根目录
手动指定SimpleCov的根目录为项目根,确保路径解析正确:
require 'simplecov' require "simplecov_json_formatter" # 设置根目录为项目根(__dir__是rails_helper.rb所在的spec目录,向上跳一级就是项目根) SimpleCov.root(File.expand_path('../', __dir__)) SimpleCov.formatter = SimpleCov::Formatter::JSONFormatter SimpleCov.start('rails') do add_filter ['/channels/', '/jobs/', '/mailers/'] coverage_dir 'coverage' end
验证修改
重新运行测试后,查看coverage/coverage.json,文件路径应变为类似app/lib/some_file.rb的相对路径,而非完整绝对路径。此时SonarCloud扫描器就能正确匹配到项目中的文件,不会再抛出找不到文件的警告。
内容的提问来源于stack exchange,提问作者Chowlett
相关产品推荐
相关产品推荐

