我正在设置我的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
或者以前的工作是否制作了容器/图像快照并在可能的情况下重复使用?
答案 0 :(得分:1)
简短的回答,不能。
作业中的任务不能并行运行,因为它们在同一代理上运行,并且环境不能被Azure Devops“快照”以供以后其他并行作业重新使用。但是作业可以并行运行,因为可以在不同的代理上安排它们,因此安装将并行运行两次。因此,您需要根据时间需求在时间和资源使用之间进行权衡。
不过,还有另一种解决方案,具体取决于您要为此投资多少:
如果您的“设置”不经常更改,并且您愿意托管自己的代理。然后,您可以运行一个单独的“安装程序+代理”构建,该构建将创建代理的docker映像,将其推送到Azure容器注册表中,然后将该映像部署到自托管的Agent(Azure Kubernetes Service)集群中。然后,假设任务A和任务B所运行的环境(代理程序+安装docker映像)始终处于就绪状态,则可以轻松地并行运行。这正是我的设置。
答案 1 :(得分:0)
您可以使用3个作业:
Long running setup
taskA
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