我的设置由一个windows服务器组成,在该服务器上部署了一些容器。每个容器都是一个生成vsts代理,可以执行生成和部署。我试图弄清楚是否可以在多个容器之间共享目录C:agentwork
,以便拥有一个集中的工件目录。
为了共享C:agent:work
,我可以使用特定的路径并创建每个容器,其中卷映射到此目录,例如
Container1: docker run agent1 -v C:artifacts:C:agentwork
Container2: docker run agent2 -v C:artifacts:C:agentwork
然而,使用此解决方案,我进行了测试,并能够确定每个容器将在各自的SourceRootMapping文件夹中保留内部版本号,并且每当两个容器具有相同的工作目录时,这将被覆盖。由于我需要保留工件几天,我无法继续使用此解决方案。
有没有办法让不同的vsts代理共享同一个C:agentwork
目录?
我需要共享这个目录,这样每个代理都可以找到从另一个容器创建的文件——例如,如果Agent1在C:agentwork5
下创建文件,我希望这些文件可以从Agent2访问,以便执行发布。
正如您所看到的,您目前采用的方法不会可靠地工作。你将无法使它可靠地工作。
解决方案很简单:不要尝试共享此文件夹。让每个容器中的每个代理都创建自己的工作文件夹。
跨作业共享构建输出的方式是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'