使用Jenkins和多配置复制工件时很聪明

时间:2014-03-21 12:06:47

标签: jenkins hudson

假设我有一组(虚构的)项目:FOO和BAR。这两个项目都有某种多配置选项。

FOO在轴X上有一个矩阵,它采用{ x1, ..., xn }中的值(因此有F个n版本)。 BAR在轴Y上有一个矩阵,它取{ y1, ..., ym }中的值(因此有很多BAR版本)。

但是,BAR需要从FOO复制一些工件。事实证明Y是一个严格更精细的分区而不是n。例如,X可能会将值{ WINDOWS, LINUX }Y取为{ WINDOWS_XP, WINDOWS_7, DEBIAN_TESTING, FEDORA }或其他值。

是否有可能让BAR进行某种表查找以确定复制工件时所需的FOO配置?我可以轻松地编写一个shell脚本来吐出映射,但是当Jenkins解决它需要复制的内容时,我无法弄清楚如何调用它。

目前,一个hacky解决方案是在FOO上有两个轴,X上有一个轴,Y有一个轴,然后过滤掉没有意义的组合。但由此产生的组合滤波器是荒谬的,矩阵非常稀疏。呸。

我不喜欢的解决方案是在Y上对FOO进行参数化:这将大大浪费编译时间。而且,更糟糕的是,生成的文物非常大,所以即使你进行了某种缓存,你仍然需要保留不必要的副本。

1 个答案:

答案 0 :(得分:3)

不能说我完全理解你的矩阵的复杂性,但我想我可以帮助你解决实际问题

"I can easily write a shell script to spit out the mapping, but I can't work out how to invoke it when Jenkins is working out what it needs to copy"

归档工件从其他项目复制工件构建后操作可以采用java样式的通配符,例如module/dist/**/*.zip以及环境变量/参数,就像列表或工件的${PARAM}一样。您可以使用逗号,添加更多工件。

从另一个项目复制工件的页面帮助说明如何复制特定矩阵配置的工件:To copy from a particular configuration, enter JOBNAME/AXIS=VALUE,这是针对Project Name属性的。project name${PARAM}属性也可以包含Project Name

的参数

因此,在 BAR 作业中,有一个复制工件构建步骤,FOO/X=${mymapping}BAR。这将做的是:每次运行FOO配置时,它将仅从配置为X=${mymapping}的{​​{1}}复制工件。

现在,您需要在每次${mymapping}运行时动态设置BAR的值。像这样的简单脚本可以解决这个问题:

[[ ${Y:0:7} == "WINDOWS" ]] && mymapping=WINDOWS || mymapping=LINUX

最后,您需要使用EnvInject插件将此变量用于其他构建步骤,包括复制工件步骤。

因此,每次BAR配置运行时,它都会查看自己的配置轴Y,如果该轴以WINDOWS开头,则会设置${mymapping}WINDOWS,然后将其设为LINUX。然后,此${mymapping}可用于其余构建步骤。执行Copy Artifacts构建步骤时,它只会复制来自FOO轴与X匹配的${mymapping}的工件(即WINDOWSLINUX )。

完整设置

  • 安装EnvInject插件。
  • BAR 作业配置中,勾选Prepare an environment for the run(EnvInject插件的一部分)。
  • 确保选中两个用于保留现有变量的复选框。
  • Script Content复制您的剧本:
    [[ ${Y:0:7} == "WINDOWS" ]] && mymapping=WINDOWS || mymapping=LINUX
  • 构建步骤下,配置复制工件构建步骤。
  • 项目名称参数设置为FOO/X=${mymapping}
  • 照常配置其余部分。