Buildbot vs Hudson/Jenkins for C + + 持续集成

我目前正在使用 Jenkins/Hudson 进行一个大型的主要是 C + + 项目的持续集成。我们有单独的项目为主干和每个分支。此外,还有一些与 Java 代码相关的项目,但是这些项目的设置现在相当基本(不过我们可能稍后会做更多)。C + + 项目做了以下工作:

  • 生成所有内容,其中包含是否重新配置、进行干净的生成或使用新签出的选项
  • Optionally builds and runs all tests
  • 可选地运行所有的测试使用瓦尔格伦的 memcheck
  • 进行 cppcheck
  • Generates doxygen documentation
  • 发布报告: 单元测试、 val备份、 cppcheck、编译器警告、 SLOC、打开的任务和代码覆盖率(使用 gcov、 gcovr 和 cobertura 插件)
  • 每晚或根据需要将代码部署到测试环境和包存储库

对于自动构建,一切都是可配置的,对于随需应变的构建,一切都是可选的。在下面,有一个 bash 脚本控制了大部分内容,它进一步依赖于我们的构建系统,该系统使用 automake 和 autoconf 以及自定义 bash 脚本。

我们开始使用 Hudson (在那个时候) ,因为那是 Java 的家伙们正在使用的,我们只是想每晚构建。从那时起,我们增加了很多,并继续增加更多。在某些方面,哈德森是伟大的,但肯定不是理想的。

我看过其他的解决方案,唯一一个看起来可以替代的是 buildbot。在这种情况下 buildbot 会更好吗?既然我们已经在用哈德森了,这笔投资值得吗?为什么?

编辑 : 有人问我为什么没有发现哈德森/詹金斯是理想的。简而言之,一切都是可以改进的。我只是想知道 Jenkins 是否是我的用例的最佳当前解决方案,或者是否有更好的解决方案(buildbot?)即使出现了新的需求,从长远来看也更容易维护。

39056 次浏览

这两个都是开源项目,但是你不需要改变 buildbot 代码来“扩展”它,实际上很容易在它的配置中导入你自己的包,在其中你可以用你自己的添加来子类化大多数特性。例如: 您自己的编译或测试代码,一些输出/错误的解析将提供给下一步,您自己的警报电子邮件的格式等有很多可能性。

一般来说,buildbot 是最“通用”的自动构建工具。然而,Jenkins 可能是与运行测试相关的最佳人选,特别是在解析和以漂亮的方式呈现结果(结果、细节、图表)方面。.一些点击) ,事情,buildbot 不做“开箱即用”。实际上我正在考虑用这两种方式来制作更性感的测试结果页面。.:-)

另外,根据经验,创建一个新工具的配置应该不难: 如果要做什么(配置、构建、测试)的规范太难从一个工具切换到另一个工具,那么没有足够的配置脚本转移到源代码就是一个(坏)信号。Buildbot (或 Jenkins)应该只调用简单的命令。如果运行测试很简单,那么开发人员也会这样做,这将提高测试的成功率,而如果只有持续集成系统运行测试,那么您将追随它来修复新的代码失败,并将失去其非回归值,仅仅是我的0.02 something: -)

希望能有帮助。

“结果集成”也存在于 Jenkins/Hudson 中,您可以相对容易地捕获构建产品,而不必“在其他地方复制它们”。

对于我们的实例,Java 代码的覆盖率报告、单元测试指标和 javadoc 都是集成的。对于我们的 C + + 代码,虽然缺少一些插件,但是你仍然可以得到大部分。

我们从0.7版本开始运行 buildbot,现在运行0.8版本,现在才看到切换的真正原因,因为 buildbot 0.8在很长一段时间内忘记了 windows 的奴隶,而且支持非常差。

除了 Jenkins/Hudson/BuildBot,还有很多其他的解决方案:

  • TeamCity 作者: Jetbrain
  • Atlassian 的竹子
  • 叫我思维工厂
  • 巡航控制中心
  • OpenMake Meister

实际上,关于您正在执行的任务的细节并不那么重要,只要您正在执行的代理(即节点)支持这些任务即可。

CI 服务器的美妙之处在于,当构建发生更改以触发新的构建(和测试)、发布构件和发布测试结果时,可以注意到这一点。

当你比较像我们提到的那些 CI 工具时,考虑一些特性,比如界面的可用性,分支的容易程度(以及它可能提供的诸如自动合并的特性) ,通知(比如 XMPP/jabber) ,或者信息辐射器(比如连接显示器以显示状态)。产品支持是另一件需要考虑的事情—— Jenkins 的支持只有在你有问题的时候回答社区问题的人才是最好的。

My personal favorite is Bamboo, but it comes with a license fee.

I'm a long-time Jenkins user in the middle of evaluating Buildbot and would like to offer a few items for folks considering using Buildbot for multi-module solutions:

*) Buildbot 没有任何与每个构建相关的开箱即用的文件 artifacts概念。它不在 UI 中,也不在我能看到的任何内置的“步骤”模块中:

Http://docs.buildbot.net/current/manual/configuration/buildsteps.html

没有第三方插件:

Https://github.com/buildbot/buildbot/wiki/pluginlist#steps

Buildbot 确实收集来自给定构建的所有控制台输出,但关键是,您不能收集与其相关的 文件

*) Given that artifacts are not supported, it's not easy to create "collector" projects that bring multiple modules into say, a single installer. Jenkins has a great feature that lets you parameterize a build with builds from other modules (the parameter type is a run).

*)在 Buildbot,在模块之间建立依赖关系更为棘手。詹金斯在用户界面中内置了 triggers。如果你想在 Buildbot 制作触发器,你必须使用 schedulers.Dependent编写触发器脚本,这会导致 Schedulers用户界面出现很多项目拥塞。

*)当你在 Buildbot 工作时,似乎所有的配置都是用代码完成的。这太棒了,太让人沮丧了。

*) Buildbot 强制您在 master服务器之外创建一个 worker。对于单个构建服务器就足够的初学者和系统来说,这是令人恼火的。

My impression after two days of Buildbot evaluation is that we'll stick with Jenkins, primarily due to it having artifacts. Buildbot is a tool we'd only use if we had more extensive customization needs, and the time to do it.

关于 buildbot 和工件这个主题——我没有足够的用户评分来进行评论——通过内置的文件/目录上传操作,您可以非常容易地从 buildbot 2.x 系列中获得工件。然而,您很少只想移动文件。通常,您会创建一个触发的构建步骤,直接从工作线程进行部署,以获得最佳结果。例如推向云存储、容器、第三方(蒸汽上传)等。

This way you can get metrics on the uploads and conditionally control them better (or even mix and match artifacts across worker machines).