Azure管道-并行步骤(YAML)

时间:2019-05-18 02:56:31

标签: azure-devops azure-pipelines

我正在设置我的Azure Devops管道,并且其构建需要一些相当长的设置步骤才能运行。这些需要先于其他任务才能运行,其他任务可以并行运行。

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

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

是否有一种方法可以运行此长时间运行的任务,并使任务A / B依赖于该环境而无需依次运行它们?理想情况是:

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

或者以前的工作是否制作了容器/图像快照并在可能的情况下重复使用?

3 个答案:

答案 0 :(得分:1)

简短的回答,不能。

作业中的任务不能并行运行,因为它们在同一代理上运行,并且环境不能被Azure Devops“快照”以供以后其他并行作业重新使用。但是作业可以并行运行,因为可以在不同的代理上安排它们,因此安装将并行运行两次。因此,您需要根据时间需求在时间和资源使用之间进行权衡。

不过,还有另一种解决方案,具体取决于您要为此投资多少:

如果您的“设置”不经常更改,并且您愿意托管自己的代理。然后,您可以运行一个单独的“安装程序+代理”构建,该构建将创建代理的docker映像,将其推送到Azure容器注册表中,然后将该映像部署到自托管的Agent(Azure Kubernetes Service)集群中。然后,假设任务A和任务B所运行的环境(代理程序+安装docker映像)始终处于就绪状态,则可以轻松地并行运行。这正是我的设置。

请参阅:Azure DevOps Docker

答案 1 :(得分:0)

您可以使用3个作业:

  1. Long running setup
  2. taskA
  3. taskB

任务2/3取决于任务1。

您如何做到的?通过在作业中添加dependsOn。例如:

jobs:
- job: setup
    steps:
    - task: anything...
- job: taskA
  dependsOn: setup
    steps:
    - task: anything...
- job: taskB
  dependsOn: setup
    steps:
    - task: anything...

更多信息,您可以找到here

答案 2 :(得分:0)

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

这显然听起来不太好,但它可以很好地获得我所追求的性能优化。

例如 Job1 将包括:

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

Job2 to X 会将其下载为工件:

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

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