【问题标题】:Azure DO: Get test run id from Publish results taskAzure DO:从发布结果任务中获取测试运行 ID
【发布时间】:2020-01-10 12:40:58
【问题描述】:

我正在使用 Azure DO 管道运行测试,最后,我有发布测试结果任务。该任务会生成一个指向测试结果的链接,类似于:https://.../.../.../.../Runs?runId=1031864&_a=runCharts。有没有办法让runId(示例中为 1031864)或整个链接在以下任务中将其用作变量?我试图在发布变量中分配runId 并将其传递给以下任务,但没有给出结果。有人可以帮忙吗?提前谢谢你???

【问题讨论】:

  • 我不明白你的所有问题,但运行 ID 存储在 BUILD_BUILDID 中。您可以使用 $env:BUILD_BUILDID 在脚本中读取构建和发布管道。如果我理解错了,请忽略它。
  • @user270219 没有得到你的最新信息,你试试我下面给出的脚本吗?或者,如果您有任何疑虑,请随时在此处分享。
  • @Hugh Lin - MSFT 感谢您的回答和支持!我已经尝试了下面的脚本,但是在将变量传递到以下任务时遇到了问题。我尝试了以下表达式(runId 变量被分配为释放变量):Write-Host "##vso[task.setvariable variable=runId]$($result.id | ConvertTo-Json -Depth 100)"Write-Host "##vso[task.setvariable variable=runId]$result"Write-Host "##vso[task.setvariable variable=runId]$result.id"
  • 此外,我不确定是否可以为我的版本设置运行 ID - 我正在尝试使用命令行任务运行 JMeter 性能测试,然后使用发布测试结果任务。当我检查链接 https://dev.azure.com/{organization}/{project}/_apis/test/runs?api-version=5.1 时,我找不到我的版本(我猜是因为我没有使用任何测试任务)
  • @user270219 对于第一个评论,请在答案中查看我的 Update2。如果你想在release中获取runId,你只需要在你的release pipeline中添加这个powershell任务(写脚本来获取runId),这样你就可以在release中获取runId了。

标签: azure-devops


【解决方案1】:

有什么方法可以获取 runId 或整个 链接以在以下任务中将其用作变量?

对于这个问题,您可以在powershell任务中使用脚本调用Runs - List api来获取测试运行的列表。

GET https://dev.azure.com/{organization}/{project}/_apis/test/runs?api-version=5.1

然后我们需要获取最新的test runId,因为返回的结果是最底层的test run,所以我们需要对返回的结果进行降序排序。

我们可以检索测试运行的列表,按 ID 对结果进行降序排序,因为最近的测试运行具有最大的 ID。然后得到结果的第一项。

下面是一个示例powershell脚本,详细可以参考这个case

$testRuns = Invoke-RestMethod -Uri "https://dev.azure.com/{organization}/{project}/_apis/test/runs?api-version=5.1" -Headers $headers -Method Get 

$testRunsIdSorted = $testRuns.value | sort-object id -Descending

$mostRecentTestRun = Invoke-RestMethod -Uri "https://dev.azure.com/{organization}/{project}/_apis/test/runs/$($testRunsIdSorted[0].id)?api-version=5.1" -Headers $headers -Method Get 

得到mostRecentTestRun后,我们可以使用脚本##vso[task.setvariable variable=mostRecentTestRun;isOutput=true]$mostRecentTestRun"将其输出到下面的任务中。

更新

这是我在 powershell 任务中的完整脚本:

$url = 'https://dev.azure.com/{orgName}/{proName}/_apis/test/runs?api-version=5.1';

$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Method Get

$testRunsIdSorted = $response.value | sort-object id -Descending

Write-Host "results = $($testRunsIdSorted | ConvertTo-Json -Depth 100)"

$result = Invoke-RestMethod -Uri https://dev.azure.com/{org}/{pro}/_apis/test/runs/$($testRunsIdSorted[0].id)?api-version=5.1 -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Method Get

Write-Host "results = $($result | ConvertTo-Json -Depth 100)"

Write-Host "result = $($result.id | ConvertTo-Json -Depth 100)"

对于此身份验证,您需要单击代理作业中的Allow scripts to access the OAuth token 选项。

我可以在输出中得到runId:

更新2

将变量传递到以下任务时遇到问题

对于这个问题,您需要设置如下变量:

Write-Host "##vso[task.setvariable variable=runId]$($result.id | ConvertTo-Json -Depth 100)"

那么在下面的任务中,你只需要使用$(runId)这个格式来获取变量。例如:

Write-Host "$(runId)"

【讨论】:

  • 感谢您的回答。我已按照您的说明进行操作,但出现以下错误:Cannot index into a null array.,但当我使用 URL https://dev.azure.com/{organization}/{project}/_apis/test/runs?api-version=5.1 时,我看到了测试运行列表,这可能是什么原因?
  • @user270219 我把完整的脚本更新为答案,大家可以参考一下。
  • 在同一管道中并行运行的作业会有什么表现?我想有一个时间窗口,您可能会获得另一个测试运行的测试运行 ID。
猜你喜欢
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
相关资源
最近更新 更多