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