buildbot vs hudson/jenkins的c++持续集成
buildbot vs hudson/jenkins for C++ continuous integration
我目前正在使用jenkins/hudson进行持续集成,主要是一个大型的c++项目。我们对主干和每个分支都有单独的项目。此外,还有一些与Java代码相关的项目,但这些项目的设置现在还相当基础(稍后我们可能会做更多)。c++项目做以下工作:
- 构建所有内容,并提供是否重新配置,进行干净构建或使用新签出的选项
- 可选地构建和运行所有测试
- 可选地使用Valgrind的memcheck运行所有测试
- 运行cppcheck
- 生成氧气文档
- 发布报告:单元测试、valgrind、cppcheck、编译器警告、SLOC、打开任务和代码覆盖率(使用gcov、gcovr和cobertura插件)
- 每晚或按需部署代码到测试环境和包存储库
对于自动构建,一切都是可配置的,对于按需构建,一切都是可选的。在底层,有一个bash脚本来控制这些,它进一步依赖于我们的构建系统,它使用automake和autoconf以及自定义bash脚本。
我们开始使用Hudson(当时),因为Java人员正在使用它,我们只是想要每晚构建。从那以后,我们添加了更多,并继续添加更多。在某些方面,哈德逊是伟大的,但肯定不是理想的。
我看过其他的解决方案,唯一一个看起来可以替代的是buildbot。对于这种情况,buildbot会更好吗?既然我们已经在用哈德森了,这笔投资值得吗?为什么?
EDIT:有人问我为什么没有发现Hudson/Jenkins是理想的。简短的回答是,一切都可以改进。我只是想知道Jenkins是否是我用例的最佳解决方案,或者是否有更好的东西(buildbot?),即使出现新的需求,从长远来看也更容易维护。
都是开源项目,但您不需要更改buildbot代码来"扩展"它,实际上很容易在其配置中导入您自己的包,您可以在其中子类化您自己添加的大多数功能。例如:你自己的编译或测试代码,对输出/错误的一些解析,给下一步,你自己的警告电子邮件的格式等等,有很多可能性。
一般来说,我会说buildbot是最"通用"的自动构建工具。Jenkins可能是运行测试的最佳工具,尤其是在解析和以良好的方式呈现结果(结果、细节、图表……)一些点击),事情,buildbot不做"开箱即用"。我实际上在考虑使用两者都有性感的测试结果页…: -)另外,根据经验,创建一个新工具的配置应该不难:如果要做什么(配置、构建、测试)的规范很难从一个工具切换到另一个工具,这是一个(不好的)迹象,说明没有足够的配置脚本被移到源代码中。Buildbot(或Jenkins)应该只调用简单的命令。如果运行测试很简单,那么开发人员也会这样做,这将提高成功率,然而,如果只有持续集成系统运行测试,您将在它之后运行以修复新的代码失败,并将失去其非回归值,只是我的0.02€:-)
希望对你有帮助。
'结果集成'也在jenkins/hudson中,您可以相对容易地捕获构建产品,而不必'将它们复制到其他地方'。
对于我们的实例,覆盖报告和单元测试度量以及java代码的javadoc都是集成的。对于我们的c++代码,插件有点缺乏,但你仍然可以得到它的大部分。
我们从0.7版本开始运行buildbot,现在运行的是0.8版本,直到现在才有真正的理由切换,因为buildbot 0.8在很长一段时间内忘记了Windows slave,而且支持非常差。
除了Jenkins/Hudson/BuildBot之外,还有许多其他解决方案:
- TeamCity by Jetbrains Bamboo by Atlassian
- Go by Thoughtworks
- 巡航控制
- OpenMake Meister
你所做的事情的细节并不那么重要,事实上,只要你所做的代理(又名节点)支持这些任务。
CI服务器的美妙之处在于,它会注意到何时构建发生变化,从而触发新的构建(和测试),发布工件,并发布测试结果。
当您比较我们提到的那些CI工具时,请考虑其界面的可用性、分支的容易程度(以及它可能提供的功能,如自动合并)、通知(如XMPP/jabber)或信息散热器(如连接监视器以始终显示状态)等特性。产品支持是另一件要考虑的事情——Jenkins的支持只有在你有问题的时候回应社区问题的人才算好。
我个人最喜欢的是Bamboo,但是它需要支付许可费。
我是一个长期的Jenkins用户,正在评估Buildbot,我想为那些考虑使用Buildbot进行多模块解决方案的人提供一些项目:
*) Buildbot没有任何与每个构建相关的文件artifacts
的开箱概念。它不在UI中也不在任何内置步骤中modules as far as I can see:
…我没有看到第三方插件:
https://github.com/buildbot/buildbot/wiki/PluginList步骤Buildbot收集给定构建的所有控制台输出,但关键是,您不能收集与相关的文件。
*)鉴于工件不受支持,创建"collector"并不容易。在单个安装程序中引入多个模块的项目。Jenkins有一个很棒的特性,可以让你用其他模块的构建参数化一个构建(参数类型是一个run
)。
*)在Buildbot中建立模块之间的依赖关系更加棘手。假设您有一个三个二进制文件依赖的库,并且您希望这些二进制文件在每次库更改时重新构建。 Jenkins在UI中内置了triggers
。如果你想在Buildbot中做触发器,你必须使用schedulers.Dependent
来编写脚本,这会导致Schedulers
UI中的许多项目拥塞。
*)当你在Buildbot中工作时,似乎几乎所有的配置都是在master.cfg
代码中完成的。这是令人敬畏和令人沮丧的。
*) Buildbot强制您除了创建master
服务器之外还要创建worker
。这对于初学者和一个构建服务器就足够的系统来说是很烦人的。
经过两天的Buildbot评估,我的印象是我们将坚持使用Jenkins,主要是因为它有artifacts
。Buildbot是一个我们只有在有更广泛的定制需求和时间时才会使用的工具。
关于buildbot和工件的主题——我没有足够的用户分数来发表评论——您可以从buildbot 2中获得工件。X系列相当容易与内置的文件/目录上传动作。然而,您很少希望只是移动文件。通常,您会创建一个触发的构建步骤,直接在worker之外进行部署,以获得最佳效果。例如推送到云存储、容器、第三方(steam上传)等
通过这种方式,您可以获得有关上传的指标,并有条件地更好地控制它们(甚至可以跨工作机器混合和匹配工件)。
- 将公共但非静态的成员函数与ALGLIB集成
- 将IBM Rhapsody模型集成到VS 2019中
- 从R调用C++函数并对其进行集成时出错
- 如何集成 HID USB 控制器?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 将Qt集成到现有的VS项目中以取代WinAPI
- 将 Crashpad 与 Windows Qt 应用程序集成
- Python3.6 模板中的 CGAL C++ 集成错误
- 基本 Cuda C++项目集成问题
- 如何使用CMake将QtMultimedia组件集成到项目中?
- 在 Mac OS 中将 QT 与 CMAKE 集成
- 使用 GSL 库制作样条曲线并使用它们进行集成
- 在集成终端上运行vscode lldb调试器时,如何获取程序的输出?
- 将Emscripten集成到Clion中
- VIsual Studio:避免控制台弹出,而是将其集成到IDE中
- 如何在electrolon项目中集成qt原生窗口
- 与 boost odeint 集成期间的析构函数调用
- C++uWebSockets将事件循环集成到一个线程中
- C++ 项目在 Jenkins 中的持续集成
- 将 ROOT 与 CMake 集成