了解当下主流的 CI/CD 方案

开始之前

最近,项目节奏放缓,有了一定的空闲时间。所以呢,很早之前就想把 CI/CD 集成到现有项目中去的想法终于可以尝试一下了,同时,也算是为以后的系统完善先探探路。。。

先明确一下,我的开发工作目前处于一种什么样的环境下,即工作环境说明:

  • 版本管理系统:Git
  • 版本管理模型:Git Flow
  • 代码托管服务:Bitbucket(内网服务器)
  • 日常办公环境:JIRA + Hipchat + Bitbucket
  • 应用服务部署:[ServerApp(Golang) + DB_Cluser(MongoDB) + Caddy …] -> Docker + 前端代码和静态资源
  • 监控服务平台:cAdvisor + InfluxDB + Grafana

了解了工作环境的分布情况后,对 CI/CD 方案的选型也将有了更加明确的目标:

  • 支持本地部署的方式(因为不会把代码放到公有云上托管呀)
  • 原生 Docker 支持(或支持 Docker 运行)
  • 有社区版,开源(因为现在只是做测试用,所以从最实际的需求出发:不收费)
  • 服务打包发布到 Private Docker Registry
  • 最后,这个 CI/CD 平台最好有权限管理功能,因为你做好交付给别人使用时并不能保证她们不会乱点、乱按呐!😂 …

需求上整明白了,在来看看一个项目要引入 CI/CD,一般情况下要具备什么样的条件呢?

可选的工具链

一个项目要引入CI/CD(持续集成与持续交付),一般情况下需要具备以下几个条件:内容摘自(感谢作者🙂)

  • 源码管理仓库:可以是类似分布式的Git、集中式的SVN。
  • 搭建CI平台:使用业界流行的CI软件(如Jenkins,Gitlab CI)搭建的CI系统平台。
  • 源码质量管理平台:主要是指静态代码分析与测试覆盖统计,如业务比较流行的SonarQube,CheckStyle,FindBug等。
  • 单元测试:项目组的每个成员都需要编写单元测试代码,并严格遵守约定的单元测试相关规范。
  • 集成测试:包括可自动化执行的测试用例管理(编写、归档等),集成测试环境自动化搭建。
  • 测试环境搭建自动化:主要是指可以自动化的部署集成测试环境,为集成测试、验收测试准备可用的测试环境。
  • 软件发布平台:为可交付的软件提供对外发行及展示的平台,如基于Nexus的maven仓库、用于托管docker镜像的镜像仓库、NPM私有仓库等。

目前,有一些条件还未满足,或者说完成的不彻底,后边继续完善,先来实践一下 CI/CD 吧!

CI/CD 平台分析

先来看一张图 (图片来源)

满足上面条件的:Jenkins,Gitlab CICD, Go CD,Flow CI,其中 Flow CI 暂时不考虑使用。再者,还有一个作者图里没有提到,即 Drone, 详细说明在后面给出

接下来对各个平台做个简要介绍,更加详细的内容可在其官网或 Google 上查阅.

Jenkins

Jenkins 是 CI 市场中最知名且最常见的名号之一, Java 编写。其特点有:

  • 功能:自动构建、测试及部署任务…
  • 价格:免费
  • 安装:Windows、Mac OSX 以及各类 Unix 系统,可以使用本机系统软件包以及Docker进行安装,也可在安装了Java Runtime Environment(JRE)的任何机器上独立安装。
  • 优势:插件丰富,提供了超过1000款插件选项,可以集成几乎所有市场上可用的工具和服务。
  • 挑战:作为一款开源工具,有提供了丰富的插件选项,因此可以选择性的定义适合自身的解决方案,这就需要投入一定的时间和精力去研究了。
  • UI界面:较古老
  • 以及其他未了解到的特性…

总结:开源、免费的 CI 解决方案,可按自身需求定制方案,但有学习成本。

查阅到的相关资源链接:

Drone

Drone Drone is a Continuous Delivery platform built on Docker, written in Go。

  • 特点:原生 Docker 支持
  • 价格:有社区版,免费
  • 安装:支持本地部署
  • 仓库:Github, Gitlab, Bitbucket 以及 Gogs 等
  • 优势:Drone 引入pipline 的概念,整个build过程由多个stage组成,每一个stage都是docker
  • 缺陷:当前版本:V0.9.0
    • 作者是一个人开发的项目,API 暂时还不稳定,且文档不完善, 可能在使用过程中会踩到一些坑,这个时候就需要翻一下 drone 的 discuss forum 以及 Github issue list
    • Plugins 不太丰富,许多时候可能需要自己定义(shell,python…)
    • Web UI 简单,还有许多需要完善的地方

总结:总体来说,Drone 还很年轻,但发展前景不错而且原生支持 Docker, 社区也很活跃,有吸引到我。So, 决定先体验下 Drone。 其他方案先 Delay!

查阅到的相关资源链接:

GitLab CICD

该方案先 Delay.

查阅到的相关资料链接:

Golang基于Gitlab CI/CD部署方案

Go CD

该方案先 Delay.

See Also

Thanks to the authors 🙂