You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:22:37