基于Docker整合开发测试环境

n342 9年前

这是一个内部集开发测试为一体的环境,开发人员通过push代码到GitLab,以此来触发Jenkins,让Jenkins来执行一系列的脚本和操 作,build构建、结合Sonar、Email通知,还包括启动停止容器,将容器commit为Image,并将Image push到私有Docker Registry等操作;注意这个环境的主体是Jenkins。

 基于Docker整合开发测试环境


此前在网上看到了一张这样的图片,让我感触良多,我觉得这一套环境很适合我们当前的环境;开发人员提交代码到GitLab,通过GitLab的web hook触发Jenkins;此时,Jenkins可能会很繁忙,它要处理的事情如下:
  1. 从GitLab clone最新的代码准备build
  2. ssh远程执行一个脚本,启动一个Container用于部署
  3. 通过maven进行build打包
  4. 部署到tomcat
  5. 匹配build的输出字段来远程执行一个脚本,将部署的tomcat提交成Image,并push到私有Docker Registry
  6. 将build的包发送给Sonar,进行代码质量检测
  7. 邮件通知给测试人员和开发人员

因此,我花费了几天时间将这一套整合到我们内部的环境中来(都是Java应用);这中间每一个步骤都要精心的规划和测试来保证他的可用性;

我们要做的第一件事就是做一个tomcat的镜像(需要开启tomcat的用户登录功能),这个镜像将用于后续Jenkins的部署;此后就是Jenkins的配置了;

你需要了解Jenkins的工作原理:

Jenkins会自动从我们设置的Repository URL中clone到当前的一个workspace中并切换到最新的branch,然后执行Execute shell中的command,如果每条command都返回0,则build成功,否则算失败;所以我们的shell command可以是简单的编译指令;(注意:command有两种形式,一种是shell命令build;另一种是使用Jenkins的插件来 build)
接下来设置构建触发器,通过SCM来与GitLab协调;
注意:Poll SCM会扫描所有指定了Repository URL branches的job,如果所有的job都设置SCM,那么都会触发所有的job(前提是所有job设置的SCM都一样;不一样,则会依次进行触发检测)

设置构建环境,在build前,远程执行一个脚本,并且传递了两个Jenkins的环境变量用做脚本的参数;脚本的工作是启动一个容器,并指定映射的端口为8080,这也是一个变量)
注意:在启动容器的时候建议指定其name,方便后续对它进行操作,并且name最好是一个变量,因为,当有多个开发 人员在提交代码后都会触发Jenkins的创建,创建的过程中都会启动一个容器,如果容器的name相同,那么容器会创建失败;还要注意映射的端口也是一 个变量,这个端口要跟下面的tomcat端口一样;

!/bin/bash

docker run -d -p $2:8080 --name="$1" 192.168.1.188:5000/centos-tomcat7:latest docker inspect -f '{{.Name}}' $1 | awk -F/ '{print $2}' > /root/docker/CI/.tmp.txt

构建步骤(Java应用),可通过maven插件,执行maven命令来build;也可以用shell命令或脚本来build;build后指定Tomcat的部署地址;

部署成功就可以对容器进行操作了,通过post build task的“Log text”对build部署的输出进行匹配,匹配成功,则执行一个脚本;脚本的功能是将容器提交为一个镜像,并将镜像push到私有Docker registry;

!/bin/bash

container_name=`cat /root/docker/CI/.tmp.txt` build_number=`cat /root/docker/CI/.tmp.txt | awk -F- '{print $2}'` docker stop ${container_name} docker commit -a "Jason Tom <tangjiaxing147@aol.com>"  `docker inspect -f '{{.Id}}' ${container_name}` 192.168.1.188:5000/centos-${container_name}:latest docker commit -a "Jason Tom <tangjiaxing147@aol.com>"  `docker inspect -f '{{.Id}}' ${container_name}` 192.168.1.188:5000/centos-${container_name}:v${build_number} docker push 192.168.1.188:5000/centos-${container_name}:latest docker push 192.168.1.188:5000/centos-${container_name}:v${build_number} docker rm ${container_name}

注意:Jenkins中默认是以Jenkins用户去执行所有的操作的;切记,如果你是直接执行这个脚本,那么这一步肯定会跳过的,因为Jenkins默 认用户的bash是/bin/false,是没有shell的,你必须把Jenkins用户的shell改成bash才能执行上面的脚本;切记切 记.....

配置到这,Jenkins的任务就已经完成了,现在只需要到GitLab的项目仓库中设置web hook即可。

使用插件介绍:
  • post build task插件(编译后的任务,如果放在tomcat部署插件之后,那么就等待部署完成再执行这个task任务)
  • ssh plugin插件(ssh插件)
  • invoke top-level maven targets插件
  • deploy to container plugin插件
  • 要让Jenkins可以自动build git repo中的代码,需要安装git client plugin和git plugin
  • 要让Jenkins可以收到GitLab发来的hook从而自动build,需要安装GitLab hook plugin
  • 要让Jenkins可以在build完成之后根据TAP(test anything protocol)文件生成graph,需要安装 TAP Plugin

参考文档: