2011-09-22 171 views
37

为什么詹金斯有两种作业,多配置项目和自由式项目项目?我读过一个地方,一旦你选择其中一个,你不能转换到另一个(很容易)。为什么我不会总是选择多配置项目以保证未来的变化安全?Jenkins和多配置(矩阵)作业

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

我也读了this blog post,但是它在同一台机器上构建了一切,只有不同的Python版本。

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

+0

“为什么我不会总是选择多配置项目以保证未来的变化安全?”我认为这部分没有答案 - 通过自由式项目选择它有什么缺点吗 –

回答

42

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

  • 游离式作业:这允许你建立一个单一的计算机或标签(计算机组,对于如“的Windows XP-32项目“)。
  • 多配置作业:它们允许您在多台计算机或标签或两者的组合中构建项目,例如Windows-XP,Windows-Vista,Windows-7和RedHat-,这对于检查兼容性或建设多个平台(QT程序?)

如果你要建立在Windows & Unix的一个项目,你有两个选择:

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

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

你链接有一个公平点,而是一个不涉及直接你的问题的问题:在他的情况,他有一个多配置工作一个,这 - 成功 - 触发另一个工作。现在,在多配置作业中,如果其中一个配置失败,整个作业将失败(显然,因为您希望项目在所有配置上成功构建)。

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

+4

太棒了答案!但是,有一个问题:我如何让Jenkins只为Windows生成服务器启动Windows批处理文件,以及只有Linux构建服务器?用我目前的配置(多项目),它似乎也尝试在Windows上启动shell脚本。 – joscarsson

+1

这是唯一的问题 - 我辩论是否键入,因为它似乎是很多人的downer :) 如果你可以创建一个等效的shell脚本并安装了bash或cygwin,你可以使用它。如果不是,你唯一的选择就是创建单独的工作。批处理文件中是否有特殊的内容不会转换为shell脚本? – Sagar

+0

我明白了。我采用了简单的方法,将构建分离到不同的自由式项目中。我读过一些人正在使用诸如Ant之类的独立于平台的构建脚本。 – joscarsson

2

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

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

+0

这实际上是个不错的主意!没有考虑如何使用环境变量,总是得出结论,我需要一个脚本在两个平台上运行。谢谢你的提示! – joscarsson

+0

...或者是吗? :)我刚测试过。我仍然需要将构建步骤指定为“执行Windows批处理命令”或“执行外壳程序”,并且如果同时指定两个平台上的构建均失败。 – joscarsson

+1

@joscarsson你有没有试过条件构建步骤插件?这样你可以运行只有一个取决于OSTYPE。我还没有尝试过,请回复,如果这是为你工作! – jan

3

你可以创建一个脚本(例如构建),并获得与你的源代码签入一个批处理文件(例如的build.bat)。在Jenkins的构建步骤中,您可以拨打$ WORKSPACE/build - Windows将执行build.bat而Linux将运行build

+4

我是否将该构建步骤设置为“执行Windows批处理命令”或“执行外壳”? – joscarsson

6

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

+0

基于Python的构建工具具有易于在多个平台上部署的优势。我们使用'doit'并确保文件处理在任何地方都能正常工作,我们使用优秀的'py'模块('from py.path import local'')。 –

2

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

1

一个黑客有Windows上运行的批处理文件和Unix上的shell脚本:

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

ln -s /bin/true /bin/cmd

在Windows上,找到一条true.exe,将其命名为sh.exe某处放置在PATH。

或者,如果你有安装在Windows(cygwin的版本,Git会,或其他来源)的任何sh.exe,在詹金斯将其添加到shell脚本的顶部:

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

1

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

一些注意的原因是:

  1. 因为工作应该很容易创建和配置。如果在你的环境中很难配置任何工作,你可能在詹金斯工作范围之外做了一些错误的工作。如果你很高兴能够创造出这样一份工作,并且它终于能够运行,并且你不愿意再次完成整个工作,那么这就是你应该尝试改进的地方。
  2. 由于多配置作业更复杂。他们通常会要求您考虑主要工作和不同的子工作变量,而且他们往往会变得越来越难以管理。因此,在单一的工作场景中,您可能会浪费不考虑复杂性的想法,并且在扩展构建变量时,事情可能会朝错误的方向发展。我建议使用简单作业作为默认作业,并且只有在需要多个配置时才能使用多配置作业。
  3. 因为执行多个配置作业可能需要比单个作业更多的从属作业槽。总是会有一个主作业在一个特殊的不可见的插槽(它本身没有问题)上执行并触发子作业,但是如果这些子作业自己触发子作业,那么如果存在比插槽更多的子作业,并且一些子作业再次触发子作业,然后由于没有更多的空插槽而无法执行。通过在从服务器上使用一些配置设置可以规避此问题,但它存在并且可能只在多个多任务同时运行时才会发生。

所以实质上:多配置工作是一件更复杂的事情,因为复杂性应该避免,除非必要,否则常规自由式作业是更好的默认设置。

0

如果要选择运行作业的从属设备,则需要使用多配置项目(否则,您将无法选择/限制运行它的从站 - 有三种方法可以执行但是我已经尝试过所有这些(Tie插件仅适用于主工作,Restrict in Advanced Project Options并非摇滚安全的触发器,所以您想使用证明今天能正常工作的从轴。)