C++持续集成中的Buildbot与Hudson/Jenkins对比

77

我目前使用 Jenkins/Hudson 来进行一个大型的 C++ 项目的持续集成。我们为主干和每个分支都有单独的项目。另外,还有一些与 Java 代码相关的项目,但是目前那些项目的设置相当基本(尽管我们以后可能会做更多的工作)。C++ 项目执行以下操作:

  • 使用选项构建所有内容,包括重新配置、清理构建或使用新的检出
  • 可选地构建并运行所有测试
  • 可选地使用 Valgrind 的 memcheck 运行所有测试
  • 运行 cppcheck
  • 生成 doxygen 文档
  • 发布报告:单元测试、valgrind、cppcheck、编译器警告、SLOC、开放任务和代码覆盖率(使用 gcov、gcovr 和 cobertura 插件)
  • 每晚或按需部署代码到测试环境和软件包仓库

所有内容都可配置为自动构建,并且按需构建时是可选的。底层实现使用控制大部分功能的 bash 脚本,该脚本进一步依赖于我们的构建系统,该系统使用 automake 和 autoconf 以及自定义的 bash 脚本。

最初我们开始使用 Hudson(此时),因为 Java 团队正在使用它,而我们只是想要每晚的构建。从那时起,我们添加了很多功能,并继续添加更多。在某些方面上,Hudson 很好,但肯定不是理想的。

我看过其他解决方案,唯一看起来可以替代的是 Buildbot。对于这种情况,使用 Buildbot 是否更好?既然我们已经在使用 Hudson,那么投资是否值得呢?为什么?

编辑:有人问我为什么不认为 Hudson/Jenkins 是理想的。简短的回答是一切都可以改进。我只是想知道 Jenkins 是否是当前最佳解决方案,还是是否有更好的东西(例如 Buildbot?)可在新要求出现时更容易维护。


4
我还没看过Buildbot,但是我们在Hudson上为多个C++项目做了你提到的几乎所有事情。您认为Hudson/Jenkins有哪些不理想的地方? - Soo Wei Tan
到目前为止,我们对Jenkins/Hudson非常满意。我们还没有遇到任何让我们觉得它不足或缺乏的情况。 - Soo Wei Tan
投票关闭,原因是范围过于广泛。更广泛的问题:https://dev59.com/GHVD5IYBdhLWcg3wTJvF - Ciro Santilli OurBigBook.com
@Pithikos 你们中有人尝试过使用buildbot吗?你们觉得它怎么样? - melutovich
只有少量关于Buildbot的讨论,但是有很好的讨论可以选择远离Jenkins。https://news.ycombinator.com/item?id=19781646 - melutovich
显示剩余2条评论
5个回答

44

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

总的来说,我认为buildbot是最“通用”的自动构建工具。然而,Jenkins可能是最适合运行测试的工具,尤其是将结果以漂亮的方式解析和呈现(结果、细节、图表..只需点击几下),这些是buildbot不会“开箱即用”的。我正在考虑同时使用两者来拥有更好的测试结果页面 :-)

此外,作为一个经验法则,创建新工具的配置不应该太难:如果从一个工具切换到另一个工具所需执行的操作(配置、构建、测试)规范过于复杂,这意味着不足够的配置脚本被移动到源文件中(这是一个“不好”的标志)。Buildbot(或Jenkins)应该只调用简单的命令。如果运行测试很简单,开发人员也会这样做,并且这将提高成功率,而如果只有连续集成系统运行测试,则将在修复新代码故障时跟着它跑,并失去其非回归价值,这只是我的0.02€ :-)

希望对您有所帮助。


感谢Christophe的建议,以及对每种方法的优缺点进行了很好的概述。 - deuberger
6
“Buildbot(或Jenkins)应该只调用简单的命令”- 这是极为重要的建议。 - bobah

