我如何告诉 Azure Devops 中 Microsoft 托管的代理保留作业之间的工作区?

How can I tell a Microsoft-hosted agent in Azure Devops to preserve the workspace between jobs?

我想将 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

The workspace clean options are applicable only for self-hosted agents. When using Microsoft-hosted agents, jobs are always run on a new agent.

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

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

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

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

有你的工作publish artifacts

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

然后在下游作业中,

steps:
- download: current
  artifact: WebApp

但是,您真正想要的似乎是使用 pipeline cache 作为您的包裹。