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

众所周知,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的后台不太一样,这里是从单个项目和参与者的视角展现的。

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

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

关于作者:

宋潇男

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

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

原文发布于微信公众号 - EAWorld(eaworld)

原文发表时间:2016-09-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玉树芝兰

如何用正确的姿势发微信群通知?

人数众多的微信群里,你如何管理通知发放进度?想不想使用更高效的办法发通知?本文推荐给你一款小程序,帮助你轻松搞定微信群通知。

21510
来自专栏Java架构

跳槽必看!一位程序猿面试蚂蚁金服后端的经验总结!前言自我介绍最近的项目经历总结

32650
来自专栏强仔仔

基于web的IT技术论坛

一.基于web的IT技术论坛设计目的及任务 利用当下流行的SSM(Spring,SpringMVC,Mybatis)框架,并运用maven进行项目管理,实现基...

358100
来自专栏程序人生

你的Project Starter在哪里?

今早看到一个github repo,hackathon starter。它是一个nodejs的project starter,帮助你快速建立项目原型。 ? 它提...

349100
来自专栏开源项目

易学好用的编程教程资源汇总 | 码云周刊第 46 期

码云推荐 对于技术达人来说,广纳知识点是进步的源泉。通过阅读技术文章我们可以学到很多东西,既可以学到业务技能,又可以了解行业动态,最不济,也锻炼了阅读和学习...

29560
来自专栏顶级程序员

2018年4月份GitHub上最热门的Java项目

4 月份 GitHub 上最热门的Java项目排行已经出炉啦,在本月的名单中,也有新面孔出现,如蚂蚁金服开源的基于 Spring Boot 的研发框架 SOFA...

16740
来自专栏cloudskyme

虚拟化技术(2)——存储虚拟化

存储虚拟化 随着存储的需求呈螺旋式向上增长,公司内的存储服务器和阵列都无一例外地随之成倍增长。对于这种存储管理困境的一种解决办法便是存储虚拟化。存储虚拟化可以使...

51360
来自专栏FD的专栏

Effective Testing with RSpec 3(介绍)

我们的测试再次被打破!”“为什么套件需要这么长时间才能运行?”“无论如何,我们从这些测试中获得了什么价值?”

14120
来自专栏杨建荣的学习笔记

通过addm分析io问题(r2笔记64天)

昨晚在做测试环境数据迁移的时候,遇到了io的问题,本来预计2,3个小时完成的数据导入工作最后竟然耗了7个多小时。在数据的导入中,使用了10个并行的sessio...

27360
来自专栏SDNLAB

网络功能虚拟化系列:NFV的开源软件包

本文系SDNLAB社区译者计划发布文章,SDNLAB将与国外优质媒体和个人进行长期的内容合作,带来更多的优质技术文章,本文是<<网络功能虚拟化:新兴的虚拟化网...

37680

扫码关注云+社区

领取腾讯云代金券