6
"结果集成"也适用于Jenkins/Hudson,您可以相对容易地捕获构建产品,而无需在其他地方复制它们。
在我们的实例中,Java代码的覆盖率报告、单元测试指标和Javadoc都已经整合了。对于我们的C++代码,插件可能有些缺失,但仍然可以获得大部分内容。
我们自0.7版本以来一直在运行Buildbot,并且现在正在运行0.8版本。只有到后来Buildbot 0.8长时间忘记了Windows从机并且支持非常差,我们才真正意识到需要进行切换。"

9
你认为对于一个大型的C++项目,是推荐Jenkins还是buildbot? - deuberger

6

除了Jenkins / Hudson / BuildBot之外,还有许多其他解决方案:

  • Jetbrains的TeamCity
  • Atlassian的Bamboo
  • Thoughtworks的Go
  • Cruise Control
  • OpenMake Meister

实际上并不太重要你正在做什么具体任务,只要代理(也称为节点)支持这些任务即可。

CI服务器的优美之处在于注意到构建更改以触发新的构建(和测试),发布工件和发布测试结果。

当您比较像我们提到的CI工具时,请考虑其界面的可用性、分支的易用性(以及自动合并等功能)、通知(如XMPP / jabber)或信息辐射器(例如连接监视器始终显示状态)。 产品支持是另一件需要考虑的事情-Jenkins的支持取决于谁在回答社区问题时,您有问题的时间。

我个人最喜欢的是Bamboo,但它附带许可证费用。


2
感谢您的建议。在我们的情况下,我们想坚持使用FOSS解决方案,这就排除了所有那些选项,除了Cruise Control。如果您能提供一个理由,让我想要切换到Cruise Control,那将非常有帮助。 - deuberger
2
加油!在自由开源软件社区中,Jenkins得到的支持比Cruise Control要好得多。全速前进吧,伙计! - macetw
1
Go语言最近也已经成为开源软件了。 - timurb

3

我是一名长期使用Jenkins的用户,正在评估Buildbot,并希望为那些考虑使用Buildbot进行多模块解决方案的人提供一些建议:

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

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

... 我看不到任何第三方插件:

https://github.com/buildbot/buildbot/wiki/PluginList#steps

Buildbot确实会收集给定构建的所有控制台输出,但关键是,您无法收集与之相关的文件

*) 鉴于不支持artifacts,很难创建“collector”项目,将多个模块合并到一个安装程序中。 Jenkins拥有一个很棒的功能,可以让您将其他模块的构建参数化(参数类型为run)。

*) 在Buildbot中建立模块之间的依赖关系更加棘手。 假设您有一个库,有三个二进制文件依赖于它,并且您希望每次更改库时重新构建这些二进制文件。 Jenkins在UI中内置了triggers。 如果要在Buildbot中执行触发操作,您必须使用schedulers.Dependent进行脚本编写,并且会在Schedulers UI中导致许多项目拥堵。

*) 当您在Buildbot中工作时,似乎所有的配置都是在代码中的master.cfg中完成的。 这很棒但也令人沮丧。

*) Buildbot强制您创建一个worker除了master服务器之外。 这对于初学者和单个构建服务器足够的系统来说是很烦人的。

我在两天的Buildbot评估后的印象是,我们将坚持使用Jenkins,主要是因为它具有artifacts。 如果我们需要更广泛的自定义需求并有时间,则可能会考虑使用Buildbot。


3
关于buildbot和Artifacts的问题--我没有足够的用户分数来发表评论--您可以通过内置的文件/目录上传操作很容易地从buildbot 2.x系列获取Artifacts。然而,你很少只是简单地移动文件。通常你会制作一个触发式的构建步骤,直接在worker上进行部署以获得最佳效果。例如,将它们推送到云存储、容器、第三方(steam uploads)等等。
这样一来,您就可以获取上传的指标并更好地有条件地控制它们(甚至在多个工作机器之间混合和匹配Artifacts)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接