使用依赖项和条件的 Yaml 多阶段运行

soy*_*chi 6 yaml pipeline azure azure-pipelines

如果 INT 的前一个阶段已成功通过,我需要运行“安全”阶段。我尝试使用依赖和条件,但找不到解决方案。

在此输入图像描述

Leo*_*SFT 7

如果 INT 的前一个阶段已成功通过,我需要运行“安全”阶段。

恐怕目前还没有这样的 YAML 语法来实现这一点。

由于我们需要为阶段设置多个依赖Secure

- stage: Deploy
  dependsOn:
    - INT_API
    - INT_FuncIntergration
    - INT_Web
  condition: or(succeeded('INT_API'), succeeded('INT_FuncIntergration'), succeeded('INT_Web'))
Run Code Online (Sandbox Code Playgroud)

限制:

该方法只能在前一个stage成功后才会执行本stage,但当前stage需要在前面的stage全部执行完毕后才执行。如果你需要只要前一个阶段成功就执行当前阶段,这种方法仍然不够。

这是因为依赖项没有“ OR ”语法。我们无法为依赖添加条件,例如:

 - stage: Deploy
   ${{ if eq(result.INT_API, successed) }}:
    dependsOn:
      - INT_API
      - INT_FuncIntergration
      - INT_Web
    condition: or(succeeded('INT_API'), succeeded('INT_FuncIntergration'), succeeded('INT_Web'))
Run Code Online (Sandbox Code Playgroud)

因为YAML编译时就解析了条件,但此时前一阶段的运行结果还没有出来。

您可以将此请求条件“ OR ”提交到我们的 UserVoice 网站 ( https://developercommunity.visualstudio.com/content/idea/post.html?space=21 ),这是我们产品建议的主要论坛。感谢您帮助我们构建更好的 Azure DevOps。

解决方法:

解决方案的主要思想是:您可以尝试为阶段 Secure with 设置依赖项[],然后在其他任务之前添加一个内联 powershell 任务。此任务将调用 REST API定义 - Get来监视当前发布管道中的所有阶段是否具有进程中和队列状态。如果是,则等待 30 秒,然后再次循环,直到当前发布管道中的所有其他阶段都没有进程内和队列状态。然后接下来执行其他任务将被执行。

您可以查看我之前的票以获取详细信息: