如何在GitHub Actions单工作流中运行多组CodeQL查询套件并合并结果?
解决方案:在GitHub Actions中运行多个CodeQL查询包/套件并合并结果
核心方法:利用CodeQL配置文件的queries字段指定多个套件和包
GitHub CodeQL Action支持在配置文件中通过queries数组同时指定多个查询包、内置套件或自定义套件,实现和CLI一致的多查询合并效果,无需拆分多个analyze步骤,也不用手动合并SARIF文件。
具体配置修改
以Java项目为例,修改.github/codeql-config-java.yml如下:
name: "CodeQL configuration for Java" # 同时指定多个查询包和套件 queries: # 官方默认安全查询包 - uses: codeql/java-queries@latest # 官方security-extended套件 - uses: codeql/java-queries/codeql-suites/java-security-extended.qls@latest # GitHub Security Lab的自定义查询包 - uses: githubsecuritylab/codeql-java-queries@latest # GitHub Security Lab的audit套件 - uses: githubsecuritylab/codeql-java-queries/codeql-suites/java-audit.qls@latest paths: - src
工作流文件调整
确保init步骤仅指定配置文件即可(配置文件已包含所有查询定义):
- name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.lang }} build-mode: ${{ matrix.build-mode }} config-file: "./.github/codeql-config-${{ matrix.lang }}.yml"
analyze步骤保持原样,会自动运行配置文件中所有指定的查询,并输出合并后的单个SARIF文件:
- name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 with: category: ${{ matrix.category }} output: ${{ matrix.outputFile }}
关键说明
queries字段的使用规则:- 使用
uses:语法可以引用官方查询包、内置套件(如security-extended)或第三方查询包的特定套件 - 每个
uses:项对应CLI命令中的一个查询参数,Action会自动合并所有查询结果到单个SARIF文件
- 使用
- 之前尝试失败的原因:
直接在packs中指定套件后缀(如:security-extended)不符合Action配置文件的语法规范,必须通过queries字段的uses:来引用完整的套件路径 - 灵活替代方案:
如果需要更动态的查询组合,也可以在Action中手动调用CodeQL CLI执行分析(完全复刻本地命令逻辑),再上传SARIF结果。示例步骤:- name: Setup CodeQL CLI uses: github/codeql-action/setup@v4 - name: Run CodeQL CLI analysis run: | codeql database analyze "./codeql-databases/java" \ codeql/java-queries \ codeql/java-queries:codeql-suites/java-security-extended.qls \ githubsecuritylab/codeql-java-queries \ githubsecuritylab/codeql-java-queries:codeql-suites/java-audit.qls \ --download \ --format=sarif-latest \ --output=java-combined.sarif - name: Upload SARIF results uses: github/codeql-action/upload-sarif@v4 with: sarif_file: java-combined.sarif
内容的提问来源于stack exchange,提问作者David Ng
相关产品推荐
相关产品推荐

