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

Posted EAWorld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不甘寂寞的Jenkins:从持续集成到持续部署相关的知识,希望对你有一定的参考价值。



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


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


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

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


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


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


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

CI,持续集成。


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

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


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


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


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


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


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


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



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


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


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


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


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


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


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


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

经常会遇到这种问题……


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

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


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


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


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

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


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


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


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


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


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


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


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


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


还提供比较友好的UI。


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


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


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


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


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


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


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


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


今天的分享就到这里,谢谢大家!



宋潇男

EAII-企业架构创新研究院 专家委员

现任普元云计算架构师,曾任华为云计算产品技术总监。曾负责国家电网第一代云资源管理平台以及中国银联基于OpenStack的金融云的技术方案、架构设计和技术原型工作。

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


关于EAII

EAII(Enterprise Architecture Innovation Institute)企业架构创新研究院,致力于软件架构创新与实践,加速企业数字化转型。


eaworld是EAII的官方微信账号。


以“企业数字化变革中的技术与架构创新”为主题的PWorld 2016大会即将召开!来自普元、红领集团、蓝月亮实业、星环科技的20余位技术大咖、近30场技术分享与你共议企业数字化未来!大会已于8月26日北京举行将于9月6日上海9月20日广州地举办,感兴趣的可以扫二维码了解活动报名参与,欲了解详情请戳:阅读全文



以上是关于不甘寂寞的Jenkins:从持续集成到持续部署的主要内容,如果未能解决你的问题,请参考以下文章

1.GitLab和Jenkins 结合构建持续集成(CI)环境

GitLab+Jenkins结合构建持续集成(CI)环境

持续集成jenkins工具使用之部署

Jenkins+SVN+Maven持续集成一键部署环境

Jenkins—— Jenkins+Docker+SpringCloud微服务持续集成

如何在CentOS下安装部署Jenkins持续集成环境