一种程序的部署方法与流程

文档序号:13934072阅读:192来源:国知局
一种程序的部署方法与流程

本申请涉及计算机程序的处理领域,尤其涉及一种程序的部署方法。



背景技术:

目前,对于计算机程序开发已经越来越系统化和规模化,这就导致了大量的计算机程序需要进行相应的部署。所述的部署就是将程序及其运行环境安装到指定的物理机上。所述的物理机是具有数据计算处理能力的计算机或智能设备。

在现有技术中,程序的部署方式主要分为两种。

第一种方式是现在大多数公司所使用的。使用svn、git等版本控制工具,将需要部署的程序代码获取到。如果是解释型的语言,如php则可以直接将代码发布到生产环境的机器中运行;如果是编译型的语言,如c/c++则需要经过一个编译的过程,编译出可执行文件,然后将该文件发布到生产环境的机器中运行。这种方式的问题在于程序所需的配置文件与程序是互相分离的,有可能造成配置文件与程序不匹配导致故障。同时由于需要精细控制被替换的文件,有时候经常需要替换多个文件,不容易管理,对于开发和运维人员来说,使用成本相对较高,部署效率低下。

第二种方式是将代码与配置统一打包为一个软件包,这样就避免了配置文件与程序不匹配导致的问题,同时该软件包可以既可以安装在测试环境,也可以安装在生产环境,部署起来也比较方便。但是由于测试环境与生产环境存在巨大差异,运行时依赖的库文件,甚至操作系统版本都有可能不一样,所以通过测试环境测试的软件包,在生产环境中运行还是有可能会发生各种各样的问题,故障率较高。



技术实现要素:

有鉴于此,本发明的主要目的是提供一种程序的部署方法,以提高部署效率、降低故障率。

本发明的技术方案是这样实现的:

一种程序的部署方法,包括:

对程序及其运行环境进行从底层到上层的层级划分,依照所述层级关系构建对应层级的镜像,其中上一层级的镜像数量大于等于下一层级的镜像数量;

分层存储所述层级的镜像,标记出层级镜像之间的从属关系;

根据需要部署的程序项目和运行环境,选择并读取对应层级的镜像,将所读取的镜像部署到指定的物理机上。

在一种优选实施例中,所述依照所述层级关系构建对应层级的镜像,具体包括:

构建操作系统对应的干净镜像;

基于所述干净镜像,进一步安装指定的库和指定的工具,构建对应的基础镜像;

基于所述基础镜像,进一步安装指定计算机语言所需的运行时环境,构建对应的语言镜像;

基于所述语言镜像,进一步添加业务代码,构建业务镜像。

在一种优选实施例中,所述基于所述语言镜像,进一步添加业务代码,构建业务镜像,具体包括:

接收到业务代码的提交指令;

获取所述业务代码所基于的语言镜像;

将业务代码从代码仓库中获取到本地;

打包编译所述业务代码;

将可以运行的业务代码植入到所述语言镜像中;

将启动停止脚本植入到所述语言镜像当中;

将植入到所述语言镜像的内容固化为新一层的镜像,该新一层的镜像为构建成功的业务镜像。

在一种优选实施例中,该方法进一步包括:使用项目名加代码版本加时间戳的方式命名业务镜像。

在一种优选实施例中,所述分层存储所述层级的镜像,标记出层级镜像之间的从属关系,具体包括:

计算每个镜像的内容的哈希值,根据该哈希值决定该镜像的存储位置;

对于层级之间具有从属关系的镜像,每个上层的镜像存储其所从属的下一层镜像的哈希值,利用层级之间的哈希值所组成的序列来标记层级镜像之间的从属关系;

所述读取镜像,具体包括:按照所述哈希值所组成的序列,从最上一层镜像开始读取每一层的镜像,得到一个完整的镜像。

在一种优选实施例中,所述选择并读取对应层级的镜像,将所读取的镜像部署到指定的物理机上,具体包括:

