【问题标题】:How to Trigger multiple pipelines in a project on azure devops without the other pipeline being queued for completing run on 1st pipeline如何在 azure devops 上的项目中触发多个管道,而不需要其他管道排队等待在第一个管道上完成运行
【发布时间】:2021-04-12 02:17:24
【问题描述】:

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

我已经设置了多阶段 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

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

【问题讨论】:

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


    【解决方案1】:

    不幸的是,我很确定这种类型的功能取决于您愿意支付多少。在我的组织中,我们为 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 的免费层还是私有层。

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

    【讨论】:

    • 感谢@Trent Tamura 提供此信息。肯定会更新结果:)
    • @confusedDeveloper1 如果这为您提供了正确的实施途径,请投票并标记为答案。只需一个代理,您就可以并行运行,但它会逐步升级。
    【解决方案2】:

    一种解决方法是通过 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 管道。

    【讨论】:

    • 我想同时触发两个管道,而不是在前端管道完成后排队后端管道以开始执行。后端和前端管道是两个不相关的独立事物。每个管道中的阶段是相互关联的。正如@Trent 在下面评论的那样,我正在使用只有一个并行工作的免费层订阅,所以这种行为是由于我现在得到了。但我不太确定这种解决方法能否实现我的要求。
    • 我同意@Trent,如果你只有一个代理,你会得到你发布的场景。如果您想同时触发两个管道,您可以考虑设置自托管代理或支付微软托管代理。
    猜你喜欢
    • 2020-04-22
    • 2021-12-05
    • 2021-01-13
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多