如果 Azure Devops 中的其他任务失败,如何 运行 一个任务

How to run a task if some other task has failed in Azure Devops

我想 运行 仅当一个特定任务 A 失败时才执行任务 B。如何实现这一点就是 Azure DevOps。我试过这个 PowerShell 但没有用。

param(
    [string]$token = $(System.AccessToken),
        [string]$targetTaskName = "Signing and Time stamping",
        [string]$collectionURL = $(Build.Repository.Uri),
        [string]$projectName = $(System.TeamProject),
        [string]$buildId = $(Build.BuildId)
    )
echo $token
echo $targetTaskName 
echo $collectionURL
echo $projectName 
echo $buildId

    $buildTimelineREST="$collectionURL$projectName/_apis/build/builds/$buildId/Timeline?api-version=4.1"
    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "test",$token)))
    $result= Invoke-RestMethod -Method GET -Uri $buildTimelineREST -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
    $targetTask=$result.records | where { $_.Name -eq $targetTaskName }
    Write-Host $targetTask.result
    if($targetTask.result -eq "failed"){
        Write-Host "##vso[task.setvariable variable=task.signing.status]failure"
    }

当我在参数中加上引号时出现此错误。

param(
    [string]$token = "$(System.AccessToken)",
        [string]$targetTaskName = "Signing and Time stamping",
        [string]$collectionURL = "$(Build.Repository.Uri)",
        [string]$projectName = "$(System.TeamProject)",
        [string]$buildId = "$(Build.BuildId)"
    )

这里有一些你应该注意的地方:

  • 要获取集合URL,您需要使用变量 System.TeamFoundationCollectionUri.
  • 您可以使用env:xxxx调用我们预定义的Azure devops 如果您想直接在 ps1 文件中调用这些预定义变量。
  • 请不要将 $(System.AccessToken) 转换为 Base64 字符串。 此 Base64 转换仅适用于 PAT。
  • 除非必要,不要在变量名中使用。因为对于 Azure devops,我们将其视为JSON文件的hierarchical。所以在这里你最好使用另一个没有任何特殊字符的变量名。例如,我指定的名称是 SigningStatus.

我做了一些修改 re-constructed 你的 powershell 脚本。现在一切都按预期进行。参考以下脚本:

[String]$projectName = $env:SYSTEM_TEAMPROJECT
[String]$collectionURL= $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
[String]$targetTaskName = "Command Line Script"
[String]$buildId = $env:BUILD_BUILDID
Write-Host $targetTaskName 
Write-Host $collectionURL
Write-Host $projectName 
Write-Host $buildId
$buildTimelineREST="$collectionURL$projectName/_apis/build/builds/$buildId/Timeline?api-version=4.1"
$result = Invoke-RestMethod -Method GET -Uri $buildTimelineREST -Headers @{   
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
$targetTask=$result.records | where { $_.Name -eq $targetTaskName }
Write-Host $targetTask.result
if($targetTask.result -eq "failed"){
Write-Host "ohhhh, it  failed"
Write-Host "##vso[task.setvariable variable=SigningStatus]failure"
}

最后,请不要忘记在代理作业级别启用允许脚本访问 OAuth 令牌复选框。