GitLab CI如何在后续阶段获取两个SAST扫描器的报告?
嘿,这个问题我之前帮人解决过几次!核心是要搞清楚GitLab SAST模板的默认artifacts行为,以及如何正确传递多份报告到后续阶段。咱们一步步来搞定:
1. 先搞懂SAST模板的默认坑点
默认情况下,Security/SAST.gitlab-ci.yml里的每个SAST作业(比如bandit-sast、eslint-sast)都会生成名为gl-sast-report.json的报告。但因为这些是独立的作业,它们的artifacts如果都用同一个文件名,后续阶段只会拿到最后执行的那份(通常是eslint的,因为JS作业可能跑的更快)。而且如果你直接改文件名但没配置对artifacts,就会出现“文件找不到”的错误。
2. 给每个SAST作业配置独特的报告文件名
你需要分别自定义bandit-sast和eslint-sast作业,给它们指定不同的报告文件名,同时确保artifacts正确上传。比如:
# 自定义Python的bandit扫描作业,指定独特的报告文件名 bandit-sast: variables: SAST_REPORT_FILE: gl-sast-report-python.json artifacts: reports: sast: gl-sast-report-python.json paths: - gl-sast-report-python.json expire_in: 1 week # 可选,设置报告过期时间,避免占用存储 # 自定义JS的eslint扫描作业,同样指定独特文件名(也可以保留默认,但建议统一命名规则) eslint-sast: variables: SAST_REPORT_FILE: gl-sast-report-js.json artifacts: reports: sast: gl-sast-report-js.json paths: - gl-sast-report-js.json expire_in: 1 week
这里要注意:必须同时设置variables里的SAST_REPORT_FILE和artifacts里的paths、reports字段,不然作业可能找不到生成的文件,或者无法把artifacts传递到后续阶段。
3. 在send-reports阶段获取两份报告
接下来,你的send-reports阶段需要明确依赖这两个SAST作业,这样GitLab才会把它们的artifacts都传递过来。配置needs字段来关联这两个作业:
send-reports: stage: send-reports # 明确指定需要获取bandit和eslint作业的artifacts needs: - job: bandit-sast artifacts: true - job: eslint-sast artifacts: true script: # 先检查文件是否存在,避免后续上传出错 - if [ ! -f gl-sast-report-python.json ]; then echo "Python SAST报告丢失!"; exit 1; fi - if [ ! -f gl-sast-report-js.json ]; then echo "JS SAST报告丢失!"; exit 1; fi # 这里写你的上传逻辑,比如把两份报告都上传到目标服务 - echo "开始上传两份SAST报告..." # 示例:curl -X POST -F "python_report=@gl-sast-report-python.json" -F "js_report=@gl-sast-report-js.json" https://your-report-service.com/upload only: refs: - main # 只在主分支执行,根据你的需求调整
4. 完整的.gitlab-ci.yml示例
把所有配置整合起来,确保stage顺序正确(SAST模板默认的stage是sast,所以要把它加到你的stage列表里):
stages: - test - sast # 必须添加这个stage,因为SAST模板的作业默认跑在sast阶段 - upload - send-reports # 引入官方SAST模板 include: - template: Security/SAST.gitlab-ci.yml # 自定义bandit作业 bandit-sast: variables: SAST_REPORT_FILE: gl-sast-report-python.json artifacts: reports: sast: gl-sast-report-python.json paths: - gl-sast-report-python.json expire_in: 1 week # 自定义eslint作业 eslint-sast: variables: SAST_REPORT_FILE: gl-sast-report-js.json artifacts: reports: sast: gl-sast-report-js.json paths: - gl-sast-report-js.json expire_in: 1 week # 报告上传阶段 send-reports: stage: send-reports needs: - job: bandit-sast artifacts: true - job: eslint-sast artifacts: true script: - ls -la # 可以先列出所有文件,确认两份报告都存在 - # 执行你的上传逻辑 only: - main
常见排查点
如果还是遇到文件找不到的问题,检查这几点:
- 查看
bandit-sast和eslint-sast作业的执行日志,确认报告文件是否成功生成(搜索SAST_REPORT_FILE关键词) - 检查作业的artifacts页面,确认报告文件是否被正确上传
- 确认
send-reports的needs配置是否正确,有没有拼写错作业名称 - 确认报告文件名在所有配置里都一致,没有拼写错误
内容的提问来源于stack exchange,提问作者jchan
相关产品推荐
相关产品推荐

