如何使用GoCD将多个子目录作为一个工件获取?

时间:2017-06-19 12:13:52

标签: go-cd

我正在使用GoCD构建一个包含大量模块的项目,我将其建模为具有两个阶段的管道(阶段1是构建代码,阶段2是运行测试)。成功构建阶段后的目录结构如下所示:

myproject/
|-- myproject-module1
|   |-- build              <-- created by stage 1, required by stage 2
|   `-- src
|-- myproject-module2
|   |-- build              <-- created by stage 1, required by stage 2
|   `-- src
|-- myproject-module3
|   |-- build              <-- created by stage 1, required by stage 2
|   `-- src
`-- ... many more modules ...

在第1阶段,我已经使用源*/build配置了构建工件,并且在第2阶段我尝试使用源*再次获取所有构建文件夹,意图是最终到达每个项目模块中src文件夹旁边的正确位置。

不幸的是,我发现还没有办法实现这一目标。 GoCD似乎创建了一个包含所有*\build个文件夹的单独ZIP文件,在获取期间,找不到文件*.zip(我认为它确实在寻找具有该确切名称的文件,而不是使用通配符)。当然,我可以硬编码所有模块名称并单独获取myproject-module[1:n],但这正是我想要避免的。

有没有人就如何实现这一目标提出一些建议?

自2014年this discussion起,声称通配符不能用于获取工件。那真的是这样吗?!

2 个答案:

答案 0 :(得分:1)

我不知道是否可以使用GoCD的内置功能,但绝对可以使用REST API

了解当前的管道名称,您可以获得它的所有可用阶段并计算之前的管道名称。接下来,使用download工件目录作为zip存档的可能性,您可以得到您想要的。 因此,您可以将其添加为第二阶段的脚本,这将获得压缩工件,之后您可以继续测试。

为此,我建议实施GoCD API - yagocd。这个python库可以让你以自然的方式编写上述逻辑。 一些提示:

  • 您可以从 GO_PIPELINE_NAME 获取当前的管道名称(您的服务中有很多environment variables
  • 按名称查找管道,您可以使用 PipelineManager go.pipelines.get($GO_PIPELINE_NAME, $GO_PIPELINE_COUNTER)
  • 拥有管道实例,您可以按pipeline_instance.stages object
  • 迭代各个阶段
  • 拥有一个阶段,您可以使用go.artifacts.directory_wait方法
  • 通过某个路径获取它并下载目录

如果您对实施有疑问,我可以尝试帮助您。

答案 1 :(得分:0)

您可以通过通配符选择工件,您只需要为工件提供目标(XML配置中的属性dest)。您可以在同一作业中多次执行此操作,每次只使用不同的dest

<artifact src="myproject/myproject-module1/build/*" dest="module1/" />
<artifact src="myproject/myproject-module2/build/*" dest="module2/" />
<artifact src="myproject/myproject-module3/build/*" dest="module3/" />

然后,相应的<fetchartifact ...>代码需要使用srcdir="module1"等。