返回 登录
0

不甘寂寞的Jenkins:从持续集成到持续部署

阅读2990

众所周知,Jenkins是最常用的持续集成工具,但是我的工作一直和持续集成没有关系,所以也很少去关注Jenkins的动向。

但是两个月前的一则新闻引起了我对Jenkins的高度关注。

图片描述

Jenkins开始做CD了,而CD也是我们普元数字化企业云平台的关键功能之一,Jenkins怎样做CD,值得我们关注和借鉴。

其实这次分享拖的有点久,不过,还好现在用Jenkins 2.0的还不算多,所以现在谈这个还不算太晚。

在展开今天的话题之前,首先明确下几个概念。

图片描述

CI,持续集成。

图片描述

CD,这个概念就容易引起混淆了,因为CD这个缩写代表了两个短语,一个是Continuous Delivery,如上图;一个是Continuous Deployment,如下图:

图片描述

两者的区别就是,部署到生产环境这一步骤,是手工的,还是自动的。

这一步骤是手工还是自动,差异比较大,要达到自动部署到生产这一目标,除了要把这一步骤之前的流程都做到位,还要把金丝雀测试、蓝绿部署、滚动升级、故障回退等流程也做好,虽然只是一步之差,整个软件的过程的成熟度是天壤之别。

那么Jenkins 2.0的CD,指的是Continuous Delivery,还是Continuous Deployment呢?其实大多数地方指的是Continuous Delivery,但是我们这里把要求放的高一些,我们把目标定为Continuous Deployment,并尽可能的做到。

除了CI和CD,还有一个比较重要的概念,就是Immutable Server,中文一般翻译成不可变服务器,也有的地方叫Immutable Infrastructure,都是一个意思,如下图:

图片描述

就是在应用升级时,不去在现有OS上升级应用,而是把应用老版本和现有OS的实例一起销毁掉,然后重新部署一套新的。

这种方式的好处是,避免一直在一个OS上升级应用、改配置,时间长了,环境就乱了,尤其现在基本上都是集群环境,一个集群里各个节点的配置不一样,会给运维工作带来很多困扰。

但是这种方式在虚拟机时代是很不实际的,为了升级一个几MB或者几十MB的应用,要把几GB甚至几十GB的OS,一起销毁了再重新部署,用户不大容易接受。

用了容器之后,这种方式就很容易实践了,容器内的OS基本上只是应用在Userspace的依赖,Overhead很小,发布整个容器镜像和发布应用的开销差不太多。

马丁福勒那边也提过Immutable Server,马老的意思是,不光是升级应用的时候要销毁重发,改配置的时候也要销毁重发,即完全不可以改!

我感觉马老这个提法有些极端,具体怎么做还是要看平台对配置的管理能力,不一定就是完全不可以改,但是发布新版本的时候,变动比较大,还是销毁重发的好,所以我感觉上面那个提法比马丁福勒这个要好一些。

概念明确之后,后面的事情就简单了,以前我们用Jenkins,是这个样子。

图片描述

经常会遇到这种问题……

图片描述

因为类似Puppet这种过程化的脚本,与环境耦合性比较强,一旦有预计不到的环境差异,脚本运行很容易出错,写脚本的时候需要考虑的特别周全,可是百密必有一疏

其实这就是Immutable Server想要避免的问题。

现在Jenkins支持在CI阶段进行Docker Image的Build,我们可以借助Docker实现Immutable Sever的理念。

图片描述

由于Docker容器运行时和外部环境的依赖比较小,而我们还可以依赖CoreOS这类面向集群环境的Linux发行版,实现容器外部环境的统一,这样就将应用的发布过程简化为容器镜像的拉取和运行,避免了去运行容易出错的过程化脚本。

这里引申出一个容器时代相当重要的理念。

图片描述

面向结果集,大家都知道,编程有面向过程和面向对象,还有一种就是面向结果集,最典型的就是SQL语句:只需要告诉数据库你需要什么样的数据,不需要告诉数据库如何获取这些数据,当然少数场景下还是需要写一些Hint引导数据库做出正确的路径选择,但是大多数情况下,数据库还是能自动完成的。至少Oracle在这块做的非常好。

K8s文档的开篇,也特别强调了这点,不需要定义如何从状态A、到状态B、到状态C的流程,只需要定义状态C是什么样子就行了,平台会自动帮你将状态A转化为状态C,至于怎么转换的,不必去关心。

这是容器平台的重要特性和理念,对于那些认为K8s没有过程化的Orchestration能力是个缺陷,想给它补一个上去的人,我只想说,这个行业太浮躁了,连人家文档的第一页都没看完,就挑人家毛病……

再回到Jenkins,在2.0版本种,可以使用DSL定义发布流程,Jenkins把这个叫做Pipeline,借助Docker插件可以直接发布Docker Image。

图片描述

图片描述

还提供比较友好的UI。

图片描述

镜像提交到Docker Registry了,后面就很容易和K8s做整合了,这样就初步完成了CD流程,持续部署的那个CD。

图片描述

Jenkins还提供了API用于界面集成,目前还不太好用,坑比较多,但是都被我们的研发想办法填了,效果如下图:

图片描述

左边就是普元数字化企业云平台的CI/CD流程界面,和Jenkins的后台不太一样,这里是从单个项目和参与者的视角展现的。

下面这张图是数字化企业云平台的整体流程。

图片描述

普元云计算专区:http://primeton.csdn.net/m/zone/primeton/index#

普元公众号:

图片描述

评论