作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
上篇文章我们构建了一个Jenkins镜像,本篇我们通过一个实例使用一下上篇构建的镜像,来组成一个持续集成环境。典型的持续集成环境包含的功能包括:从源代码仓库拉取代码,源代码的编译,对编译后的代码进行单元测试、集成测试及系统测试等,测试完成后对代码的打包。这些功能可以通过Jenkins的插件来实现。
本篇的代码使用了“Using Docker”一书当中的identidock代码。它是由python语言编写的简单的web应用程序。程序的基本功能是根据用户输入的用户名,生成一个专属于该用户的图标,如下图所示:
![通过Jenkins容器构建镜像(2)](http://file.lexue001.com/www/201611/13/114154946.png)
完整的程序由三部分组成:一个由Flask框架编写的web程序,一个基于redis的缓存,以及一个生成图标的web服务。这三个部分都最终都通过容器提供服务,组成微服务的架构。程序的代码主要在第一个部分即web程序部分,另外两个部分都直接使用现成的容器镜像,即一个redis镜像和一个amouat/dnmonster镜像。整个程序可以通过docker-compose组成测试环境。程序的源代码在 https://github.com/andyyoung01/ci-testing/tree/master/identidock 。
下面我们主要关注通过上篇构建的Jenkins镜像,来拉取程序源代码,运行此程序的单元测试,在测试完成后可以通过bash脚本将程序tagging,然后推送到镜像库中等待部署。
首先,下载上篇构建的Jenkins容器镜像:
[yangdong@centos7 ~]$ docker pull registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker
为了方便持久化Jenkins容器的配置等,我们创建一个数据容器:
[yangdong@centos7 ~]$ docker run --name jenkins-data \ > registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker \ > echo "Jenkins Data Container" Jenkins Data Container
下面创建Jenkins服务器容器,并且通过 --volumes-from
命令行参数使用前面创建的数据容器,来持久化JENKINS_HOME中的数据:
[yangdong@centos7 ~]$ docker run -d -v /var/run/docker.sock:/var/run/docker.sock \ > --volumes-from jenkins-data -p 8080:8080 --name jenkins \ > registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker 4f94030e525ea573c98a8d24df2540075f5a43f091890256fb7295d137192754
容器需要一段时间初始化,此时可以通过如下命令查看容器的初始化过程:
[yangdong@centos7 ~]$ docker logs -f jenkins ...
从上面的日志输出可以查询到Jenkins服务器的初始化密码,使用此密码登录Jenkins的web界面。经过一系列的初始化后,最终进入了Jenkins的web界面。下面开始通过此web页面创建创建持续集成环境:
- 点击“创建一个新任务”链接。
- 在item name中输入项目的名称,这里输入“identidock”,然后选择“构建一个自由风格的软件项目”,点击“ok”。
- 在“源码管理”部分,选择Git,然后输入您自己的代码库的Repository URL,这里直接使用Git Hub作为代码库,输入“ https://github.com/andyyoung01/ci-testing.git ”。“Branches to build”输入想要构建的分支,这里保留默认的master分支。这部分配置了该持续集成环境从哪里拉取程序源代码。
- 在“构建”部分,选择“增加构建步骤”,选择“Execute shell”。在“Command”文本框中,输入下面的bash脚本:
#Enter the working directory cdidentidock #Default compose args COMPOSE_ARGS=" -f jenkins.yml -p jenkins " #Make sure old containers are gone sudo docker-compose $COMPOSE_ARGSstop sudo docker-compose $COMPOSE_ARGSrm --force -v #build the system sudo docker-compose $COMPOSE_ARGSbuild --no-cache sudo docker-compose $COMPOSE_ARGSup-d #Run unit tests sudo docker-compose $COMPOSE_ARGSrun --no-deps --rm-eENV=UNIT identidock ERR=$? #Run system test if unit tests passed if[$ERR-eq0 ];then IP=$(sudo docker inspect -f{{.NetworkSettings.IPAddress}} jenkins_identidock_1) CODE=$(curl -sL -w"%{http_code}"$IP:9090/monster/bla -o /dev/null) ||true if[$CODE-eq200 ];then echo"Test passed - Tagging" HASH=$(git rev-parse --short HEAD) sudo docker tag jenkins_identidock andyyoung01/identidock:$HASH sudo docker tag jenkins_identidock andyyoung01/identidock:newest echo"Pushing" # sudo docker login -u your-username -p your-password registry.cn-beijing.aliyuncs.com # sudo docker push amouat/identidock:$HASH # sudo docker push amouat/identidock:newest else echo"Site returned "$CODE ERR=1 fi fi #Pull down the system sudo docker-compose $COMPOSE_ARGSstop sudo docker-compose $COMPOSE_ARGSrm --force -v return$ERR
上面的部分配置了持续集成环境的构建和测试部分,以及测试成功后对代码的打包。
最后点击“保存”按钮保存所有设置,回到该项目的主页后,点击左边的“立即构建”链接开始构建项目。这里是手动触发的构建,当然还有许多其它触发构建的方式可以配置。
稍微看一下上面的bash脚本。它是通过docker-compose来设置测试环境的。在运行了单元测试后,如果没有问题,继续运行系统测试。系统测试也成功后,对镜像打标签,然后推送到镜像存储库中(这里没有实际推送上去)。
在web页面的“Console Output”链接下,可以看到构建过程中的日志输出,如下图:
![通过Jenkins容器构建镜像(2)](http://file.lexue001.com/www/201611/13/114154946.png)
可见,这里我们通过bash脚本完成了大多数的持续集成步骤。实际上,Jenkins提供了许多插件,可以用来配置整个持续集成的Pipeline。