【问题标题】:Run a task B when all the previous tasks have succeeded except few tasks(Run a task if a list of task is succeeded)当除少数任务外的所有先前任务都成功时运行任务 B(如果任务列表成功则运行任务)
【发布时间】:2020-09-18 17:01:08
【问题描述】:

我想在除一个之外的所有先前任务都成功后运行任务 B。需要明确的是,任务 A 位于任务 B 之前。任务 A 的输出与任务 B 无关,如果除 A 之外的所有任务都已通过,则它应该运行。如何为此设置自定义条件?

或者换句话说,如果任务列表成功则运行任务?

【问题讨论】:

  • 考虑使用 PowerShell 作业和/或工作流。
  • @Mehul-Parmar 您要运行和检查哪种任务? Powershell Cmdlet 或 exe 文件...?
  • @LosFla 所以我说的之前的任务列表是 Nuget Restore、Visual Studio Build、Powershell 和批处理命令的混合。但我认为这应该没关系,对吧?我只想知道如何编写自定义条件来检查这些特定任务之前是否通过。
  • @MehulParmar 你可以使用 $?在每个命令之后检查它是否成功。它返回真或假。或者您可以使用 try、catch 进行错误处理。

标签: azure powershell azure-devops powershell-2.0


【解决方案1】:

让我们猜测一下管道的结构。

job:
  -Task A
  -Task B
  -Task C
  -Task NoRelated
  -Task D

现在,您要查找的是Task D 将一直运行到Task A & Task B & Task C 都成功,Task NoRelated 的结果与Task D 无关,对吧?

我想你应该知道,到目前为止,没有任何直接的表达可以让你做到这一点。我们必须考虑使用变通方法。只需添加一个额外的任务并配置任务的condition 设置。


为了满足您的要求,您可以尝试以下建议。

  • 第一步。

首先,请确保Task A&Task B&Task C的条件设置都是只有在之前的所有任务都成功的情况下:

此时,Task C 将运行直到Task A 和Task B 全部成功。如果Task A 和Task B 中的任何任务失败,Task C 将处于取消状态。

所以,我们只需要知道Task C的状态,就可以确认Task A & Task B & Task C是否都成功了。

  • 第二步:

在当前代理作业中添加一个powershell任务,并确保这个powershell任务在Task A&Task B&Task C之后执行。然后使用this 的示例脚本检查Task C 的状态。让我将此 powershell 任务命名为 Signing Status。

由于即使Task C失败,我们也需要检索任务C的状态,请将签名状态任务的条件设置为即使之前的任务失败,即使构建被取消。

  • 第三步:

设置Task D的条件为eq(variables['SigningStatus'], 'succeeded')。


流水线结构概览:

                          condition setting

job:
  -Task A              --"Only when all previous tasks have succeeded"
  -Task B              --"Only when all previous tasks have succeeded"
  -Task C              --"Only when all previous tasks have succeeded"
  -Task NoRelated      --"Depend on yourself"
  -Task Signing Status --"Even if a previous task has failed, even if the build was canceled"
  -Task D              --"eq(variables['SigningStatus'], 'succeeded')"

【讨论】:

  • 很好的解释。谢谢!但是在任务 D 之后呢?如果有 E、F、G、H,它们都应该只在之前的任务成功后运行,Task NoRelated 除外。如何维护这条链?我想在每一步之后我都需要放置一个 PowerShell 脚本并更新 SigningStatus 变量。
  • @MehulParmar,不,不需要那个。那太丑陋了。只需扩展您的 powershell 脚本逻辑即可检查这些任务的状态。
【解决方案2】:

您可以在 powershell 或其他脚本下包装并运行您的任务 A。以这样的方式为 TaskA 制作脚本,这样它就不会失败!您可以在脚本下设置一个条件,如果它无法设置管道变量以进行进一步检查,但对于管道任务,它应该始终通过。 根据管道变量,您可以运行或取消即将执行的任务。

【讨论】:

    【解决方案3】:

    你可以使用 $?在每个命令之后检查它是否成功。它返回真或假。或者您可以使用 try、catch 进行错误处理。

    If($?)
    {
        # execute if last command returned true
    }
    else
    {
        # execute if last command returned false
    }
    

    或者

    Try 
    {
        # command with parameter -ErrorAction Stop
        # to catch error in catch block
    
        # command to execute if successful
    }
    Catch
    {
        # catch error with $_
        # or start another command 
    }
    

    【讨论】:

    • 哦,你的意思是在每项任务之后我都必须编写一个 Powershell 脚本来检查。我更多的是在管道提供的设置中考虑custom condition。
    • 是的,因为在每个任务之间都有一个 PowerShell 是不可行的。我更倾向于在每个任务成功后,如果我们可以将管道变量(通过输出变量或类似的东西)更新为 true,并且对于每个下游任务,我们可以设置一个条件以仅在该值为 true 时运行。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    相关资源
    最近更新 更多