在 azure pipeline 作业之间共享文件

Share files between azure pipeline Jobs

提问人:AnjK 提问时间:3/4/2020 最后编辑:AnjK 更新时间:10/19/2022 访问量:6822

问:

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

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

在自承载代理上运行管道时,默认情况下,没有 子目录在两次连续运行之间清理。作为 结果,您可以执行增量生成和部署,前提是 任务的实施是为了利用它。您可以覆盖它 在作业上使用工作区设置的行为。

管道项目提供了一种在 管道或不同管道之间。它们通常是输出 需要由其他作业使用的生成过程,或者 部署。

作为初学者,看完这里,我有一些疑问:

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

有人可以帮我消除这些疑虑吗?

azure-pipelines 作业代理项目azure-pipelines Jobs artifacts

评论


答:

13赞 Mengdi Liang 3/5/2020 #1

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

严格来说,不,既不能也不能做到这一点。UIYAML

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

在同一管道中执行不同的作业,共享相同的工作区 可以通过变量 Pipeline.Workspace 引用吗?

示例1:

我在一条管道中有 2 个工作,一个是,另一个是 .job01job02

在 中,我创建一个 json 文件到 names 中:job01$(Pipeline.Workspace)project.json

enter image description here

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

enter image description here

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


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

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

示例2:

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

enter image description here

第一个作业在一个步骤中生成一些文件。有没有可能 在第二个作业中使用这些文件而不使用项目

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

是的,有可能。您可以参考它来实现此需求。但是,大多数情况下,我们建议您使用项目在作业之间传递文件。

评论

0赞 AnjK 3/5/2020
非常感谢!你清楚地解释了一切。
0赞 B.McKee 10/19/2022 #2

如果您的代理位于本地,则可以使用网络共享。添加管道变量:

SharePath = \\machine\automation\$(Build.BuildID)

确保运行代理的帐户具有对共享的 r/w 访问权限。JobN 可以写入或自动复制任何需要的内容到共享中,JobN+1 可以读取或复制它以继续工作。成功后,最终工作应该从共享中清理任何不需要永远徘徊的内容。

此外,如果 JobN+1 失败,因为 JobN 的输出不好,(您当然会修复 JobN,但同时)您可以手动修复共享输出并重新运行 JobN+1。