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

Azure Pipeline集成OWASP ZAP与Handlebars无法生成报告问题排查

问题排查与解决步骤

一、优先解决「No Result Found to Publish」错误

这个错误说明test-results.xml要么没生成,要么路径不对,按以下步骤排查:

  1. 检查bash任务执行日志
    • 确认handlebars-cmd安装无报错,执行转换的命令是否正确,比如:
      # 示例转换命令,需匹配你的实际路径
      handlebars $(Build.ArtifactStagingDirectory)/owaspzap/report.json -f zap-to-nunit.hbs -o $(Build.ArtifactStagingDirectory)/owaspzap/test-results.xml
      
    • 查看日志中是否有模板语法错误,比如{{#each site}}是否遗漏了闭合标签{{/each}}。
  2. 验证ZAP的report.json结构
    从流水线工件下载report.json,确认是否存在site数组节点——ZAP默认JSON报告里,扫描的站点数据会放在site下,每个站点的漏洞在site[].alerts数组中。如果site节点不存在,说明ZAP扫描未生成有效报告,需先排查ZAP任务配置。
  3. 强制检查文件生成情况
    在bash任务末尾添加以下命令,确认文件是否存在及内容:
    ls -la $(Build.ArtifactStagingDirectory)/owaspzap/
    cat $(Build.ArtifactStagingDirectory)/owaspzap/test-results.xml
    
    如果文件为空,说明模板遍历逻辑未正确提取数据;如果文件不存在,说明转换命令执行失败。

二、修复「AutomatedTestName must be specified」警告及无测试运行问题

当XML文件正常生成后,需确保NUnit格式符合Azure DevOps要求:

  1. 生成合规的NUnit XML结构
    一个能被PublishTestResults@2识别的最小NUnit结构示例:
    <test-run id="1" name="OWASP ZAP 安全扫描" total="{{totalAlerts}}" passed="{{passedCount}}" failed="{{failedCount}}" skipped="0">
      <test-suite type="Assembly" name="ZAP 漏洞告警">
        {{#each site.[0].alerts}}
          <test-case name="{{name}}" result="{{#if (or (eq risk 'High') (eq risk 'Medium'))}}Failed{{else}}Passed{{/if}}">
            {{#if (or (eq risk 'High') (eq risk 'Medium'))}}
              <failure message="{{risk}} 风险:{{description}}">
                <stack-trace>URL: {{uri}} | 置信度:{{confidence}} | 修复建议:{{solution}}</stack-trace>
              </failure>
            {{/if}}
          </test-case>
        {{/each}}
      </test-suite>
    </test-run>
    
    注:如果扫描多个站点,需嵌套遍历site和alerts,比如{{#each site}}{{#each alerts}}...{{/each}}{{/each}}。
  2. 消除AutomatedTestName警告
    两种解决方式:
    • 方式1:在PublishTestResults@2任务中直接指定参数:
      - task: PublishTestResults@2
        inputs:
          testResultsFormat: 'NUnit'
          testResultsFiles: '**/test-results.xml'
          automatedTestName: 'OWASP ZAP 安全扫描用例'
      
    • 方式2:在NUnit XML的test-case节点中添加automatedTestName属性,比如:
      <test-case name="{{name}}" automatedTestName="ZAP-{{risk}}-{{name}}" result="...">
      

三、额外排查点

  • 确认ZAP任务输出路径:检查CSE-DevOps.zap-scanner.custom-build-release-task.owaspzap@1任务的配置,确保report.json生成在$(Build.ArtifactStagingDirectory)/owaspzap/路径下,和后续bash任务的读取路径一致。
  • Handlebars变量大小写:JSON是大小写敏感的,模板中引用的变量(比如site、alerts、risk)必须和report.json中的键完全匹配。
  • 权限验证:确保bash任务对$(Build.ArtifactStagingDirectory)有读写权限,避免生成的XML文件无法被后续任务访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:25:56