在 Azure 管道作业之间共享文件

Anj*_*yna 7 jobs artifacts agent azure-pipelines

在 Azure 管道的文档中,我读到:

每个代理一次只能运行一项作业。要并行运行多个作业,您必须配置多个代理。

在自托管代理上运行管道时,默认情况下,在两次连续运行之间不会清除任何子目录。因此,您可以进行增量构建和部署,前提是已实现任务以利用它。您可以使用作业的工作区设置覆盖此行为。

管道工件提供了一种在管道中的阶段之间或不同管道之间共享文件的方法。它们通常是需要由另一个作业使用或部署的构建过程的输出。

作为初学者,看完这篇,我有一些疑惑:

  1. 如果我在 azure-pipelines.yaml 中有 2 个作业(第 2 个作业在第 1 个之后运行),这两个作业会在同一个代理中运行吗?同一管道中的不同作业是否共享可通过变量引用的同一工作区Pipeline.Workspace?(很明显,在并行作业运行的情况下,它需要多个代理)。
  2. 第一项工作一步生成一些文件。是否可以在不使用工件的情况下在第二个作业中使用这些文件(通常使用工件,第一个作业发布工件,第二个作业下载它)?

可以请一些人帮我清除这些疑虑吗?

Mer*_*SFT 8

如果我在 azure-pipelines.yaml 中有 2 个作业(第 2 个作业在第 1 个之后运行),这两个作业会在同一个代理中运行吗?

严格来说,NO,既UI不能YAML也不能实现。

正如您从文档中看到的:每个代理一次只能运行一项作业。我们的设计逻辑是,理论上,一个job是一个独立运行的个体,不同job之间的通信需要使用“中间件”,比如variableartifact等等。

同一管道中的不同作业是否共享可通过变量 Pipeline.Workspace 引用的同一工作区?

示例 1:

我在一个管道中有 2 个工作,一个是job01,另一个是job02

在 中job01,我将一个 json 文件创建为$(Pipeline.Workspace)名称project.json

在此处输入图片说明

在 job02 中,打印 path 下的文件列表$(Pipeline.Workspace)

在此处输入图片说明

您可以看到,第二个作业无法访问第一个作业的输出目录。


但是,有一种特殊情况,即管道与自代理池一起运行,并且该池中仅存在一个代理。

此时,它们可以在同一个代理上运行,因为池中只有一个代理。而且,如果您不手动clean在作业定义中执行操作,则在这种特殊情况下,文件可以在作业之间共享,因为它们使用的是恒定的本地路径。

样本2:

与上一个示例相同,但这次将运行池更改为仅包含 1 个代理的池。

在此处输入图片说明

第一项工作一步生成一些文件。是否可以在不使用工件的情况下在第二个作业中使用这些文件

我认为我上面的特殊情况描述并sample2回答了这个问题。

是的,有可能。你可以参考那个来实现这个需求。但是,我们主要建议您使用工件在作业之间传递文件。