如何在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: | # 你的发布命令
关键结论
- 可行:无论是利用CodeQL原生参数还是自定义解析结果,都能实现漏洞检测时终止后续发布的需求。
- 同一工作流内可访问扫描结果:通过下载SARIF artifact、调用GitHub API/CLI两种方式,均可在当前工作流运行中获取并分析扫描结果。
内容的提问来源于stack exchange,提问作者Toni Kanoni
相关产品推荐
相关产品推荐

