新的一年,开始研发新的产品。由于新团队成员,所以需要构建一套持续集成平台。

我从事的是开源软件事业,所以需要访问互联网上面大量的软件包,每天都有上百个容器的创建和销毁,一切都是为了自动化,更高效率的交付产品。让大家专注工作于正确的方向上,更快的迭代产品,专注coding,而不会被固定的流程化操作的打断工作进度。

说几点需求点

  • 办公网络慢、导致编译效率低?
  • 无本地仓库,构建程序效率低下?
  • 很多资源无法访问?
  • 通过VPN可以直接访问公司内网?
  • 灵活的代码版本管理仓库?
  • 自动化构建、测试、发布?
  • 开发专注于coding

如何提速

  • 升级公司机房网络带宽,提升,比如:50M
  • 使用本地仓库,提高构建效率
  • 无法访问国外资源,通过架设VPS
  • 无时无刻进入工作状态,提供访问公司内网的穿透工具
  • 选择一个灵活的源码管理工具
  • 建立一个持续集成平台,自动化完成代码的构建,测试,发布,预览
  • 优化整体流程,避免重复的劳动,尽量自动化
  • 让开发专注于coding、review中
  • 通过容器技术来统一运行环境,减少基础环境重复构建的麻烦
  • 通过容器技术,持续得发布版本,动态回滚
  • 统一的源码版本管理机制,每个发布的版本,具备可回溯性

注意: VPS比较敏感,其实就是一句命令的事,只要你有国外的服务器。:> 私我

如何选型

在构建这些基础环境之前,你需要有一个完整的研发计划,涉及哪些技术栈分析。

1 技术栈

语言方面:JAVAnodejsJavaScript为主,自动化部分使用PythonShellgroovy、ruby。

构建工具:ant、maven、ivy、gradle、sbt、npm、git

技术框架:Angular、Spring Boot、BootStrap、Jquery

支持系统:Ubuntu、centos、redhat

2 资源列表
  • 内网私服,提供各种package快速访问
  • 容器,提供定制的操作系统版本
  • 持续集成服务器,完成代码的自动化pull、build、test、run、push
  • 源码服务器,提供源代码托管
  • 容器镜像服务器,提供本地定制化容器镜像存储服务
  • 虚拟化测试集群,提供自动化测试所需资源

需要5台服务器,若干台测试服务器。

私服,可以通过虚拟化服务器提供,底层最好提供raid容错,防止硬盘损坏数据丢失。

容器,提供本地容器平台,可以自动去中央仓库同步没有的容器镜像。

虚拟化,参考:我为什么弃用OpenStack转向VMware vsphere

以上服务器都可以使用云主机,针对私服、源码服务器、镜像服务器底层存储使用云硬盘(带有分不知容错的存储软件),保障数据安全。其他服务器随意使用虚拟机即可。

使用5台服务器,组成一个集群,初步具备基础硬件资源,可以开始搭建软件资源。

3 技术选型

根据技术栈和所需要的资源列表,我们完成技术选型的工作。

对于持续集成平台,涉及大量的环节,我们需要优化的点很多,下面我们先完成技术的选择。

  • 持续集成工具,选择Jenkins
  • 容器技术,选择Docker
  • 灵活的代码版本管理工具,选择GitLab
  • 镜像管理工具,选择harbor
  • 私服,选择Jfrog
  • 虚拟化,选择vmware vsphere、openstack
  • 源码二进制管理,选择Apache
  • 任务追踪管理,选择Jira
  • 团队协作,Confluence
  • 自动化运维工具,选择SlatStack、puppet

由于我们参与的软件是apache项目,所以我们使用Atlassian全家桶。

同质化的产品也非常的多,我选型的过程中调用过很多软件,目前非常可喜的是大部分软件都提供Docker安装预览,可以体验一下功能,我主要还是选择主流的软件,或者用户体验非常好的产品,可以帮助我节省时间,毕竟我们主要的精力是研发产品。

经过使用很多软件,大浪淘沙,最后剩下的都是精品。

把这些软件很好的串联起来,可以完成企业持续集成平台的构建工作。

我们内部还有一套自动化构建各种平台的软件包框架,一键构建rpm、deb软件包。还提供通过docker自动化测试软件包的正确性、一键发布软件包到线上,可以很好的把持续集成平台串联起来。

通过定制Ubuntu、Centos不同版本的Docker镜像,直接自动化传参数启动不同的docker系统版本进行流水线式的自动打包发布,测试。

通过钩子程序,发现有代码更新自动化的拉取最新合并的代码构建、测试、生成测试报告,邮件反馈给开发此功能的开发人员。