摘要
传统的虚拟化技术仅提供了从物理机到操作系统级的虚拟化服务,而正在如火如荼发展的Docker容器技术做到了在系统级虚拟化之上,对应用服务进行方便的管理。但是当开发者需要测试和上线Web应用时,由于版本迭代问题,常需要手动进行重新部署。本文基于Docker对于应用服务的快速发布和部署能力,结合已有的jenkins持续集成服务,尝试对Web应用的持续集成进行探究。
正文
持续集成既能够实现代码频繁集成,进行频繁迭代测试,通过频繁构建尽发现问题,从而在保证软件质量的同时加速软件开发的过程。
持续集成不是用来防止代码缺陷的出现,但是它能够在软件开发前期尽早发现代码缺陷,使修复缺陷变得相对轻松简单。
Jenkins就是一个持续集成的开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。其基本工作流程如图1所示,开发者提交代码更新,Jenkins通过钩子监听源码管理工具获取最新代码。根据创建好的Jenkins任务及编写好的执行脚本依次完成代码构建、打包、部署、集成测试过程,最后把构建后的结果包括自动化测试的结果通过邮件发送给相关负责人。
而Docker 是一个基于LXC(Linux Containers)虚拟化技术的高级容器引擎,使用Go语言实现的一种面向云平台的虚拟化技术。它是一款开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。因此它具有启动时间短,空间占用少、分发和复制方便、资源开销少等特点,却具备和传统虚拟机一样的隔离性和安全性。
在这里的代码更新和版本控制过程中,使用Git工具来作为代码同步更新工具。开发人员完成本地代码开发后,先通过命令或Git工具把代码提交到分支上,再将分支代码推送到项目经理处进行代码审核,审核成功后再把代码推送到主干。一旦Git仓库有更新后,Jenkins服务器会拉取新代码进行集成构建。Github的主要工作模式如图2所示。
这里有一个需要注意的是,Docker 跟Jenkins并没有直接的联系,Jenkins是实现自动打包的,打包完也是可以实现自动部署的,并不是没有Docker 就不可以实现自动部署了,这里需要强调一点。之所以用Docker,是因为Docker 是一个相比较而言比较成熟的一种技术,而且它的优势在于,可以实现隔离,可以在不同的操作系统跑应用(Windows,Linux)并且还可以做到日志分离。
传统的Web应用从开发到上线的过程,需要开发者手动将开发好的工程部署到服务器上。在服务器上的相关环境和配置都需要开发者自己动手进行解决,同时需要解决很多形形色色与Web服务本身可能没有太大关系的问题。另外,如果开发者对于开发版本有修改和迭代更新,每次需要手动去在服务器上更新代码,并且如果是一个负载均衡集群的场景下,需要一台一台服务器进行更新代码,这样的工作量是很大的,并且都是重复性的劳动。
在这里,通过已有资料和文献,结合Jenkins和Docker各自的优点,探究两者集成后对Web自动部署快捷性方面的作用,简化Web部署为以下流程:
提交代码
获取代码
构建环境
自动部署
Jenkins是基于Java环境的,因此在宿主机中需要安装Java环境支持,另外,宿主机中还需要安装Git工具和Docker。此处的系统实验环境为Centos7.4。
首先安装Java环境,这里使用Java1.8的版本,查看版本可以看到,具体的安装版本是
并且由于Jenkins需要Tomcat的支持,同时下载Tomcat9的版本进行安装。
接下来下载Jenkins的war包,war包内是Jenkins的所有内容。可以通过直接部署在安装好的Tomcat9中来通过Web形式访问。Jenkins第一次启动需要进行安装,包括其中的Folders Plugin、Script Security Plugin等插件,安装完成后需要进行用户配置,用户名和密码是自定义的。
Git工具是必不可少的,由于对于版本没有太大的要求,可以直接通过自带的yum包管理进行下载,安装git。通过在Github上建立一个测试工程,向此测试工程中更新推送Web服务的代码,Jenkins通过监听指定的Github地址,来自动获取Github上的最新代码,自动执行Shell来调用Docker进行代码到镜像的部署和启动工作。
最重要的是Docker的安装和基础镜像的搭建。由于Centos7中带的yum源中,docker版本已经是比较新的1.12,可以直接通过yum install docker.io来安装。安装完成之后,需要为持续集成部署的Web服务提供一个基础的网站服务器环境镜像,之后的Jenkins工作可以直接基于此已有的基础镜像来进行。
由于仅仅是探究Docker和Jenkins的结合,这里仅仅使用静态页面的更新来进行测试,因此基础环境不使用Tomcat和Java的JDK,而是选择一个nginx的环境。
通过docker search nginx命令来查找hub上已经存在的nginx环境镜像,选定一个nginx环境镜像,下载此已有的nginx环境镜像,在此基础上进行修改,可以较快速地得到可以用于部署Web的环境。
在Git工具、Docker以及Jenkins都已经安装完成并且准备就绪后,可以开始集成和整合。首先需要在Jenkins中创建一个工程,并且将其命名为test。在这里,接下里的配置文件中可以通过设置hook以及定时器来定时检测指定的Github项目的更新变化,进行触发拉取动作,如图14中的第一个和最后一个选项。在这里,因为仅仅是测试,不开启自动拉取,使用执行构建。
配置的最后,是可以在项目拉取完成和构建后,执行的shell命令配置。而这段shell的配置,是在这里探究Jenkins和Docker集成进行Web自动部署的关键之处。
在nginx镜像中,使用的nginx的html默认目录在/usr/share/nginx/html下。Jenkins的默认代码下载在/root/.jenkins/workspace/下,因此在每次Jenkins从Github上获得更新代码后,直接执行shell脚本,将下载的Web的代码的路径映射到nginx镜像中的html默认目录中即可。并且在每次执行shell时,都先删除docker中上一次已经运行的实例容器,进行新的目录内容映射后,再次创建新的容器。
因此最后形成的完整shell代码如图14,保存后配置生效。
最后进行Web应用的自动部署测试。在Github新建一个项目,内容只有一个test.html,内容是“jenkins测试”。在Jenkins的test工程配置中添加此git地址,并且保存配置。
配置保存后执行构建,构建完成后访问页面,得到内容为“jenkins测试”,如图17。
开发本地修改test.html的内容为“测试持续集成”后,使用git push向github更新代码,并且再次在Jenkins上构建,再次访问服务器后,网页内容已经更换。查看Jenkins输出日志和页面结果如图21、图22。
通过上述Jenkins和Docker配合Git实现Web应用的快速部署更新,可以看到其效率可以大幅提高。开发者只需要向Git项目地址提交代码,Jenkins执行构建即可自动完成部署等操作,并且如果在Jenkins中配置了Hook钩子和定时器抓取的设置,身子可以节省手动Jenkins的构建过程,给开发者的开发和Web应用服务的部署带来了极大的便利。
参考文献:
尹高. 基于Docker的服务器运维平台的设计与实现[D]. 华中科技大学, 2016.
边俊峰. 基于Docker的资源调度及应用容器集群管理系统设计与实现[D]. 山东大学, 2017.
钟良侃. Docker技术在Web服务系统中的应用研究[J]. 电脑知识与技术, 2016, 12(26):123-126.
张力文. 基于Jenkins的项目持续集成方案研究与实现[D]. 西南交通大学, 2017.