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

如何将测试结果从一个Azure DevOps项目发布到另一个项目(YAML)

将Cypress测试结果发布到另一个Azure DevOps项目

要把CI/CD项目中的Cypress测试结果发布到另一个看板项目,默认的PublishTestResults@2任务仅支持当前项目,需要通过Azure DevOps REST API实现跨项目发布,具体步骤如下:

1. 准备权限与变量

  • 生成目标项目的PAT:在目标看板项目的用户设置中创建个人访问令牌(PAT),权限至少包含Test Management (Read & Write)和Build (Read),确保能创建测试运行并上传结果。
  • 配置流水线变量:在CI/CD项目的流水线设置中添加两个变量:
    • TargetProjectId:目标看板项目的GUID(可在项目设置页面的URL中获取,或通过项目概况页面查看)
    • TargetProjectPAT:将上述生成的PAT设为保密变量,避免泄露

2. 修改流水线YAML

在原有PublishTestResults@2任务之后,添加PowerShell任务调用REST API完成跨项目发布。修改后的完整YAML如下:

jobs:
- job: Job_2
  displayName: 'Cypress'
  pool:
    vmImage: windows-latest
  steps:
  - checkout: self
    clean: False
  - task: Npm@1
    displayName: Install Packages
    inputs:
      workingDir: $(Build.SourcesDirectory)/Test_Project
      verbose: false
  - task: Npm@1
    displayName: Run Tests
    inputs:
      workingDir: $(Build.SourcesDirectory)/Test_Project
      command: 'custom'
      customCommand: 'run cypress:run'
     
  - task: PublishTestResults@2
    displayName: Publish Test Results to Current Project
    inputs:
      testResultsFormat: 'JUnit'
      testResultsFiles: 'junitreport.xml'
      searchFolder: '$(System.DefaultWorkingDirectory)/Test_Project/cypress/reports'

  # 新增:发布测试结果到目标看板项目
  - task: PowerShell@2
    displayName: 'Publish Test Results to Target Project'
    inputs:
      targetType: 'inline'
      script: |
        # 定义基础变量
        $orgUrl = "$(System.CollectionUri)"
        $targetProjectId = "$(TargetProjectId)"
        $pat = "$(TargetProjectPAT)"
        $testResultsPath = "$(System.DefaultWorkingDirectory)/Test_Project/cypress/reports/junitreport.xml"
        $runName = "Cypress Test Run - $(Build.BuildNumber)"

        # 编码PAT用于API认证
        $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat"))

        # 创建测试运行的请求体(如需关联指定Test Plan,取消注释plan字段并替换ID)
        $runBody = @{
            name = $runName
            automated = $true
            # plan = @{
            #     id = 123 # 替换为目标项目的Test Plan ID
            # }
        } | ConvertTo-Json

        # 创建新的测试运行
        $runResponse = Invoke-RestMethod -Uri "$orgUrl/$targetProjectId/_apis/test/runs?api-version=7.1-preview.3" `
            -Method Post `
            -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} `
            -ContentType "application/json" `
            -Body $runBody

        $runId = $runResponse.id

        # 上传JUnit测试结果到新建的测试运行
        Invoke-RestMethod -Uri "$orgUrl/$targetProjectId/_apis/test/runs/$runId/results?api-version=7.1-preview.6" `
            -Method Post `
            -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} `
            -ContentType "application/xml" `
            -InFile $testResultsPath

3. 关键说明

  • Test Plan关联:如果需要将测试结果关联到目标项目的特定Test Plan,取消plan字段的注释并替换为对应的Test Plan ID(可在目标项目的Test Plans页面获取)。
  • API版本:示例中使用的是Azure DevOps REST API的预览版本,如需稳定版本可替换为7.0。
  • 权限验证:确保PAT拥有目标项目的测试管理读写权限,否则会出现API调用失败的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:44:52