前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不甘寂寞的Jenkins:从持续集成到持续部署

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

作者头像
yuanyi928
发布2018-04-02 14:35:06
1.3K0
发布2018-04-02 14:35:06
举报
文章被收录于专栏:EAWorldEAWorldEAWorld

众所周知,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的金融云的技术方案、架构设计和技术原型工作。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 EAWorld 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档