假设我有一组(虚构的)项目: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进行参数化:这将大大浪费编译时间。而且,更糟糕的是,生成的文物非常大,所以即使你进行了某种缓存,你仍然需要保留不必要的副本。
答案 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}
的工件(即WINDOWS
或LINUX
)。
Prepare an environment for the run
(EnvInject插件的一部分)。Script Content
复制您的剧本:[[ ${Y:0:7} == "WINDOWS" ]] && mymapping=WINDOWS || mymapping=LINUX
FOO/X=${mymapping}