原文出自:http://os.51cto.com/art/201601/504846.htm

有了Jenkins,为什么还需要一个独立的部署系统?

现在已经有Jenkins,它自身提供了丰富的部署插件(如WebSphere部署插件、Tomcat部署插件等),方便用户直接把构建出来的部署包自动化部署到指定机器(甚至云服务)。那为什么不可以围绕Jenkins,集成一系列部署流程,从而不需要额外搭建一个独立的部署系统?

持续交付与部署系统

上面提出了一个非常好的问题,但是要回答这个问题,我们需要从更大的视角(即持续交付)来理解一个部署系统需要扮演的角色,而不仅仅从自动化部署过程这一点(尽管这一点也非常重要)来理解它。首先,让我们看看软件生产中从代码到最终服务的典型流程(如下图)。

从上图中可以看出,从开发人员写下代码到服务最终用户是一个漫长过程,整体可以分成三个阶段:

1.从代码(Code)到制品库(Artifact):这个阶段主要对开发人员的代码做持续构建并把构建产生的制品集中管理,是为部署系统准备输入内容的阶段。

2.从制品到可运行服务:这个阶段主要完成制品部署到指定环境,是部署系统的最基本工作内容。

3.从开发环境到最终生产环境:这个阶段主要完成一次变更在不同环境的迁移,是部署系统上线最终服务的核心能力。

如果从持续交付角度看,其最核心诉求就是要让上图三个阶段能够无缝连接并自动化运行起来,从而达到持续交付的两个核心目标:提高交付频率(部署次数)和降低部署延时(从代码提交到上线的时间差)。

持续交付对部署系统的要求

参照如上持续交付的流程,可以发现持续交付对于一个部署系统的要求绝对不仅仅是一个自动化的部署过程,这也是在有了Jenkins和其相关部署插件后仍然需要搭建独立部署系统的原因所在。具体来说,我们可以从下面几点分析:

1.解耦构建和部署过程

尽管持续交付希望自动化完成从代码到部署上线的整个流程。但是整个持续交付过程有多个不同角色的人参与其中(开发、测试、运维甚至还有经理及市场人员)。其中,有些角色(如开发/测试)需要关心构建过程,而更多的角色(如运维等)绝大时候都是从制品开始部署工作。这也就要求构建和部署过程相互解耦,能够独立操作。

如果基于Jenkins直接触发部署,要直接绑定构建和部署过程。构建和部署这两个过程通过制品(Artifact,又称为部署包)连接(制品是构建过程的产出,同时是部署过程的输入)。如果它们相互解耦,自然就需要有统一的地方管理存储和管理这些制品,即统一制品库。

有了统一制品库后,构建过程自动提交产生的制品到此,而部署过程则主动到制品库拉取需要的制品进行部署,从而实现构建和部署的完整解耦。

2.管理复杂的部署环境

如前所述,服务上线需要涉及到很多不同目的环境(开发、测试、预发、生产、演示等)。而且,在越来越多的云化基础设施中,环境内部的资源会频繁变化(例如,Auto-Scaling时刻都有可能添加或者减少你的云主机)。

这时候需要对部署流程隔离部署环境差异以及环境内频繁变化的基础设施。当需要执行一个部署时,操作人员只需要指定部署到哪个环境(即环境名称或者ID号),而不需要关心环境内部的任何信息。

由部署系统负责把部署请求分发到指定环境内的每台主机并自动执行。如果基于Jenkins来直接部署,则必然把环境管理的很多复杂度引入到部署流程内部。

3.支持多种部署策略

为保障服务的高可用,落实部署和发布的解耦以及其他业务需要,用户常需要支持如灰度发布、A/B测试发布等部署需求。一个独立的部署系统在此可以提供多种部署策略,并结合环境管理等其他功能满足业务上对部署和发布的各种需求。同样,Jenkins及其部署插件并没有提供这样的能力。

4.落实部署流程规范

在一个公司内部经常有不同的项目,使用不同的编程语言,而部署流程也五花八门。从控制风险,减少重复操作,降低部署自动化难度等多重考量,公司都倾向制定一套标准的部署流程。

这时候,独立的部署系统就可以帮助用把这些规范落实下去并在日常的部署过程中时刻校验(在软件工程领域,几乎所有的规范落实都得靠工具来助一臂之力,否则基本都会变成纸面上的规范而已)。

如果基于Jenkins来直接部署,如何落实这些部署规范仍然是一个很困难的事情,因为Jenkins及其部署插件并未对此提供任何实质性的支持。

5.获取部署运营数据

部署是一个团队从代码到服务的关键路径,这上面的所有操作数据都值得记录并用于各种运营支持(包括安全审计、部署记录查询、部署频率和失败率分析等等)。基于Jenkins直接部署当然也可以获取这些数据,但是把它做在独立的部署系统内会更灵活和方便。

6.让部署操作服务化

如之前提到,部署不仅仅开发和测试人员需要,要努力让部署服务化,从而让团队内任何一个人都可以随时触发一次部署。Jenkins的操作界面对于开发或者测试人员可能还比较方便,但是对于其他人员来说则过于复杂(而且对于部署操作也不友好)。独立部署系统可以在这方面做得更好,帮助更多的人低门槛完成部署操作。