a、读取当前需要部署的最高层级的镜像,将该镜像作为当前镜像,执行步骤b;

b、判断当前镜像所基于的下一层镜像是否已经部署在指定的物理机上,如果是,则将当前镜像部署到该指定的物理机上,或者将当前镜像及其上层的镜像部署到所述指定的物理机上;否则执行下一步;

c、判断当前镜像是否为最底层的镜像,如果是则将当前镜像部署到所述指定的物理机上,或者将当前镜像及其上层的镜像部署到所述指定的物理机上;否则,读取当前镜像所基于的下一层镜像,并将该下一层镜像作为当前镜像,执行步骤b。

在一种优选实施例中,在所述构建镜像之前,进一步包括:对当前需要构建镜像的程序及其运行环境进行测试,在测试通过后,再构建对应层级的镜像。

在一种优选实施例中,该方法进一步包括:

利用引用计数标记镜像被引用的次数,当收到对某一镜像的删除指令时,先判断该镜像的引用计数是否为零,如果是则删除该镜像,且将该镜像所从属的下一层镜像的引用计数减1;否则不删除该镜像。

与现有技术相比,本发明采用了基于分层的镜像的部署机制,按照程序及其运行环境进行从底层到上层的层级划分,每一层级都对应有相应的镜像,成功的避免了配置与程序文件管理复杂度,可以方便地在测试环境部署任意版本的程序代码,极大的提高了部署效率,降低了故障率。同时,在测试环境下经过测试的程序及其运行环境同样也可以被构建成对应层级的镜像,并可以将各个层级的镜像完整地部署到生产环境中,从而使得生产环境和测试环境一致,进一步降低了生产环境的故障率。

附图说明

图1为本发明所述程序的部署方法的一种流程示意图;

图2为一种层级镜像的分层示意图;

图3为本发明所述镜像的生命周期示意图;

图4为本发明所述存储镜像的登记组件及存储设备的示意图;

图5为本发明所述镜像的一种状态说明示意图。

具体实施方式

下面结合附图及具体实施例对本发明再作进一步详细的说明。

图1为本发明所述程序的部署方法的一种流程示意图。参见图1,该方法主要包括:

步骤101、对程序及其运行环境进行从底层到上层的层级划分,依照所述层级关系构建对应层级的镜像,其中上一层级的镜像数量大于等于下一层级的镜像数量。

步骤102、分层存储所述层级的镜像,标记出层级镜像之间的从属关系。

步骤103、根据需要部署的程序项目和运行环境,选择并读取对应层级的镜像,将所读取的镜像部署到指定的物理机上。

图2为一种层级镜像的分层示意图。参见图2,本发明所述对程序及其运行环境进行从底层到上层的层级划分,依照所述层级关系构建对应层级的镜像,具体可以包括:

步骤201、首先,构建操作系统对应的干净镜像。也就是说先构建一个只带有操作系统的干净镜像,将操作系统固化下来,这是一种最基本最底层的一种镜像。可以根据操作系统的不同,构建不同操作系统版本的干净镜像,例如构建windows操作系统的干净镜像,尤其可以针对windows各个版本的操作系统构建对应的干净镜像,还可以构建linux操作系统各个版本的干净镜像。当然这些各个版本的操作系统对应的干净镜像都是属于同一层级的镜像,属于最基本最底层的镜像。构建出该干净镜像后,就可以计算该干净镜像的内容的哈希值h1,将该哈希值h1作为该干净镜像的唯一标识,根据该哈希值h1决定该干净镜像的存储位置,并将该干净镜像存储到指定的存储位置。

