跨多个容器共享代理工作目录 (C:\agent\work)

Share agent work directory (C:\agent\work) across multiple containers

我的设置包括一个 windows 服务器,上面部署了一些容器。每个容器都是一个构建 vsts 代理,可以执行构建和部署。我想弄清楚我是否可以在多个容器之间共享目录 C:\agent\work 以便拥有一个集中的工件目录。

为了共享 C:\agent:\work 我可以使用特定路径并创建每个容器,例如将卷映射到此目录

Container1: docker run agent1 -v C:\artifacts:C:\agent\work
Container2: docker run agent2 -v C:\artifacts:C:\agent\work

使用这个解决方案,但是我测试并能够确定每个容器将在每个自己的 SourceRootMapping 文件夹中保存内部版本号,并且每次两个容器都有相同的工作目录时将被覆盖。由于我需要保留工件几天,因此我无法继续使用此解决方案。

有没有办法让不同的 vsts 代理共享同一个 C:\agent\work 目录?

我需要共享这个目录,这样每个代理都可以找到从另一个容器创建的文件,例如,如果代理 1 在 C:\agent\work 下创建文件,我希望代理 2 可以访问这些文件,以便执行发布。

如您所见,您目前采用的方法无法可靠地发挥作用。您将无法使其可靠地工作。

解决方法很简单:不要尝试共享此文件夹。让每个容器中的每个代理创建自己的工作文件夹。

跨作业共享构建输出的方式是publish它们。不要发布到文件共享,而是发布到 Azure DevOps——文件共享发布主要是 TFS 2013 及更早版本保留的遗留功能,近十年来都没有必要。

有关详细信息,请参阅链接文档。

我为这个问题选择的解决方案是将工件存储在单独的目录中,例如每个容器上的 C:\artifacts。构建过程将使用 builID$(artifactsPath) -> C:\artifacts

在唯一目录中输出工件

然后容器的 C:\artifacts 目录将在所有容器之间共享,并在主机上映射:

docker run --name image1 -v S:\artifacts:C:\artifacts

发布工件:

task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: '$(build.BuildId)'
        publishLocation: 'FilePath'
        TargetPath: '$(artifactsPath)$(Build.DefinitionName)\drop'