azure-devops - 即使其中一项工作失败,如何将 azure devops 管道结果设置为成功
问题描述
我正在开发一个 Azure CD YAML 管道,以将 CI 管道的结果部署到虚拟机上。现在,为了这篇文章的目的,稍微简化一下,CD 管道非常简单,由一个包含 3 个作业的阶段组成:
- 第一个作业运行脚本来停止某种复杂的应用程序。这有时会失败。
- 只有当第一个作业失败时,第二个作业才会运行。这让管理员有机会进行手动干预(利用内置的手动验证任务)并修复第一个作业中遇到的问题。如果管理员乐意继续运行部署管道,他将恢复管道的运行。
- 第三步是部署新版本的应用程序。
这是 YAML 管道的整体结构:
jobs:
- deployment: StopApplication
environment:
name: 'EnvA' # This environment is a set of virtual machines running self-hosted Azure Agents.
resourceType: VirtualMachine
strategy:
rolling:
maxParallel: 1
deploy:
steps:
- task: ...
- job: ManualIntervation
displayName: Manual intervention to fix issue while stopping application
pool: server
dependsOn: StopApplication
condition: failed() # This job will run only if job StopApplication has failed.
timeoutInMinutes: 60
steps:
- task: ManualValidation@0
timeoutInMinutes: 50
inputs:
notifyUsers:
someone@somewhere.com
instructions: 'Do something'
onTimeout: 'reject'
- deployment: DeployApp
dependsOn:
- StopApplication
- ManualIntervation
condition: xor(succeeded('StopApplication'), succeeded('ManualIntervation'))
workspace:
clean: all
environment:
name: 'EnvA' # This environment is a set of virtual machines running self-hosted Azure Agents.
resourceType: VirtualMachine
strategy:
rolling:
maxParallel: 1
deploy:
steps:
- task: ...
我遇到的问题是,如果第一个部署作业失败,但管理员检查了问题,修复它,恢复管道的运行并且最后一个部署作业成功,Azure DevOps 将我的管道显示为失败(DevOps 中的红叉门户),我可以理解为其中一项工作失败了。尽管如此,在功能上,部署成功了,所以我想设置/强制管道运行的结果为成功,以便 Azure DevOps 显示绿色检查。
有谁知道实现这一目标的方法?我会假设这是可能的,否则我不明白为什么我们有机会在管道中进行手动干预。
解决方案
构建结果是只读的,构建完成后无法更新。但是,您可以查看以下解决方法以消除 Devops 门户中的失败标志(红十字)。
1、continueOnError
用于工作中的StopApplication
任务。对于以下示例:
jobs:
- deployment: StopApplication
...
steps:
- task: taskName
...
continueOnError: true
当 continueOnError 属性设置为 true 时。管道的结果将设置为SucceededWithIssues
任务失败时。您将有一个感叹号而不是红十字
您还需要更改为condition
for 作业ManualIntervation
。
然后更改作业的条件ManualIntervation
以检查标志变量是否设置为真。见下文:
- job: ManualIntervation
dependsOn: StopApplication
condition: eq(dependencies.StopApplication.result, 'SucceededWithIssues')
2,另一种解决方法是将StopApplication
作业与不同管道中的其他作业分开。
您需要创建两个管道。第一个管道只有StopApplication
工作。第二个管道包含其余的作业。并使用rest api从第一个管道触发第二个管道。
在第一个管道中。失败任务后的powershell任务检查作业状态并使用rest api触发第二个管道。请参见下面的示例:
- powershell: |
$body = @{
templateParameters=@{
ManualIntervation= "false"
}
}
if("$(Agent.JobStatus)" -eq "Failed"){
$body.templateParameters.ManualIntervation='true'
}
$url = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/pipelines/{second-pipelineId}/runs?api-version=6.1-preview.1"
$result5 = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $(system.accesstoken)"} -Method post -Body (convertto-json $body) -ContentType "application/json"
condition: always() #always run this task
然后在第二个管道中定义一个运行时参数 ManualIntervation
并设置作业条件,ManualIntervation
如下所示:
parameters:
- name: ManualIntervation
type: string
default: false
...
- job: ManualIntervation
dependsOn: StopApplication
condition: eq('${{parameters.ManualIntervation}}', 'true')
执行第一个管道时。powershell 任务将触发第二个管道,模板参数请求正文将覆盖ManualIntervation
第二个管道中的参数。如果ManualIntervation
是真的。然后将执行 ManualIntervation 作业。
这样即使第一个管道失败,第二个管道也会成功。
推荐阅读
- php - 摆脱 google api lib 中任何不必要的依赖项
- parsing - 自定义 SQL 函数/扩展的语法
- wordpress - 帖子表中的可排序自定义列
- php - 检测包含管道的字符串并追加
- automation - 如何在 Unity Pro 中计算时间?
- java - Android 11 上的 Whatsapp 状态
- python - 使用python解析API Json(字典)响应
- extjs - sencha cmd如何创建子包?
- react-native - 仅显示一次欢迎屏幕
- python - 这段代码在 Colab 中运行良好,但在 Jupyter 中却没有,这是怎么回事?