步骤202、其次,如图2所示,基于上述干净镜像,进一步在所述干净镜像上安装指定的库和指定的工具,构建对应的基础镜像。例如可以将实际需要的运行时的库以及必要的生产工具安装到所述干净镜像中,比如监控系统相关的组件、批量管理的工具等,安装后将所安装的内容构建出一个内部通用的基础镜像。构建出基础镜像后,也需要计算该基础镜像的哈希值h2,将该哈希值h2作为该基础镜像的唯一标识,根据该哈希值h2决定该干净镜像的存储位置,将该基础镜像存储到指定的存储位置,同时要存储该基础镜像所基于的所述下一层的干净镜像的哈希值h1,即该基础镜像要记录h2+h1。

步骤203、再次,基于所述基础镜像,进一步在该基础镜像上安装指定计算机语言所需的运行时环境,比如针对java/nodejs/python/php等语言所需的运行环境,构建对应的语言镜像。构建出语言镜像后,也需要计算该语言镜像的哈希值h3,将该哈希值h3作为该语言镜像的唯一标识,根据该哈希值h3决定该语言镜像的存储位置,将该语言镜像存储到指定的存储位置,同时要存储该语言镜像所基于的所述下一层的基础镜像的哈希值h2,即该语言镜像要记录h3+h2。

步骤204、最后,基于所述语言镜像,进一步添加具体的业务代码,构建出业务镜像。所述具体的业务代码就是具体的应用程序的代码。构建出业务镜像后,也需要计算该业务镜像的哈希值h4,将该哈希值h4作为该业务镜像的唯一标识,根据该哈希值h4决定该业务镜像的存储位置,将该业务镜像存储到指定的存储位置,同时要存储该业务镜像所基于的所述下一层的语言镜像的哈希值h3,即该业务镜像要记录h4+h3。.

通过上述过程,可以看到,所述分层存储所述层级的镜像,标记出层级的镜像之间的从属关系,具体就是:

计算每个镜像的内容的哈希值,根据该哈希值决定该镜像的存储位置,一个哈希值对应的镜像只存储一个,即如果一哈希值对应的镜像已经被存储过,则无需重复存储;

一个完整的镜像由多层构成,对于层级之间具有从属关系的镜像,每个上层的镜像存储其所从属的下一层镜像的哈希值,利用层级之间的哈希值所组成的序列来标记层级镜像之间的从属关系。如上所述一个完整的镜像对应的哈希值组成的序列为h4+h3+h2+h1。

当然,在一种优选的实施例中,在上述构建各个镜像之前,还可以进一步包括:对当前需要构建镜像的程序及其运行环境进行测试,在测试通过后,再构建对应层级的镜像。也就是说,当前构建各个镜像的过程也是在测试环境下构建,因此需要对程序及其运行环境进行测试,测试通过后再构建对应层级的镜像,可以降低在把镜像部署到生产环境下导致的故障率。

针对于每个项目的每一版本代码,采用本发明方法的部署系统都会为这份代码构建出一个镜像,该镜像中包含了程序运行所需要的操作系统、环境变量、各种基础库、配置文件以及可执行文件。每当版本控制工具中存储的代码发生变更的时候,便会触发部署系统构建出一个镜像。

下面针对一种优选实施例详细说明所述步骤204中,针对每个项目的每一版本代码,基于所述语言镜像,进一步添加业务代码,构建业务镜像,其具体过程包括:

步骤241、接收到业务代码的提交指令。也就是说,针对每个项目的每一版本代码,只要程序员编写好一个版本的业务代码,并提交了业务代码,都会触发提交指令,采用本发明方法的部署系统接收到该业务代码的提交指令就会触发执行下面的步骤,从而有针对性地构建一个对应的业务镜像。

步骤242、获取所述业务代码所基于的语言镜像。在本步骤中需要判断所提交业务代码所采用的计算机语言的相关参数,然后根据该计算机语言的相关参数去获取对应的语言镜像。例如如果业务代码采用的是php语言,则需要获取php对应的语言镜像。此时,可以首先判断当前物理机上是否存在该语言镜像,如果存在则直接跳到下一步骤,如果没有存在则从存储镜像的存储设备中获取(具体是从如下所述的登记组件中获取)对应的语言镜像,然后执行下一步骤。

