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

如何在GitHub Action中遇CodeQL漏洞时终止Artifactory发布流程?

实现CodeQL扫描漏洞时终止GitHub Action后续发布流程

完全可行,且可以在同一工作流运行内访问CodeQL的扫描结果,具体实现方式分两种场景:

一、快速实现:利用CodeQL原生参数终止流程

如果只需要在检测到指定严重级别的漏洞时直接终止后续步骤,无需自定义判断逻辑,可直接在github/codeql-action/analyze@v2步骤中配置fail-on-severity参数:

- uses: github/codeql-action/analyze@v2
  with:
    # 当检测到critical或high级别的漏洞时,该步骤直接失败
    fail-on-severity: critical,high

GitHub Action的默认行为是:某一步骤失败后,后续未配置continue-on-error: true的步骤会自动终止。因此只要该analyze步骤因漏洞失败,后续的Artifactory发布步骤就不会执行;只有当扫描无符合条件的漏洞时,analyze步骤成功,发布步骤才会继续。

二、自定义判断:访问扫描结果并控制流程

如果需要更精细的漏洞判断逻辑(比如统计特定类型漏洞数量、忽略某些规则的警报等),可以在同一工作流内直接访问扫描结果,具体方式有两种:

1. 解析CodeQL生成的SARIF文件

CodeQL analyze步骤会自动将扫描结果以SARIF格式上传为工作流的artifact,你可以下载并解析该文件:

# 先执行CodeQL扫描
- uses: github/codeql-action/analyze@v2
  with:
    upload-sarif: true # 默认开启,会上传SARIF结果到artifact

# 下载SARIF结果文件
- name: Download CodeQL SARIF results
  uses: actions/download-artifact@v4
  with:
    name: codeql-sarif-results # CodeQL默认的artifact名称
    path: ./sarif-results

# 解析SARIF,判断是否存在需要阻断发布的漏洞
- name: Check vulnerabilities in SARIF
  id: check_vulns
  run: |
    # 使用jq解析SARIF,统计critical/high级别的漏洞数量
    VULN_COUNT=$(jq '[.runs[].results[] | select(.properties.severity == "critical" or .properties.severity == "high")] | length' ./sarif-results/*.sarif)
    
    echo "vulnerability_count=$VULN_COUNT" >> $GITHUB_OUTPUT
    
    # 若漏洞数量大于0,终止流程
    if [ "$VULN_COUNT" -gt 0 ]; then
      echo "Detected $VULN_COUNT critical/high vulnerabilities, aborting release"
      exit 1
    fi

# 仅当漏洞检查步骤成功时,执行发布
- name: Publish to Artifactory
  if: steps.check_vulns.outcome == 'success'
  run: |
    # 你的发布命令

2. 通过GitHub API查询扫描警报

利用GitHub CLI或REST API,在工作流内查询本次提交对应的CodeQL开放警报:

- name: Check CodeQL alerts via GitHub API
  id: check_alerts
  env:
    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: |
    # 查询当前仓库、当前提交下的CodeQL开放警报
    ALERTS=$(gh api repos/${{ github.repository }}/code-scanning/alerts --filter "state=open&tool_name=CodeQL&head_sha=${{ github.sha }}")
    
    # 统计critical/high级别的警报数量
    CRITICAL_HIGH_COUNT=$(echo "$ALERTS" | jq '[.[] | select(.rule.severity == "critical" or .rule.severity == "high")] | length')
    
    echo "critical_high_count=$CRITICAL_HIGH_COUNT" >> $GITHUB_OUTPUT
    
    if [ "$CRITICAL_HIGH_COUNT" -gt 0 ]; then
      echo "Found $CRITICAL_HIGH_COUNT critical/high vulnerabilities, stopping release"
      exit 1
    fi

# 发布步骤仅在警报检查通过时执行
- name: Publish to Artifactory
  if: steps.check_alerts.outcome == 'success'
  run: |
    # 你的发布命令

关键结论

  1. 可行:无论是利用CodeQL原生参数还是自定义解析结果,都能实现漏洞检测时终止后续发布的需求。
  2. 同一工作流内可访问扫描结果:通过下载SARIF artifact、调用GitHub API/CLI两种方式,均可在当前工作流运行中获取并分析扫描结果。

内容的提问来源于stack exchange,提问作者Toni Kanoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:13:13