0

我正在使用 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 阶段,我使用 source 配置了 Build Artifact,*/build在第 2 阶段,我尝试使用 source 再次获取所有构建文件夹*,目的是使它们最终src位于每个项目内文件夹旁边的正确位置模块。

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

有人对如何实现这一点有一些建议吗?

在2014 年的讨论中,声称不能使用通配符来获取工件。真的还是这样吗?!

4

2 回答 2

1

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

知道当前管道名称,您可以获取它的所有可用阶段并计算前一个。接下来,使用将工件目录下载为 zip 存档的可能性,您可以获得所需的内容。因此,您可以将其添加为第二阶段的脚本,这将获得压缩的工件,之后您可以继续测试。

为此,我可以推荐我的 GoCD API 实现 - yagocd。这个 python 库可以让你以自然的方式编写上述逻辑。一些技巧:

  • 您可以从GO_PIPELINE_NAME获取当前管道名称(您的服务中有很多环境变量
  • 要按名称查找管道,您可以使用PipelineManagergo.pipelines.get($GO_PIPELINE_NAME, $GO_PIPELINE_COUNTER)
  • 拥有管道实例,您可以按pipeline_instance.stages对象迭代阶段
  • 有一个阶段,你可以通过一些路径使用go.artifacts.directory_wait方法获得它的工作和下载目录

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

于 2017-06-20T08:10:40.243 回答
0

您可以通过通配符选择工件,您只需为工件指定一个目的地(destXML 配置中的属性)。您可以在同一个作业中多次执行此操作,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"等。

于 2017-11-28T19:39:46.443 回答