步骤243、将业务代码从代码仓库中获取到本地。

步骤245、打包编译所述业务代码。

步骤246、将可以运行的业务代码植入到所述语言镜像中,初始化程序运行时的目录,修改目录权限,添加配置文件等内容。

步骤247、将启动停止脚本植入到所述语言镜像当中。

步骤248、将植入到所述语言镜像的内容固化为新一层的镜像,该新一层的镜像为构建成功的业务镜像。这样一个基于语言镜像的业务镜像就构建完成了。

在构建出镜像之后,为方便存储和管理,需要对镜像命名。在本发明的一种优选实施例中,该方法进一步包括:使用项目名加代码版本加时间戳的方式命名业务镜像。

在本发明的一种优选实施例中,镜像可以利用高级多层的统一文件系统(aufs)来实现分层,使用层级的好处是本发明所有的机器上都可以事先放好比较底层的镜像,如干净镜像、基础镜像等,当部署时,只要把最上面业务的那一层镜像传输到指定物理机上就可以了,可以极大的节省硬盘开销,提升部署效率。因为当所有机器上都预先放好底层的镜像后,当需要部署一个新镜像的时候,只要更新上层有变动的镜像就可以了,不需要更新底层的镜像中的文件,所以可以节省硬盘的读写开销。硬盘的容量节约是通过同一个机器里面多个上层镜像共享同一个底层的镜像来实现的

所述aufs是一种联合文件系统(unionfilesystem),所谓联合文件系统就是把不同物理位置的目录合并挂载到同一个目录中。它允许单独文件系统的文件和目录(称为分支,branches),被透明地覆盖,形成单一的连贯一致的文件系统。在新的、虚拟的文件系统中,原分支里拥有相同路径的目录的内容将在一个单一的合并后的目录中同时出现。一个最主要的应用是,把一张cd/dvd和一个硬盘目录给联合挂载在一起,然后,就可以对这个只读的cd/dvd上的文件进行修改(修改的文件存于硬盘上的目录里)。

所述构建出镜像以后,所述镜像不论是部署到测试环境还是生产环境,都需要从一个集中存储镜像的地方获取到镜像,所以需要一个存储镜像的服务。图3为本发明所述镜像的生命周期示意图。参见图3,镜像从创建存储,到之后部署然后废弃是一个完整的生命周期。本发明的一种优选实施例中,可以使用一个叫做登记组件(registry)的组件来实现镜像的存储。

图4为本发明所述存储镜像的登记组件及存储设备的示意图。参见图4,所述登记组件主要分为两部分,一部分是提供超文本传输协议(http,hypertexttransferprotocol)协议接口的网络服务器(webserver)401,另一部分是用来存储数据的存储器驱动器(storagedriver)402。最下层是具体的存储设备403(如具体的磁盘等存储设备)从而可以实现数据的持久化存储。

所述网络服务器401的http接口主要提供获取、增加、删除、查找镜像的功能,在本发明的一种优选实施例中,使用项目名+代码版本+时间戳的方式命名镜像,当需要部署的时候,会展示给用户所有可以部署的版本的镜像,供用户选择,由于其中有项目及代码版本信息,就可以在登记组件中直接定位到某一个镜像。

存储的时候,由于本发明使用了层级关系的镜像,基础层级的镜像(比如操作系统的干净镜像)只需存储一份就可以了,上层的镜像如果有不同,则每个不同版本对应的镜像都需要存储。

具体的,如上所述,可以根据每个层级镜像的内容做hash,根据该hash来决定存储到存储设备的位置,如果该hash已经被存储过了,则无需重复存储。一个完整的镜像由多层构成,每个上层的镜像会存储下一层镜像的hash值。

