我正在使用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
配置了一个Build Artifact,在第2阶段我尝试使用source *
再次获取所有构建文件夹,目的是它们最终位于每个内部 src
文件夹旁边的正确位置项目模块 .
不幸的是,我发现还没有办法实现这一目标 . GoCD似乎在所有 *\build
文件夹中创建一个单独的ZIP文件,并且在获取期间,找不到文件 *.zip
(我假设它确实查找具有该确切名称的文件,而不是使用通配符) . 当然,我可以对所有模块名称进行硬编码并单独获取 myproject-module[1:n]
,但这正是我想要避免的 .
有没有人对如何实现这一点有一些建议?
在2014年的this discussion中,声称通配符不能用于获取工件 . 那真的还是这样吗?!
2 回答
我不能使用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
对象迭代阶段有一个阶段,您可以使用
go.artifacts.directory_wait
方法通过某个路径获取它并下载目录如果您对实施有疑问,我可以尝试帮助您 .
您可以通过通配符选择工件,您只需要为工件提供目标(XML配置中的属性
dest
) . 你可以在同一个工作中多次这样做,每次只使用不同的dest
:然后相应的
<fetchartifact ...>
标签需要使用srcdir="module1"
等 .