如何在 azure devops 上的项目中触发多个管道,而无需其他管道排队等待在第一个管道上完成运行

时间:2021-01-06 10:24:18

标签: azure azure-devops continuous-integration azure-pipelines

我在 github 上有两个存储库,其中包含前端的代码 ne 和后端的其他代码。 我在 azure devops 中的项目中设置了 2 个 yaml CI-CD 管道,其中一个配置为触发前端存储库和后端存储库中的其他更改。 当我触发前端存储库中的任何更改时,前端管道被触发,当我触发后端存储库中的任何更改时,后端管道被触发。

我已经设置了多阶段 yaml 管道,例如:构建-> 部署-> 在两个管道中运行测试 .当我同时触发两个管道时,一个管道排队等待,直到第一个管道的第一阶段完成,然后触发第二个管道的第一个阶段,然后触发第一个管道的第二个阶段,然后触发第二个管道的第二个阶段。我想避免这件事。

 FrontEnd Pipeline-> stage 1    
 BackendEnd Pipeline-> stage 1 
 FrontEnd Pipeline-> stage 2    
 BackendEnd Pipeline-> stage 2 
 FrontEnd Pipeline-> stage 3    
 BackendEnd Pipeline-> stage 3

这需要很多时间,并且说代理很忙。我想同时运行这些管道,例如:

FrontEnd Pipeline-> stage 1 
FrontEnd Pipeline-> stage 2
FrontEnd Pipeline-> stage 3 

单独触发

BackendEnd Pipeline-> stage 1
BackendEnd Pipeline-> stage 2
BackendEnd Pipeline-> stage 3

同时单独触发,以便两个管道都执行自己的阶段。这是如何实现的。

2 个答案:

答案 0 :(得分:0)

不幸的是,我很确定这种类型的功能取决于您愿意支付多少。在我的组织中,我们为 2 个代理付费,这允许同时执行 2 个阶段。这些阶段可以在单个管道内或跨不同管道。

有关详细信息,请参阅此 Microsoft 文档。我相信这为您指明了正确的方向。 https://docs.microsoft.com/en-us/azure/devops/pipelines/licensing/concurrent-jobs?view=azure-devops&tabs=ms-hosted

如果您只有一个代理,那么它将逐步完成 2 个管道,就像您发布的那样同时触发

 FrontEnd Pipeline-> stage 1    
 BackendEnd Pipeline-> stage 1 
 FrontEnd Pipeline-> stage 2    
 BackendEnd Pipeline-> stage 2 
 FrontEnd Pipeline-> stage 3    
 BackendEnd Pipeline-> stage 3

我相信您可以使用特定的代理池触发管道,这可能允许您按照自己的意愿以同时运行的方式运行,但您可能必须拥有多个自托管池。否则,它仍将在两个管道之间以阶梯方式运行,因为它会在两个管道之间对作业进行排队。

我还应该提到代理取决于您是 Azure 的免费层还是私有层。

该文档应该可以为您提供一些很好的见解。如果您运行任何测试等,请发布您的结论。

答案 1 :(得分:0)

一种解决方法是通过 REST api 和 PowerShell 任务触发 BackendEnd 管道。您可以使用 REST API Builds - List 来获取 FrontEnd Pipeline 的详细构建信息并检查最新的构建状态:

https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitions}&api-version=6.0

在 YAML 中,我们可以添加一个 powershell 任务来获取构建状态,例如:

- task: PowerShell@2
  inputs:
   targetType : inline
   script: |
     $url = "https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitionID}&api-version=6.0"
     $connectionToken="Your PAT Here"
     $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

       $buildPipeline= Invoke-RestMethod -Uri $url -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get


       $BuildStatus= $buildPipeline.value.status | Select-Object -first 1


       Write-Host This is Build Status: $BuildStatus

这会列出指定定义的所有构建状态,然后使用 Select-Object -first 1 获取最新的构建状态。如果状态为 completed,则将 BackendEnd 排队 管道。如果状态不是 completed,则不要将 BackendEnd 排队 管道。

相关问题