当读取镜像的时候,具体包括:按照所述哈希值所组成的序列,从最上一层镜像开始读取每一层的镜像,就可以得到一个完整的镜像。

另外,在另一种优选实施例中,本发明所述的方法还可以进一步包括:在存储以及管理所述镜像的过程中,利用引用计数标记镜像被引用的次数,即每一个镜像在存储的时候都会记录一个引用计数,如果在构建成功某一个新的镜像时,该新镜像所从属的下一层镜像对应的引用计数就要加1。也就是说越是基础的镜像,其引用计数越高。

本发明也可以删除所存储的镜像,当收到对某一镜像的删除指令时,先判断该镜像的引用计数是否为零,如果是则删除该镜像,且将该镜像所从属的下一层镜像的引用计数减1;否则不删除该镜像。这样就可以在删除时采用引用计数的方式回收,当镜像的引用计数为0之后会被删除。

在构建和存储好镜像之后,下面介绍镜像的部署,即镜像的发布。

镜像的部署过程需要用户首先选择需要部署的程序项目与环境(测试环境或开发环境);然后选择需要部署的镜像,由于每个版本的代码都会有一个镜像,这一步其实是在选择发布哪个版本的代码;最后确认部署到物理机就可以触发部署行为了。

如图5为本发明所述镜像的一种状态说明示意图。参见图5,镜像从最初创建开始,然后部署到测试环境中进行测试,只有通过测试的镜像才可以部署到生产环境中,即才可以发布到线上。当需要部署到生产环境中时,就可以从存储的镜像中获取通过测试的镜像进行部署。

上述步骤103中,根据需要部署的程序项目和运行环境,选择并读取对应层级的镜像,将所读取的镜像部署到指定的物理机上,在一种优选实施例中,可以包括以下具体步骤:

步骤a、根据需要部署的程序项目和运行环境,读取当前需要部署的最高层级的镜像,将该镜像作为当前镜像,执行步骤b。例如需要部署业务镜像1,则从存储设备中读取该业务镜像1。

步骤b、判断当前镜像所基于的下一层镜像是否已经部署在指定的物理机上,如果是,则将当前镜像部署到该指定的物理机上,或者将当前镜像及其上层的镜像部署到所述指定的物理机上;否则执行下一步。

例如,在本次执行的步骤b中,当前业务镜像1是最高层镜像,通过读取该业务镜像1的存储的哈希值序列值,可以得知该业务镜像1的下一层镜像的哈希值,假设该下一层镜像是一个php的语言镜像;接着根据该下一层镜像的哈希值判断该下一层镜像是否已经部署在指定的物理机上,如果已经部署,则不需要重复读取并部署,而是直接将当前的业务镜像1部署到该物理机上即可,由于该业务镜像1已经是最高层的镜像,因此只需要部署该业务镜像1即可。如果该下一层镜像还没有部署在指定的物理机上,则执行下一步。

步骤c、判断当前镜像是否为最底层的镜像,如果是则将当前镜像部署到所述指定的物理机上,或者将当前镜像及其上层的镜像部署到所述指定的物理机上;否则,读取当前镜像所基于的下一层镜像,并将该下一层镜像作为当前镜像,执行步骤b。

例如,在本次执行的步骤c中,当前的业务镜像显然不是最底层的镜像,因此读取当前进行所基于的下一层镜像,即从存储设备中读取所述php的语言镜像,并将该php的语言镜像作为当前镜像,重新执行步骤b。

在重新执行步骤b时,由于当前镜像为php的语言镜像,根据其所存储的哈希值序列值,可以得知该php语言镜像的下一层镜像的哈希值,假设该下一层镜像的为一个基础镜像;接着根据该下一层镜像的哈希值判断该下一层镜像是否已经部署在指定的物理机上,如果已经部署,则不需要重复读取并部署,而是直接将当前的php语言镜像及其上一层的业务镜像1部署到该物理机上即可。如果该下一层镜像还没有部署在指定的物理机上,则再重新执行下一步骤c。

