您的位置:首页 > 运维架构 > Docker

一步一步在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,打完收工

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: