Azure Devops 禁用在同一管道上的并发运行

cfb*_*fbd 9 azure-devops azure-pipelines

我在 azure devops 中有 2 个构建代理和 8 个管道。如果为管道 A 启动了一个运行,并且为同一管道触发了另一个运行,Azure Devops 将在另一个代理上启动第二个运行,而无需等待第一个代理完成。

如何让 Azure Devops 等到第一次运行完成后再开始第二次运行?

编辑:使用 yaml 管道而不是旧的构建/发布管道。

Rob*_*Bos 5

看起来你可以通过使用 yaml 文件中的触发器选项来做到这一点:

trigger:  
    batch: true
Run Code Online (Sandbox Code Playgroud)

请注意,此值默认为 false(因此当为空时),但它可能仅在已定义触发器时?

文档在这里:https : //docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view= azure-devops &tabs=schema#triggers

  • 这实际上并不会禁用并发构建运行,只是交错构建。这个答案对OP的用例有帮助。它没有解决标题问题,或者似乎不再起作用。 (4认同)

小智 5

可以通过设置具有排他锁检查的环境来防止并发运行。这允许使用 Microsoft 托管的代理,而不仅仅是自托管的代理。它还不需要像需求那样将管道分配给特定代理。

  1. 在管道/环境中定义一个环境,说“my_environment”。 ADO 导航栏图像

  2. 向环境添加“独占锁”类型的检查。

  3. 在您的 YAML 中,使用以下形式引用环境“my_environment”:

    锁定行为:顺序
    阶段:
    - 舞台:舞台
      工作:
      - 部署:工作
        环境:我的环境
        战略:
          运行一次:
            部署:
              脚步:
                ...

这将强制同一管道的多个队列按队列顺序依次运行。不同的管道必须使用不同的环境,否则会互相阻塞。

更多信息请参见:https://learn.microsoft.com/en-us/azure/devops/release-notes/2021/sprint-190-update#azure-pipelines-1


小智 5

我能够通过执行以下操作来做到这一点(防止多个构建同时执行一个阶段):

  1. 在 Azure 中创建受保护的资源。我选择了一个名为 的变量组build_concurrency_lockPipelines您可以通过-> Library->添加它Variable Groups。请务必为资源添加“排它锁”。

添加独占锁

  1. 然后将其添加到阶段以在azure-pipelines.yml.
stages:
  # Code Pipeline
  - stage: BuildStage
    displayName: "Build"

    # These next three lines make builds run in serial. We need to do this since we use a shared "builds" environment in azure - see https://stackoverflow.com/a/73694320/1072030, https://learn.microsoft.com/en-us/azure/devops/pipelines/library/variable-groups?view=azure-devops&tabs=yaml, and https://learn.microsoft.com/en-us/azure/devops/release-notes/2021/sprint-190-update#support-for-sequential-deployments-rather-than-latest-only-when-using-exclusive-lock-checks
    lockBehavior: sequential
    variables:
      - group: build_concurrency_lock # relies on a "build_concurrency_lock" Library variable group existing and having an "Exclusive Lock" "Approvals and checks" setup.

Run Code Online (Sandbox Code Playgroud)


Mer*_*SFT 2

我认为您可以在管道的代理作业上向池中添加需求,以便由于相同的指定条件,它将使用同一个代理运行。

首先,在代理中添加一项Capability 。

在此输入图像描述

然后,在您的 YAML 中,将需求添加到池中。

pool:
  name: {agent pool name}
  demands: Limit -equals DisAbleParallel 
Run Code Online (Sandbox Code Playgroud)

它的格式是demands:{CapabilityName} -equals {CapabilityValue}.

当您指定代理需求时,管道将仅与该代理一起运行。当 A 运行时,第二个不会同时运行,因为前一个正在运行,代理正在使用。这样,第二个将运行到前一个结束。