Ruby编写SonarQube JSON格式化脚本重复数据问题排查
问题解决:SonarQube JSON格式化脚本重复ruleId值的问题
问题本质
你碰到的是Ruby变量作用域导致的对象复用覆盖问题:如果在遍历JSON Lines的循环外部初始化了存储issue数据的哈希变量,每次循环只是修改这个哈希的属性,而非创建新的哈希对象,最终所有issue都会指向同一个哈希实例,自然会被最后一次循环的内容覆盖。而你的简单解析脚本没问题,是因为它每次循环仅读取输出,没有复用同一个可变对象。
修复方案
核心修复逻辑:在每次循环内部创建新的issue哈希对象,避免复用外部定义的同一个对象。
错误示例(导致重复的典型写法)
require 'json' # 错误:循环外初始化哈希,所有循环复用同一个对象 issue = {} sonar_report = { issues: [] } File.foreach('tes.json') do |line| data = JSON.parse(line) issue[:ruleId] = data['Raw'] # 其他字段赋值逻辑... sonar_report[:issues] << issue end puts JSON.pretty_generate(sonar_report)
修正后的代码
require 'json' sonar_report = { issues: [] } File.foreach('tes.json') do |line| # 关键:每次循环都创建新的哈希对象 issue = {} data = JSON.parse(line) # 填充SonarQube标准字段 issue[:ruleId] = data['Raw'] issue[:message] = "检测到敏感数据:#{data['Raw']}" issue[:severity] = 'CRITICAL' issue[:type] = 'VULNERABILITY' # 安全读取嵌套字段,避免缺失字段报错 issue[:component] = data.dig('SourceMetadata', 'Data', 'Path') issue[:line] = data.dig('SourceMetadata', 'Data', 'LineNumber') sonar_report[:issues] << issue end # 生成SonarQube兼容的报告文件 File.write('sonar-report.json', JSON.pretty_generate(sonar_report))
验证注意事项
- 测试时可以在循环内临时打印
issue内容,确认每一行的ruleId都对应当前行的Raw值 - 使用
dig方法访问嵌套JSON字段,避免因部分Trufflehog输出缺失字段导致脚本崩溃
内容的提问来源于stack exchange,提问作者nyoba hack
相关产品推荐
相关产品推荐

