如何让 Azure Devops 中的 Microsoft 托管代理保留作业之间的工作空间?

问题描述

我想将在 Microsoft 托管的代理上运行的大型作业分解为在同一代理上按顺序运行的较小作业。大型作业的组织方式如下:

pool:
  vmImage: 'windows-latest'

jobs:
- job: large_job
  steps:
    - task: NuGetCommand@2
       inputs:
          command: 'restore'
    - task: VSBuild@1
    - task: VSTest@2

我想把它分解成两个较小的工作,像这样:

pool:
  vmImage: 'windows-latest'

jobs:
- job: job_one
  steps:
    - task: NuGetCommand@2
       inputs:
          command: 'restore'

- job: job_two
  dependsOn: job_one
  steps:
    - checkout: none
    - task: VSBuild@1
    - task: VSTest@2

... 以便下载我所有的二进制资源将在 job_one 中进行,构建和测试将在 job_two 中进行。

作业包括一个可选参数 workspace:clean,它与自托管代理一起使用,以指定是否应从代理中删除二进制资源、构建结果或所有内容。如果省略 workspace:clean 参数,则不会删除任何内容 - 保留所有内容。这就是我想要的。

但是,根据Workspace topic in the Azure Devops documentation

工作区清理选项仅适用于自托管代理。使用 Microsoft 托管的代理时,作业始终在新代理上运行。

这意味着在 job_two 可以运行构建任务之前,我的所有二进制资源都被删除了。我想做这样的事情:

- job: job_two
  dependsOn: job_one
  workspace:
    clean: none
  steps:
    - checkout: none
    - task: VSBuild@1
    - task: VSTest@2

我想避免使用自托管代理。如何使用 Microsoft 托管的代理执行此操作?

解决方法

您永远不能依赖于作业之间的工作空间相同,期间 -- 作业可以在任何一个可用代理上运行,这些代理分布在多个工作文件夹中,甚至可能在不同的物理机。

让你的工作publish artifacts

steps:
- publish: $(System.DefaultWorkingDirectory)/bin/WebApp
  artifact: WebApp

然后在下游工作中,

steps:
- download: current
  artifact: WebApp

但是,您真正要找的似乎是为您的包使用 pipeline cache

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...