Jenkins和多配置(矩阵)工作

时间:2011-09-22 13:43:01

标签: jenkins continuous-integration multi-configuration

为什么Jenkins有两种工作,包括多配置项目和自由式项目项目?我读到某个地方,一旦你选择其中一个,你就无法转换到另一个(很容易)。为什么我不总是选择多配置项目以便为将来的更改安全?

我想在Windows和Unix(以及其他平台)上为项目构建设置构建。我找到this question),它问同样的事情,但我没有得到答案。为什么我需要三个矩阵项目(而不是三个自由式项目),每个平台一个?为什么我不能将它们全部保存在一个矩阵中,平台是AND(例如)一个轴上的gcc版本和另一个上面的(我的)软件版本?

我也阅读了this blog post,但是在同一台机器上构建了所​​有内容,只有不同的Python版本。

简而言之:大多数人如何配置针对许多不同平台的多配置项目?

9 个答案:

答案 0 :(得分:42)

这两种类型的工作有不同的功能:

  • 自由式作业:这些作业允许您在单个计算机或标签(计算机组,例如“Windows-XP-32”)上构建项目。
  • 多配置作业:这些允许您在多台计算机或标签上构建项目,或两者兼而有之,例如Windows-XP,Windows-Vista,Windows-7和RedHat - 用于检查兼容性或构建多个平台(qt程序?)

如果您有一个想在Windows和Windows上构建的项目; Unix,你有两个选择:

  • 为每个配置创建单独的自由样式作业,在这种情况下,您必须单独维护每个配置
  • 您有一个多配置作业,并且您选择2个(或更多)标签/计算机/从站 - 1个用于Windows,1个用于Unix。在这种情况下,您只需要为构建维护一个作业

您可以将gcc版本保留在一个轴上,将软件版本保留在另一个轴上。没有理由你不应该这样做。

您链接的问题有一个公平的问题,但是与您的问题没有直接关系的问题:在他的情况下,他有一个多配置工作 A ,其中 - 成功 - 触发另一份工作 B 。现在,在多配置作业中,如果其中一个配置失败,则整个作业失败(显然,因为您希望项目在所有配置上成功构建)。

恕我直言,要在多个平台上构建相同的项目,更好的方法是使用多配置样式的作业。

答案 1 :(得分:6)

另一种选择是使用python构建步骤来检查当前的操作系统,然后调用适当的安装或构建脚本。在python脚本中,您可以将更新的环境保存到文件中,并使用EnvInject插件再次注入环境以进行后续构建步骤。根据构建环境的大小,您还可以使用SCons等多平台构建工具。

答案 2 :(得分:4)

一个选项是使用用户定义的轴与slave(windows,linux,...)结合使用,因此您需要为每个组合添加一个过滤器,并使用Conditional BuildStep插件为每个plataform设置特定的构建步骤(Executar shell,Windows命令,......)

此链接有一个教程,但它是葡萄牙语,但很容易根据图像进行处理... http://manhadalasanha.wordpress.com/2013/06/20/projeto-de-multiplas-configuracoes-matrix-no-jenkins/

答案 3 :(得分:3)

您可以使用源代码创建一个脚本(例如 build )和批处理文件(例如 build.bat )。在构建步骤中的Jenkins中,您可以调用 $ WORKSPACE / build - Windows将执行 build.bat ,而Linux将运行 build

答案 4 :(得分:2)

您可以在定义配置矩阵轴时使用jenkins创建的变量。例如: 您创建名为OSTYPE的从轴并检查两个从站(Windows和Linux)。然后,您创建两个单独的构建步骤并检查OSTYPE环境变量。

您可以使用改进的脚本语言,例如python,它是多平台的,并且可以在一个构建步骤中实现独立于从属名称的相同功能。

答案 5 :(得分:2)

如果你使用Windows和其他东西去矩阵路线,你会想要XShell插件。您只需创建两个构建脚本,例如cmd的“build.bat”和bash的“build”,并告诉XShell运行“build”。在每种情况下都会运行正确的。

答案 6 :(得分:1)

在Unix上运行批处理文件和在Unix上运行shell脚本的攻击:

在Unix上,使批处理文件以0退出状态退出:

ln -s /bin/true /bin/cmd

在Windows上,找到true.exe,将其命名为sh.exe并将其放在路径中的某个位置。

或者,如果您在Windows上安装了sh.exe(来自Cygwin,Git或其他来源),请将其添加到Jenkins的shell脚本顶部:

[ -n "$WINDIR" ] && exit 0

答案 7 :(得分:1)

为什么不总是选择多配置作业类型?

有些原因浮现在脑海中:

  1. 因为作业应该易于创建和配置。如果在您的环境中配置任何作业很困难,那么您可能在jenkins作业范围之外做错了。如果你很高兴你设法创造了这个工作并且它最终运行了,并且你不愿意再次完成这项工作,那就是你应该尝试改进的地方。
  2. 因为多配置作业更复杂。它们通常要求您考虑主要工作和不同的子工作变量,并且它们往往会在复杂性上增加到超出可管理性的水平。因此,在单个作业场景中,您可能会浪费思考不使用这种复杂性,并且在扩展构建变量时,事情可能会朝着错误的方向发展。我建议使用简单作业作为默认作业,并且仅在需要多个配置时使用多配置作业。
  3. 因为执行多配置作业可能需要更多作业位置而不是单个作业。总会有一个主要作业在一个特殊的,不可见的插槽上执行(这本身没有问题)并触发子作业,但如果这些子作业本身触发子作业,如果有的话,你可能很容易陷入死锁比插槽更多的子作业,一些子作业再次触发子作业,然后由于没有更多的打开插槽而无法执行。通过在从站上使用某些配置设置可以避免此问题,但它存在并且可能仅在多个多个作业同时运行时才会发生。
  4. 所以从本质上讲:多配置作业是一个更复杂的事情,因为除非必要,否则应该避免复杂性,常规自由式作业是更好的默认。

答案 8 :(得分:0)

如果要选择运行作业的从站,则需要使用多配置项目(否则您将无法选择/限制运行它的从站 - 有三种方法可以执行此操作但是我已经尝试了所有这些(Tie插件仅适用于主作业,高级项目选项中的限制也不是摇滚安全触发器,因此您希望使用已被证明在今天正常工作的Slave轴。)