首页 文章

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

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

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

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

在2014年的this discussion中,声称通配符不能用于获取工件 . 那真的还是这样吗?!

2 回答

  • 0

    我不能使用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 方法通过某个路径获取它并下载目录

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

  • 1

    您可以通过通配符选择工件,您只需要为工件提供目标(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" 等 .

相关问题