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

如何在Azure DevOps中通过YAML合并不同流水线产物生成统一HTML报告

Azure DevOps多流水线测试报告合并实现方案

前置配置检查

  • 确认Pipeline_1、Pipeline_2已经将test1.html、test2.html配置为构建/发布产物,发布时建议产物名分别命名为TestReport1、TestReport2方便识别
  • 进入Pipeline_1和Pipeline_2的安全设置,给Pipeline_3授予「生成资源读取」权限,避免下载产物时报权限错误
  • 记录Pipeline_1和Pipeline_2的流水线定义ID(可在流水线设置页面的URL中获取)

Pipeline_3 完整YAML配置示例

trigger: none # 按需配置触发规则,这里默认手动触发

pool:
  vmImage: 'windows-latest' # 可替换为ubuntu-latest等,对应调整后续脚本类型

steps:
# 下载Pipeline_1的测试报告产物
- task: DownloadPipelineArtifact@2
  inputs:
    source: 'specific'
    project: '你的Azure DevOps项目名称'
    pipeline: 'Pipeline_1的定义ID'
    artifactName: 'TestReport1' # 和Pipeline_1发布的产物名保持一致
    buildVersionToDownload: 'latest' # 可按需指定为特定版本号
    targetPath: '$(Build.ArtifactStagingDirectory)/report1'

# 下载Pipeline_2的测试报告产物
- task: DownloadPipelineArtifact@2
  inputs:
    source: 'specific'
    project: '你的Azure DevOps项目名称'
    pipeline: 'Pipeline_2的定义ID'
    artifactName: 'TestReport2' # 和Pipeline_2发布的产物名保持一致
    buildVersionToDownload: 'latest'
    targetPath: '$(Build.ArtifactStagingDirectory)/report2'

# 执行HTML合并脚本(Windows代理用PowerShell,Linux代理可对应替换为Bash脚本)
- powershell: |
    # 读取两份报告的内容
    $report1 = Get-Content "$(Build.ArtifactStagingDirectory)/report1/test1.html" -Raw
    $report2 = Get-Content "$(Build.ArtifactStagingDirectory)/report2/test2.html" -Raw

    # 生成综合报告内容,用iframe嵌入可完整保留原报告样式,也可直接提取body内容拼接
    $combinedReport = @"
    <!DOCTYPE html>
    <html>
    <head>
        <title>综合测试报告</title>
        <style>
            .report-section {margin: 30px 0;}
            iframe {width: 100%; height: 800px; border: 1px solid #eee;}
        </style>
    </head>
    <body>
        <h1>全量测试综合报告</h1>
        <div class="report-section">
            <h2>模块1测试报告(来自Pipeline_1)</h2>
            <iframe src="data:text/html;base64,$([Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($report1)))"></iframe>
        </div>
        <div class="report-section">
            <h2>模块2测试报告(来自Pipeline_2)</h2>
            <iframe src="data:text/html;base64,$([Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($report2)))"></iframe>
        </div>
    </body>
    </html>
    "@

    # 输出合并后的报告
    $combinedReport | Out-File "$(Build.ArtifactStagingDirectory)/test3.html" -Encoding utf8
  displayName: '合并两份测试报告'

# 发布合并后的综合报告作为Pipeline_3的产物
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)/test3.html'
    ArtifactName: 'CombinedTestReport'
    publishLocation: 'Container'

注意事项

  • 如果原测试报告依赖独立的CSS、JS、图片等静态资源,下载产物时需要将静态资源一起下载,合并时调整资源引用路径,避免样式丢失
  • 不需要保留原报告独立样式的场景,可以直接提取两份报告的<body>标签内的内容拼接,减少生成的报告体积
  • 可以根据需求调整下载逻辑,比如指定只下载特定分支运行的流水线产物,不用每次都拉最新版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 16:33:01