【发布时间】:2022-01-04 02:12:02
【问题描述】:
我正在尝试使用特定定义中的模板参数获取所有正在运行的构建(正在进行中)+。我在 Azure DevOps 中使用 Powershell@2 任务来完成此任务,但没有使用 Where-Object 运行多个条件。下面是代码:
$token = "123"
$organization = "foo"
$project = "abc"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
$ThisBuildDefinitionID = "8430"
[int]$ThisBuildID = "1571327"
$GET_BUILDS_BY_DEFINITION_URL = "https://azure.com/$organization/$project/_apis/build/builds?api-version=6.0&definitions=$ThisBuildDefinitionID"
do
{
$GET_BUILDS_BY_DEFINITION_RESPONSE = ""
try
{
$GET_BUILDS_BY_DEFINITION_RESPONSE = Invoke-RestMethod -Uri $GET_BUILDS_BY_DEFINITION_URL `
-Method GET `
-ContentType "application/json" `
-Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
}
catch
{
continue
}
Write-Host $GET_BUILDS_BY_DEFINITION_RESPONSE.value
[array]$runningBuilds = $GET_BUILDS_BY_DEFINITION_RESPONSE.value | Where-Object {"status" -eq "inProgress" -and "templateParameters.param1" -eq "myparam"}
Write-Host "running builds count: " $runningBuilds.count
if ($runningBuilds.count -gt 0) {
[int]$currentRunningBuild = ($runningBuilds | Sort-Object -Property "Id")[0].Id
}
Write-Host "This Build ID: " $ThisBuildID
Write-Host "Currently Running Build ID: " $currentRunningBuild
Write-Host "Waiting..."
Write-Output ""
Start-Sleep -Seconds 5
}
while($ThisBuildID -ne $currentRunningBuild)
Write-Host "Waiting Complete."
Write-Host "Starting Build: " $ThisBuildID
Start-Sleep -Seconds 5
Where-Object {"status" -eq "inProgress" -and "templateParameters.param1" -eq "myparam"} 是我遇到问题的部分,即什么条件才能正常运行。
当我只使用像 Where-Object "status" -eq "inProgress" 这样的单一条件时,它可以正常工作并让我获得正在进行的构建,但我还想包含一个模板参数条件
有人可以帮我解决我做错了什么吗?
PS:感谢 visualstudio 开发者社区中的Devin Lambert's script。
【问题讨论】:
-
我查看了这个 API 的文档,我很惊讶它完全可以工作,因为我没有看到这个 API 返回的 Build 类的“值”属性。但除此之外,如果您尝试对子属性应用过滤器,那么您可以使用类似
? status -eq "inProgress" | ? { $_.templateParameters.param1 -eq "myparam"}的东西,您可以一次性完成所有操作,但这只是我的偏好,当它不会分离时对性能产生很大影响。