Azure Pipelines - 并行步骤 (YAML)

问题描述 投票:0回答:2

我正在设置我的 Azure Devops Pipelines,并且有一个需要一些相当冗长的设置步骤才能运行的构建。这些需要在其他任务之前运行,这些任务可以并行运行。

但是,我只能看到这是通过指定作业来完成的,这每次都需要执行这些冗长的步骤。即:

jobs:
  - job: Run1
     steps:
       - task: Long running setup task
       - task: Run taskA
  - job: Run2
       - task: Long running setup task
       - task: Run taskB  

有没有办法让这个长时间运行的任务运行,并且让任务 A/B 依赖于该环境而不按顺序运行它们?理想情况下它会是这样的:

jobs:
  - job: Run1
    steps:
      - task: Long running setup
      - task: Parallel: taskA
      - task: Parallel: taskB

或者让之前的作业拍摄容器/映像快照并重用(如果可能的话)?

azure-devops azure-pipelines
2个回答
19
投票

简短的回答,你不能。

作业中的任务无法并行运行,因为它们在同一代理上运行,并且 Azure Devops 无法对环境进行“快照”以便稍后由其他作业并行重新利用。但是作业可以并行运行,因为它们可以安排在不同的代理上,因此安装程序将并行运行两次。因此,您需要根据自己的要求来决定时间和资源使用之间的权衡。

还有另一种解决方案,具体取决于您想投资多少:

如果您的“设置”不经常改变并且您愿意托管自己的代理。然后,您可以运行单独的“设置 + 代理”构建,该构建会创建代理的 docker 映像,将其推送到 Azure 容器注册表,然后将此映像部署到自托管代理(Azure Kubernetes 服务)集群。然后任务 A 和任务 B 可以轻松并行运行,假设它们运行的环境(代理 + 设置 docker 镜像)始终准备就绪。这正是我的设置。

参见:Azure DevOps Docker


2
投票

对此的更新 - @dparker 建议的 docker 镜像,虽然这可能是更好的方法,但对我自己来说有点 OTT。相反,我使用管道工件来缓存一些构建/设置文件。然后每个其他工作都依赖于这个设置工作。

这显然听起来不太好,但它可以很好地实现我想要的性能优化。

例如 Job1 将包括以下内容:

  - task: PublishPipelineArtifact@0
    inputs:
      artifactName: 'Setup-Build'
      targetPath: '$(buildDir)' 

Job2 到 X 会将其作为工件下载:

- task: DownloadPipelineArtifact@1
    displayName: 'Download Setup'
    inputs:
      targetPath: '$(buildDir)'
      artifactName: 'Setup-Build'     

此外,还可以选择使用缓存,但这不太适合我的场景。我建议您在工件和缓存之间进行调用: https://learn.microsoft.com/en-us/azure/devops/pipelines/release/caching?view=azure-devops

© www.soinside.com 2019 - 2024. All rights reserved.