【问题标题】:Azure Pipelines - Parallel steps (YAML)Azure 管道 - 并行步骤 (YAML)
【发布时间】:2019-05-18 02:56:31
【问题描述】:

我正在设置我的 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 依赖于该环境而不按顺序运行它们?理想情况下是这样的:

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

或者如果可能的话,之前的作业会拍摄容器/图像快照并重用吗?

【问题讨论】:

  • 我也有同样的问题。我有一个构建任务和一个后续验证任务。验证任务需要安装 json lint。并行运行构建和 json lint 安装会更快。
  • 这个有什么更新吗?

标签: azure-devops azure-pipelines


【解决方案1】:

简短的回答,你不能。

作业中的任务不能并行运行,因为它们在同一个代理上运行,并且 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://docs.microsoft.com/en-us/azure/devops/pipelines/release/caching?view=azure-devops

【讨论】:

猜你喜欢
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2020-08-27
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多