在再次执行的步骤c中,显然本php语言镜像还不是最底层的镜像,接着根据下一层镜像的哈希值从存储设备读取下一层镜像,假设下一层镜像为一个基础镜像,将该下一层镜像作为当前镜像,再次执行步骤b。继续执行前述的判断和操作,直到该业务镜像1及其所从属的所有镜像都部署到指定物理机上。

更为具体的,由于镜像本身其实是一组静态的文件,将镜像运行起来之后,就是一个容器(container),container的启动需要依赖dockerengine作为引擎。所述dockerengine是本发明在一种实施例中所使用的将镜像启动为容器的引擎。

下面介绍在一种具体的应用场景中的一次部署镜像的具体操作,该操作包括如下步骤。

步骤601、首先获取到部署所需信息,这些信息包括:镜像id即所述哈希值,容器(container)的数量,每个容器的ip地址以及需要部署到的物理机的ip地址。

步骤602、读取相应所需的镜像,根据物理机的ip地址,并发的将所需镜像传输到物理机中。

步骤603、运行部署之前的一些钩子动作(hook),比如在上游nginx中摘掉部署中的节点,在监控系统中为该节点添加维护状态等。所述nginx是一个负载均衡器,是一个代理服务器,用户所有的请求都是先访问nginx,nginx再调用本发明所述方法的服务来提供服务。这样如果某一台后端的服务挂掉了,nginx还可以及时的把它摘除。

步骤604、根据容器的ip地址将其分为3类:新增、运行中、被删除。

步骤605、直接启动新增的容器。

步骤606、针对运行中的容器,依次先停止正在运行中的,再根据新的镜像将新的容器启动起来,如果是生产环境的部署任务,当第一个节点部署完成后,部署行为会自动暂停,确认服务正常后才可以继续部署。

步骤607、删除刚刚停止运行的容器。

步骤608、删除用户手动确定删除的。

步骤909、运行部署后需要执行的一些hook,比如在上游将该节点添加进来,去除维护状态,运行一遍测试用例等。

本专利主要公开了基于分层镜像的部署机制。依照层级关系,首先构建出一个将程序运行时依赖的操作系统、基础库、环境变量、配置文件以及程序文件都包含在内的下层镜像(其中包括一层或几层);然后将所述下层镜像存储于一个集中存储的服务中,业务代码级的镜像可以直接基于这些下层镜像构建;最后将所构建和存储的镜像,根据需要发布到需要运行程序的机器中,将镜像中的程序运行起来。本发明考虑到现在常用的方案中的不足之处,采用基于分层的镜像的部署机制,成功的避免了配置与程序文件管理复杂、程序运行时环境在测试与生产不一致等问题。本发明还可以方便的在测试环境部署任意版本代码,极大的提高了效率。

另外,本发明的每一个实施例可以通过由数据处理设备如计算机执行的数据处理程序来实现。显然,数据处理程序构成了本发明。此外,通常存储在一个存储介质中的数据处理程序通过直接将程序读取出存储介质或者通过将程序安装或复制到数据处理设备的存储设备(如硬盘和或内存)中执行。因此,这样的存储介质也构成了本发明。存储介质可以使用任何类型的记录方式,例如纸张存储介质(如纸带等)、磁存储介质(如软盘、硬盘、闪存等)、光存储介质(如cd-rom等)、磁光存储介质(如mo等)等。

因此本发明还公开了一种存储介质,其中存储有数据处理程序,该数据处理程序用于执行本发明上述方法的任何一种实施例。

另外,本发明所述的方法步骤除了可以用数据处理程序来实现,还可以由硬件来实现,例如,可以由逻辑门、开关、专用集成电路(asic)、可编程逻辑控制器和嵌入微控制器等来实现。因此这种可以实现本发明所述方法的硬件也可以构成本发明。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1