如果 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 令牌复选框。
我想 运行 仅当一个特定任务 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 令牌复选框。