当然,除了上面列出的这些原因外,独立部署系统还有其他一些优势(如方便部署版本管理等),这里就不一一列举。通过如上分析,我希望大家对于一个独立部署系统的优势以及它需要包含的内容能有一个整体理解。

当然,你可能会说“我正在按照上面的这些要求、基于Jenkins做自己的部署流程”。如果真是这样,那恭喜你!其实你已经走在构建一个独立部署系统的路上,而它和Jenkins的关系其实已经不大,或许你还可以考虑把这套系统对接其他构建系统(如CruiseControl、TeamCity等)。

写在最后

如前所述,一个独立的部署系统需要包括的内容是非常丰富的(绝对不仅仅是Jenkins部署插件要做的那些事情)。如下图所示,部署系统需要连接项目中涉及的人、环境、制品库以及构建环境等,只不过这种连接的目的是打通从制品到最终服务的整个流程(即本文之前持续交付流程中的第二及第三阶段)。

Jenkins系统+独立部署系统的更多相关文章

  1. 有了Jenkins,为什么还需要一个独立的部署系统

    需不需要一个独立的部署系统是很多企业用户在构建持续交付流程中经常困惑的一个问题.也经常有用户会问我们,现在已经有Jenkins,它自身提供了丰富的部署插件(如WebSphere部署插件.Tomcat部 ...

  2. .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统

    .NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言     相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...

  3. .NET 半天搭建Jenkins持续集成与自动化部署系统

    前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由 ...

  4. 【EasyCi】持续集成交付,一键式自动化部署系统,开箱即用

    前言 本人是一家互联网公司的java开发,由于公司初期公司未招运维人员,恰好我对linux比较熟悉,便在公司服务器搭建了一套Jenkins.Gitlab.Maven私服.Docker私服.Sonarq ...

  5. [官方软件] Easy Sysprep v4.3.29.602 【系统封装部署利器】(2016.01.22)--skyfree大神

    [官方软件] Easy Sysprep v4.3.29.602 [系统封装部署利器](2016.01.22) Skyfree 发表于 2016-1-22 13:55:55 https://www.it ...

  6. Jenkins:VMware虚拟机Linux系统的详细安装和使用教程

    jenkins:VMware虚拟机Linux系统的详细安装和使用教程 (一) 不是windows安装虚拟机可跳过 1.Windows安装VMware 2.VMware安装linux系统 3.windo ...

  7. .NET Core实战项目之CMS 第十七章 CMS网站系统的部署

    目前我们的.NET Core实战项目之CMS系列教程基本走到尾声了,通过这一系列的学习你应该能够轻松应对.NET Core的日常开发了!当然这个CMS系统的一些逻辑处理还需要优化,如没有引入日志组件以 ...

  8. centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解

    centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...

  9. 企业实战|基于Cobbler实现多版本系统批量部署

    前言 运维自动化在生产环境中占据着举足轻重的地位,尤其是面对几百台,几千台甚至几万台的服务器时,仅仅是安装操作系统,如果不通过自动化来完成,根本是不可想象的.记得前面我们探究了基于PXE实现系统全自动 ...

随机推荐

  1. bootstrap基础学习二篇

    这篇学习网格系统(Grid System) Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 1.网格选项: ...

  2. boost实用工具:typeof库 BOOST_TYPE BOOST_AUTO

    boost::typeof库中使用宏BOOST_TYPE和BOOST_AUTO来模拟C++11关键字typeof和auto  C++ Code  123456789101112131415161718 ...

  3. Socket 进行发送

    最灵活的通信方式还是Socket ,TcpClient和Tcplistener只是对Socket进行了一些包装,从而使他们使用起来更简单一些 给出同步的服务器端 static void Main(st ...

  4. C语言数组的概念

    在<C语言数据输出大汇总以及轻量进阶>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include <std ...

  5. php做图片上传功能

    今天来做一个图片上传功能的插件,首先做一个html文件:text.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  6. iOS 判断某一日期是否在一日期区间

    -(BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate { if ([date comp ...

  7. Mybatis中oracle如何批量insert语句

    <insert id="batchInsertNoticeUser" useGeneratedKeys="false" keyProperty=" ...

  8. 160512、nginx+多个tomcat集群+session共享(windows版)

    第一步:下载nginx的windows版本,解压即可使用,点击nginx.exe启动nginx 或cmd命令 1.启动: D:\nginx+tomcat\nginx-1.9.3>start ng ...

  9. PHP之冒号、endif、endwhile、endfor 是什么鬼?f

    解释:其实这些都是PHP的语法,只不过不常用而已,这些都是PHP流程控制的替代语法. 冒号(:)相当于是 左大括号---->{ endif.endwhile.endfor.endforeach- ...

  10. shell awk实战

    一.文本处理 1.按行提取关键字频次(如取第5列) awk 'BEGIN{FS="|"} {a[$5]+=1;} END {for(i in a) print i ":& ...