传统的软件开发、测试、运维需要三个团队在三个不同的环境中进行,而三个环境的不同引发了很多的问题。如:工作内容的重复;开发环境中可运行的程序在测试和运维环境下却未必正常;开发人员提交代码前的测试不充分而引入新的BUG,没有有效的机制进行提交前的充分测试;测试出的BUG因为环境的复杂使得开发人员难以复现等等。
Docker的出现让一切都不同以往,Docker可以将系统与应用打包成一个镜像,可以根据Dockerfile和一个简单的构建命令轻易的重现开发和测试的环境。将Docker引入持续集成(Continuous Integration - CI)构建系统中,保证了开发、测试、运维环境的统一。结合Github和Jenkins可以实现自动化测试和自动部署。现已有很多基于Docker容器技术的开发、测试、运维一站式解决方案。Docker相关产品应用的出现使得Docker的使用越来越方便。
持续集成的特点:
它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;
需要有专门的集成服务器来执行集成构建;
需要有代码托管工具支持;
持续集成的作用:
保证团队开发人员提交代码的质量,减轻了软件发布时的压力;
持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
开源项目Jenkins是一个基于Java开发的开放易用的持续集成平台,可用于执行和监控重复性的工作:持续的软件版本发布/测试项目;监控外部调用执行的工作。可以方便的安装第三方插件,可以实时监控持续集成过程中存在的错误,并提供详细的日志文件,还具备提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。其具备以下特点:
易安装:仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库;
易配置:提供友好的GUI配置界面;
变更支持:Jenkins能从代码仓库(Subversion/CVS)中获取并产生代码更新列表并输出到编译输出信息中;
支持永久链接:用户是通过web来访问Jenkins的,而这些web页面的链接地址都是永久链接地址,因此,你可以在各种文档中直接使用该链接;
集成E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时告诉你集成结果(据我所知,构建一次集成需要花费一定时间,有了这个功能,你就可以在等待结果过程中,干别的事情);
JUnit/TestNG测试报告:也就是用以图表等形式提供详细的测试报表功能;
支持分布式构建:Jenkins可以把集成构建等工作分发到多台计算机中完成;
文件指纹信息:Jenkins会保存哪次集成构建产生了哪些jars文件,哪一次集成构建使用了哪个版本的jars文件等构建记录;
支持第三方插件:使得 Jenkins 变得越来越强大;
想了解更多详细信息请移步Jenkins官方网站。
BuildPipeline:这是Jenkins的一个插件,它可以将多个需要协同工作的Jenkins任务按照流水线进行排序,将各任务间的关系变为可视化的图表,使得部署流程清晰可见。
通过Docker可以将每一个任务模块化,并通过Dockerfile制作有针对性的镜像来运行任务,并可以通过管道获取各任务的执行时间和结果,为产品的成功发布奠定基础。接下来就是根据自身情况合理的利用和调度Docker。
Docker对测试的影响
让单元测试运行的更顺畅;
单元测试驱动开发是一个很好的应用程序开发方式,单元测试往往也是和代码一起被提交到代码仓库中。但是很多单元测试通常依赖于很多其他服务,而这些服务的标准化配置往往是一个难点,如数据库的搭建、防火墙的配置等。而Docker容器则可以将这些配置一起打包到新的镜像中,从而轻松的完成这些测试。让虚拟机不再困扰集成测试和功能测试;
为降低成本,过去很多不同业务的测试会运行在同一个虚拟机中,这样的测试环境并不纯粹。而通过Docker则可以在数秒内部署出一套清洁的测试环境,包括微服务的架构的测试环境,同时这些测试环境是可以共享的。测试团队和客户无需再配置冗长的配置文件;
通常软件的复杂度越高,其环境配置也就越复杂,传统的测试通常需要先根据用户文档进行环境配置,而且还不一定一次性成功,错误的环境配置也更容易报出Bug。而Docker则可以通过打包镜像保证开发、测试、运维环境的一致性,包括配置文件、路径、权限等。可以轻易复现Bug场景;
传统开发过程中,客户的环境往往无法共享给开发团队,导致Bug的复现出现困难,不得不通过客户的log进行分析。而Docker则可以通过镜像立刻复现客户的运行场景,更快的定位问题。Dockerfile可以构建流程清晰可见;
Dockerfile是描述Docker镜像构建步骤的一个文档,从FROM开始,每一步都是以上一步指令产生的镜像为基础,执行当前的命令,然后将执行结束后的整个环境打包成一个新的镜像层并添加到基础镜像之后。以哪个镜像为基础,又先后对该镜像进行了哪些操作都清晰可见,而镜像的构建又是严格依照该文件描述的步骤进行,所以说,只要Dockerfile相同,依据其所构建的镜像也是相同的,当然,前提条件是你的基础镜像也相同。成熟的测试套件和工具可以通过镜像共享;
软件厂商发布的测试套件和工具可以直接打包进镜像进行发布。环境的配置直接使用镜像即可,而不再是根据用户手册进行配置。
Docker技术适用范围
Docker的目标:Build,Ship,and Run Any App,Anywhere;即在任何地方构建、部署、运行任何应用程序。
但是Docker依然有它自身的局限性:
因为容器与主机公用内核,所以如果容器需要使用不同的内核版本,主机内核就需要做同步变更;
不能修改内核参数或自主定制内核;
对内核版本有依赖,Docker通常需要3.10或以上版本的内核;
在容器中加载或卸载内核模块会影响到主机和其他容器;
跨主机通信能力不足;
无法像qemu一样模拟嵌入式系统运行环境;
虽然某些旧版本内核也可以运行Docker,但是Docker官方对这类内核不提供支持,而这类内核很可能潜在诸多问题。另外,运行Docker对很多内核编译选项有要求,基于旧版本内核的Linux发行版不一定开启了这些编译选项,可能需要用户重新编译内核才能运行。
Jenkins + Docker自动化环境配置
搭建Jenkins环境
-
方法一:直接在主机中配置Jenkins环境;
wget -qO - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add - && echo 'deb http://pkg.jenkins-ci.org/debian binary/' | tee /etc/apt/sources.list.d/jenkins.list && apt-get update && apt-get -y install jenkins
-
方法二:使用Docker镜像配置Jenkins环境;
# 拉取Jenkins镜像 $ docker pull jenkins && mkdir /opt/jenkins/data # 启动jenkins容器 $ docker run -d --name jenkins-server -p 7780:8080 -p 50000:50000 -v /opt/jenkins/data:/var/jenkins_home -u root --restart always jenkins # 在浏览器中访问容器所在宿主机ip:7780或domainname:7780即可进入Jenkins页面
大多数工具基本都是这两种安装方式。
构建Gitlab环境
Gitlab类似于Github,是一个项目管理程序,可以浏览源代码、管理缺陷和注释,不同的是Github私有项目收费,而Gitlab则是搭建在自己的服务器上的。具体操作请参照Gitlab官方网站。当然你也可以选择Github,很多有名的开源项目都是放在Github上的,你也可以找到更多的帮助和说明文档。
配置Jenkins环境
需要的Jenkins控件(系统管理 - 管理插件):
GIT client plugin:1.18.0
GIT plugin:2.4.0
Gitlab Merge Request Builder:1.2.2
GitLab Plugin:1.1.25
SCM API Plugin
如果需要更多的Jenkins控件请点击这里。
接下来需要配置Jenkins的从节点。在从节点主机上安装Java包:
apt-get -y install default-jre
Jenkins主节点是Jenkins Web Server所在的主机,负责测试任务的调度,不负责测试用例的执行。而从节点接受主节点的调度,负责测试用例的执行。
配置Gitlab中的项目参数
Jenkins中的常用Docker插件
Docker build step plugin:可以添加Docker命令到构建步骤中;
CloudBees Docker Build and Publish plugin:提供通过Dockerfile构建工程的能力并将制作好的镜像发布到Docker仓库中;
Docker Plugin:可以使用Docker主机动态分配的容器作为Jenkins的从节点;
Kubernetes Plugin:通过由Kubernetes管理的多个Docker主机系统来动态分配的容器作为Jenkins的从节点;
Docker Commons Plugin:为其他与Docker相关的插件提供API;
参考目录:
《Docker技术入门与实践》(杨保华 戴王剑 曹亚仑)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。