持续集成即 CI(Continuous integration)是一种每天数次将所有开发人员的工作副本合并到一条共享主线上的实践。听起来,持续集成也没有做很多事情,只是集成并自动化了一系列任务,以便所有开发人员的工作都可以每时每刻地进行合并。但其实持续集成中有很多门道,而且工具选型也有很多值得思考的地方。
最近,工程师郭铁心(Tiexin Guo)分析了多个 CI 工具,InfoQ对其进行了翻译,希望能帮助你选型时做出更合适的决策。
CI 工具选型的考虑事项
在选择 CI 工具时,我们应该考虑哪些事项呢?一般来说,需要考虑以下几点:
- 易于安装(如果不打算使用 SAAS/PAAS 解决方案)
- 易于使用
- SAAS/PAAS 解决方案
- 安装在云上
- 安装在 Kubernetes 上
- 安装在本地(on-premise)
- 开源
对于一款工具,易于使用是最重要的,只有这样才能提高我们的工作效率。另外,它还要易于安装,如果这个工具安装很复杂,无法自动化或很难做到自动化,那么它就不能很好地扩展到多个项目和环境中。对于小型团队而言,他们根本不想维护自己的 CI,更倾向于使用现有的云服务,而大型公司更希望自己控制 CI,无论是在云上还是在本地。Kubernetes 现在如此热门,用户当然希望 CI 工具链作为容器运行其上,如果这个工具是开源的就更好了,还可以获得更多的社区支持。
CI 工具的优劣势对比
1. Jenkins
这是一款开源免费产品,在 GitHub 上有 1.5 万颗 Stars,同时也有很多用户。如果在 Stack Overflow 中搜索 Jenkins,你会发现有超过 40 万个问题。但Jenkins 是一个很久之前设计的工具,如果想要兼容现在的架构,就必须依赖一些附加的组件和插件。
2. CircleCI
它相对来说比较便宜,有免费计划,也易于使用(配置是基于 YAML 的,虽然并不是每个人都喜欢 YAML)、易于阅读。但是,它很难在本地部署,也不支持 Kubernetes,它的核心组件是用 Clojure 编写的,虽然很酷,但是使用群体相对较少,而且 Clojure 也比 Java 慢。
3. TeamCity
这是一款使用 Java 编写的免费产品。其缺点是如果要在 Kubernetes 中将其作为容器运行,那么镜像会很大。一般来说,由于 JRE/JVM 的存在,Java 应用程序不适合容器化。与TeamCity类似的还有一款工具——Bamboo,
4. GitLab CI
它的优势是支持在 Kubernetes 中创建 Runner,如果你的源代码管理工具使用的不是 GitLab,那么不建议 CI 工具选型 GitLab CI。
5. Buddy
如果使用 Buddy,那么对于预置型本地(on-prem)安装,需要按用户数量付费,这可能会非常昂贵,考虑到有许多免费的开源选项,不建议选择 Buddy。
6. TravisCI
它是使用 Ruby 编写的,性能不如 Java,而且本地 / 云(on-premise/cloud)部署选项也很有限。
7. GoCD
这个名字可能会让你觉得它是使用 Go 语言编写的,但实际上它是用 Java 和 Ruby 编写的。同时,它也是一款免费开源软件,支持 Kubernetes 部署。唯一的缺点是不适合在 Kubernetes 中部署 Java 应用程序。
8. Drone
这是一款开源产品,GitHub 上的 Stars 数超过了 2 万,镜像较小。它使用 Go 语言编写,支持云、本地和 Kubernetes 部署,尤其适合运行在 Kubernetes 上,并能与 Kubernetes 进行很好的集成。Drone 没有明显缺点,如果硬要说一个的话,它的示例 / 官方文档还不是很完善。
9. Spinnaker
这是由 Netflix 创建的开源产品,支持多云。在功能方面基本没有缺点,唯一遗憾的是在 Kubernetes上进行本地试运行部署,它需要拉取很多镜像,安装起来非常缓慢,并且它是用 Java 编写的。
10. Buildbot
这是用 Python 编写的,易于阅读,性能不如比 Java/Golang,Stars 比其他选项少,主页的 UI 也不是很好。
结论
最后,总结一下关于 CI 工具选型的内容。
对很多人来说,CircleCI 或 TravisCI 已经足够好了,也没有很大的缺点。
而对于那些追求敏捷和快速的人来说,http://Drone.io 可能更适合,因为它易于安装、配置、使用,它能灵活地部署在本地并能在云上使用,适合更广泛的受众。同时它是开源的,在 GitHub 上很受欢迎,也有很好的社区支持,并且它具有云原生 /12 要素应用(cloud-native/12-factor-app)的属性:镜像小、设置迅速、用 Golang 编写,与 Ruby/Python 等编写的某些选项相比,具有更高的性能。
不过,对于大多数人来说,Jenkins 仍然是一个不错的选择,因为它非常灵活,可以弥补配置方面的相对复杂性。尽管 Jenkins 使用的是 Java,不适合在 Kubernetes上运行,但与其他选项相比,它并不差。如果你使用 Jenkins 有痛点的话,可以尝试 Travis/Circle/Drone。