有什么方法可以在发布管道中获取任务名称以根据条件执行特定任务

Is there any way we can get task name in the release pipeline to execute specific task based on an condition

我正在开发一个发布管道,1 个代理中大约有 3 个任务。任务A,任务B,任务C 我想 运行 基于特定任务失败的特定任务。我尝试了自定义条件,但它不满足我的情况。 我希望在只有任务 B 失败时执行任务 C,因为我也在使用输出变量。在这种情况下,它仅适用于任务 B。当任务 A 失败时,任务 B 将跳过并且输出变量变为空,在这种情况下我的任务 C 正在执行,这是不正确的。

我正在尝试创建一个同时满足 TaskA 和 TaskB 条件的条件。

  1. 如果 TaskA 失败 --> TaskC 应该不会 运行
  2. 如果 TaskB 失败 --> TaskC 应该 运行.

这是我的条件:-> and(eq(Agent.JobStatus, 'failed'), in(variables['oneboxout.oneboxvar'],'False')) 有什么方法可以只获取任务名称,这样我的工作会更轻松。

下面是我的任务截图,供大家参考。

Is there any way we can get task name only so my work would be easier.

答案是肯定的。

我们可以使用REST API Releases - Get Release 获取任务名称或状态;

https://docs.microsoft.com/en-us/rest/api/azure/devops/release/releases/get%20release?view=azure-devops-rest-6.0

如上面的 REST API,我们需要向该 REST API 提供当前版本 ID。要解决这个问题,我们可以使用带有参数 definitionId={definitionId} 和 powershell 参数 Select-Object -first 1 的 REST API Releases - List 来获取当前版本 ID。

要解决此请求,我想使用以下方法:

总结:

  1. JobBJobC 之间添加 powershell 任务(让我们称之为 Get JobB task result)以调用 REST API 得到 JobB with condition Even if a previous task has failed, unless the build was canceled.
  2. 的结果
  3. 根据上述 powershell 任务中的任务 JobB 的结果设置一个具有不同值的变量 RunJobC
  4. JobC设置条件and(always(), eq(variables['RunJobC'], 'True'))

我的测试脚本(勾选阶段中的Allow scripts to access the OAuth token选项):

$url = "https://vsrm.dev.azure.com/M<YourOrganization>/<YourProject>/_apis/release/releases?definitionId=24&api-version=6.0"
$RealeasePipeline= Invoke-RestMethod -Uri $url -Headers @{   
 Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
} -Method Get

$ReleaseId= $RealeasePipeline.value.id | Select-Object -first 1

Write-Host The current Release Id: $ReleaseId

$url2 = "https://vsrm.dev.azure.com/<YourOrganization>/<YourProject>/_apis/release/releases/$($ReleaseId)?api-version=6.0"
$ReleaseInfo= Invoke-RestMethod -Uri $url2 -Headers @{   
 Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
} -Method Get

$TargetTask=$ReleaseInfo.environments.deploySteps.releaseDeployPhases.deploymentJobs.tasks| where { $_.Name -eq "JobB"}

Write-Host JobB task Result is: $TargetTask.status

if ($TargetTask.status -eq "succeeded"){
  Write-Host ("##vso[task.setvariable variable=RunJobC]False")
}elseif($TargetTask.status -eq "Failed"){
  Write-Host ("##vso[task.setvariable variable=RunJobC]True")
}

我的测试结果: