我是否必须在 Azure DevOps 管道中显式下载工件?

Do I have to explicitly download an artefact in an Azure DevOps pipeline?

我正在使用 Azure DevOps 创建一个管道,该管道将有一个阶段来构建和发布函数应用程序作为工件,然后在后续阶段通过所需的生命周期部署函数应用程序。

我不确定是否需要在后续部署阶段显式下载构建和发布阶段创建的工件?有很多关于此的文档,但它有点模棱两可,我看不到对这个特定问题的提及。

这是我的管道示例。 DevStagingProduction 阶段包含部署策略,在许多情况下,这些阶段的部署之间会有延迟(可能是几天)。

stages:
- stage: Publish
  displayName: Publish Function App
  jobs:
  - ...
- stage: Dev
  displayName: Deploy Dev
  jobs:
  - ...
- stage: Staging
  displayName: Deploy Staging
  jobs:
  - ...
- stage: Production
  displayName: Deploy Production
  jobs:
  - ...

为了发布包含我的函数应用程序的工件,我在 Publish 阶段的最后一个作业中使用了 publish 步骤。

- publish: $(System.DefaultWorkingDirectory)
  artifact: FunctionApp

我的问题是,我是否需要在 DevStagingProduction 部署阶段使用相应的 download 步骤?在 $(Pipeline.Workspace) 有空吗?请记住,我不会立即完成部署阶段。

- download: current
  artifact: FunctionApp

是的,您需要在每个阶段添加下载工件步骤,除非您指定作业是 deployment 作业:

- stage: Dev
  displayName: Deploy Dev
  jobs:
  - deployment: Staging
    environment: 'Dev'
    strategy:
      runOnce:
        deploy:
          steps:
            - powershell: Write-Host "Test"

您可以找到有关部署作业的更多信息 here

如果您使用 Microsoft 托管的代理。 yaml 管道中定义的每个作业都将 运行 在全新的虚拟机上。虚拟机用完就丢弃

因此在部署阶段的部署作业的代理计算机上不存在构建阶段的生成作业的构建工件。这就是为什么您需要在后续部署阶段显式下载在 Publish 阶段构建和发布的工件。

当您使用下载任务时,工件会下载到 $(Pipeline.Workspace)/{artifact},其中 artifact 是工件的名称。始终保留工件的文件夹结构。参见 here

如果你使用deployment job in the subsequent deployment stages as Shayki mentioned. Then you donot need to explicitly use download task. For Download artifact task will be auto injected only in the deploy hook for deployment jobs. See here.

工件将下载到部署作业代理计算机上的文件夹 $(Pipeline.Workspace)/{previousStageName.jobName}。请参阅我的测试管道的以下屏幕截图。