【发布时间】:2021-05-12 20:06:58
【问题描述】:
Azure DevOps 管道是否只支持重新运行失败的任务而不支持整个阶段?
例如,我们有部署到测试环境阶段,它由多个任务组成。
为了简化描述,我们假设只有两个任务:第一个任务执行一些 SQL 语句,第二个任务执行一些 UNIX 脚本。
如果 UNIX 失败,我不想重新运行 SQL 任务。
【问题讨论】:
标签: azure azure-devops azure-pipelines
Azure DevOps 管道是否只支持重新运行失败的任务而不支持整个阶段?
例如,我们有部署到测试环境阶段,它由多个任务组成。
为了简化描述,我们假设只有两个任务:第一个任务执行一些 SQL 语句,第二个任务执行一些 UNIX 脚本。
如果 UNIX 失败,我不想重新运行 SQL 任务。
【问题讨论】:
标签: azure azure-devops azure-pipelines
Azure DevOps 管道是否只支持重新运行失败的任务而不支持整个阶段?
恐怕没有现成的方法可以满足您的要求。
解决方法:
您可以尝试在任务条件下使用变量:SYSTEM.STAGEATTEMPT。该变量用于记录阶段运行的数量。
这是一个例子:
stages:
- stage: QA
jobs:
- job: test
steps:
- task: PowerShell@2
condition: eq(variables['SYSTEM.STAGEATTEMPT'], '1')
inputs:
targetType: 'inline'
script: |
# Write your PowerShell commands here.
Write-Host "Hello World"
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
xxxx
结果:
您可以为 SQL 任务设置此条件,然后该任务将仅在第一阶段运行时运行。
当您重新运行失败的阶段时,SQL 任务将跳过。
另一方面,你的要求是有道理的。
这是我们 UserVoice 网站中的建议票:Rerun failed build task/step。
【讨论】:
不幸的是,没有办法只重新运行任务,但是有一个适合您的方案的解决方案(解决方法),而不是在作业中使用许多步骤构建管道的这个特定阶段,您可以拆分您的SQL 任务和 Unix 任务在两个不同的作业中,并使它们相互依赖,因此如果一个失败,它将不会执行另一个示例:
...
jobs:
- job: SQLJob
steps:
- task: RunSomeSQLScripts
- job: UnixJob
dependsOn:
- SQLJob
steps:
- task: RunSomeUnixScripts
...
如果您需要在作业之间共享文件,您可以将它们发布为工件,如果您需要在之前的作业中生成一些变量并在第二个作业中使用,您可以使用输出变量:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch
【讨论】: