一步一步在docker中构建CI流程
2015-09-05 19:46
711 查看
docker是什么
引用百度百科的介绍:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
CI是什么
引用百度百科的介绍:持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
安装docker
到目前为止(2015-09-05),docker最新版本为1.8.1。 因为本文章使用的是ubuntu 14.04 LTS的操作系统,因此所有的安装和操作都基于该系统。使用命令:
curl -sSL https://get.docker.com/ | sh即可安装,该命令同样也使用与docker的升级。
其他操作系统或者ubuntu的其他版本安装文档,请移步官方文档
安装成功后,可使用
docker -v查看docker版本,这里是我安装后的版本信息:
Docker version 1.8.1, build d12ea79
构建目标
这里我们使用Jenkins作为CI工具,构建一个简单自动部署的Java项目的流程。其中源码使用Git管理(这里托管在oschina) 我们需要构建的镜像包括:Jenkins(CI工具)
Tomcat(java web项目服务器)
这里为了简化流程,web项目并没有使用数据库,在实际项目中一般都会依赖一个或多个数据库,但部署流程和这里一样。
构建镜像
下面我们一步一步的来构建这两个镜像,可以从Dockerfile构建镜像,本文所用到的Dockerfile都已经上传到这里。关于如何使用Dockerfile构建镜像以及一些基础的docker的命令使用,请移步这里。我们这里使用更简便的方式,直接拉取镜像进行构建。如下是已经上传好了的镜像地址:
Jenkins:index.tenxcloud.com/gavincook/jenkins:1.627 Tomcat:index.tenxcloud.com/gavincook/tomcat:8_0_23
直接使用
docker pull即可拉取对应的镜像,
拉取Jenkins镜像
docker pull index.tenxcloud.com/gavincook/jenkins:1.627,
拉取Tomcat镜像:
docker pull index.tenxcloud.com/gavincook/tomcat:8_0_23
因为镜像有几百兆,因此下载的时候会占用一些时间。等待下载完后,使用
docker images可以看到刚才我们下载的镜像:
为了后面使用方便,我们将镜像重命名一下:
docker tag index.tenxcloud.com/gavincook/jenkins:1.627 jenkins:1.627 docker tag index.tenxcloud.com/gavincook/tomcat:8_0_23 tomcat:8_0_23
重命名后,我们再使用
docker images可以看到:
关于Jenkins和Tomcat的两个镜像的文档和特性,请分辨参看Jenkins文档 && Tomcat文档
启动容器
现在我们基于镜像创建容器并启动。首先创建Jenkins容器:
docker run -d --name jenkins -p 80:8080 jenkins:1.627执行该命令后,我们就创建并启动了一个Jenkins容器,http端口为80。关于该镜像的更多特性,想传入更多启动参数,参考文档.这里我们使用最简单的方式来演示整个流程。
在浏览器输入当前主机的IP,即可看到:
接着Tomcat容器
docker run -d --name tomcat -e TOMCAT_USER=root -e TOMCAT_PWD=123456 -p 8080:8080 tomcat:8_0_23
该命令的意思是:创建一个tomcat容器,将容器的8080端口映射到宿主机的8080端口,并且使用root/123456作为tomcat的管理员账户。该管理员具有的权限如下:
manager-gui,
manager-script,
manager-jmx,
admin-gui,
admin-script。
注意:该Tomcat镜像将原本Tomcat下的ROOT文件夹重命名为了welcome,因为实际部署项目时会采用ROOT路径。因此访问Tomcat的欢迎页面,需要打开地址:http://ip:port/welcome.
配置Jenkins
到现在为止,我们所需的两个容器都已经成功启动。接下来我们需要配置Jenkins来完成项目的自动部署。这里我们采用的方式是,源代码托管到Git@OSC。然后通过git webhook来触发自动构建任务,从而完成项目的自动部署。这里使用的演示项目ci_demo,地址.
在git项目上配置webhook的回调地址
这里我们使用的是参数化构建
http://yourip/job/ci_demo/buildWithParameters,因为在实际的使用过程中,不一定是所有的提交都会触发构建。需要我们对提交信息做一定的分析,再决定是否构建和部署。这里我们仅仅是演示,所以没有使用用户授权信息,在实际使用时,务必给Jenkins加上用户权限。也即加上用户权限后,web hook应该形如:
http://username:password@yourip/job/ci_demo/buildWithParameters
关于Jenkins的其他API,可以在项目的配置页面最下方的链接中查看。如下图:
如果你没有公网IP的主机,可以忽略这一个步骤。这样就没办法通过我们推送代码到git上,来完成自动构建了。但是没关系,我们可以通过手工点击Jenkins界面中的参数化构建来完成整套流程。
接下来在Jenkins上创建一个任务
我们创建一个名字为
ci_demo的自由风格的软件项目:
然后打开
ci_demo的配置,勾选上参数化构建,然后添加一个名称为hook的string类型参数。(hook为Git@OSC钩子传递的参数)
添加构建步骤
添加一个
Execute shell类型的构建步骤,如图:
这里是一段脚本,大致解释下这段脚本的意思:
首先分析git webhook推送的数据,是否有包含了格式为:
[release]xxx的提交信息,如果没有则忽略当前提交。如果有则执行下面的检查。
通过项目的pom.xml来检查是否已经clone过代码,这里的检查条件大家可以根据自己项目的实际情况进行变换。如果已经clone过代码,则只需要进行更新即可。
更新完代码后,使用maven进行项目的打包构建。
最后使用curl命名,通过tomcat的管理接口上传并发布项目。因为Tomcat容器,我们在启动的时候,设置了管理员账户,所以在api接口上应当加上对应的用户凭证。
注意:这里我们没有使用Jenkins的源码管理,而是使用构建脚本进行源码的更新。因为每次提交都会触发构建,如果使用Jenkins的源码管理,则项目的每一次提交都会引起Jenkins里的该项目进行代码更新。但实际上,我们只需要项目真正需要构建的时候更新代码即可。
提交代码
到现在为止,我们已经配置好了Jenkins,Tomcat也已经准备就绪。我们提交一次构建的代码,git commit -m [release]1.0.0,然后推送到远程仓库。很快就能在Jenkins界面中看到有构建被触发了,我们可以看到如下的构建信息:
恩,一切都在完美的运行着。首次构建会去下载一些maven依赖,所以会耗时一些。成功构建过一次,以后就会快很多。
稍作等待,我们看到如下信息:
已经构建成功啦。真的吗?我要看看项目能否访问,打开tomcat的服务地址,我这里是
http://192.168.10.106:8080
无公网IP用户
内网用户,构建没法触发。咋整?对于这个情况,我们可以使用Jenkins自带的参数化构建来触发。如下图:然后可以看到,这里不就是我们刚才在配置界面设置的hook吗?我们可以手动组装一个用于构建的提交信息数据,“骗过”Jenkins里配置的一系列判断。具体的格式请参考:Hook钩子
这里附上一个用于测试构建的提交数据:
{"password":"","push_data":{"before":"4c61c8ff80c1dc88592cbaf220b20e34c7f703d9","after":"11c7763b1d3d56053db47b5859bed9bd596b26f4","ref":"refs/heads/daily_0902","user_id":69054,"user_name":"GavinCook","repository":{"name":"ci_demo","url":"git@git.oschina.net:gavincook/ci_demo.git","description":"\u643a\u5fc3\u533b\u7597","homepage":"http://git.oschina.net/gavincook/ci_demo"},"commits":[{"id":"11c7763b1d3d56053db47b5859bed9bd596b26f4","message":"[release]new version","timestamp":"2015-09-05T18:05:44+08:00","url":"http://git.oschina.net/gavincook/ci_demo/commit/11c7763b1d3d56053db47b5859bed9bd596b26f4","author":{"name":"GavinCook","email":"swbyzx@gmail.com"}}],"total_commits_count":1}}
好吧,其实本教程也是使用的手动触发构建的方式。但整套流程已经在公网IP上测试过,这里就没用公网地址来写教程。主要是怕你们知道公网地址了,随便来个脚本攻击我咋办,大神饶命。
OK,打完收工
相关文章推荐
- 用Hello World校验Docker的安装
- Docker简要教程
- Docker在Ubuntu的部署实践
- Docker学习笔记(一):在本地安装和配置Docker
- 如何使用 Weave 以及 Docker 搭建 Nginx 反向代理/负载均衡服务器
- 如何使用 Weave 以及 Docker 搭建 Nginx 反向代理/负载均衡服务器
- 2.1.4、初识Docker Hub
- Docker认识基础
- CentOS6.5 2.6.32-431 安装Docker1.8.1
- Docker它是个啥?
- 深入理解 Docker 镜像 json 文件
- 深入分析Docker镜像原理
- Docker新手入门:基本用法
- Docker新手入门:基本用法
- Docker1.8.1安装
- Docker-容器互联访问之数据容器操作过程
- 如何用Docker安装Eclipse Che和Codenvy
- 使用Docker部署Scrapy爬虫
- docker容器网络模式配置场景
- 2.1.1、Dockerfile最佳实战