Docker构建和测试Web应用
技能目标:
· 了解Docker Swarm集群的应用
· 掌握Jenkins安装部署
· 掌握Jenkins发布WEB集群
10.1 案例分析
10.1.1 案例概述
在前面课程内容已经介绍Docker Swarm集群基础概念及安装部署,并且通过添加私有仓库,push或pull镜像等操作动作,完成集群部署任务。大家都知道在生产环境并没有那么简单,需要多个系统配合完成整套系统架构的维护。本章将引入Jenkins持续集成工具,完成线上代码的发布;讲解Jenkins的相关知识,并基于SVN、SSH技术实现自动构建、部署等功能。
10.1.2 案例前置知识点
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成,每次的集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早发现集成错误。简单来说,就是持续的定时的在多个团队成员的工作中进行集成,并且给予反馈。
持续集成需要开发人员一天多次的将代码集成到主干,并进行自动化编译、测试等操作,由于这种频繁集成,以及集成后及时开始的编译和测试,可以有效避免我们在提交代码时没有进行必要检查而导致的错误,以及一些超出预期效果的更改,从而保证代码的质量。
由于这种及时性,如果在一次提交后项目集成失败,可以快速的在这次提交中查找问题所在,缩小了找问题的范围,从而减少了一些debug时间。同时如果按照这种实践,那么我们的主干代码时刻都是正确的,这样我们可以更频繁的交付。
下面是Jenkins 特点:
1) 易于安装,比如war包、rpm的形式安装等;
2) 易于配置,所有配置都是通过其提供的web页面实现。
Jenkins 具有如下功能:
1) 集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过E-mail通知;
2) 生成JUnit/TestNG测试报告;
3) 分布式构建支持Jenkins能够让多台计算机一起构建/测试;
4) Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;
5) 支持扩展插件,可以开发适合自己团队使用的工具;
6) Jenkins一切配置都可以在Web页面上完成。有些配置如MAVEN_HOME和Email,只需要配置一次,所有的项目就都能用。当然也可以通过修改XML进行配置;
7) 支持Maven的模块(Module):Jenkins对Maven做了优化。因此它能自动识别Module,每个Module可以配置成一个job;
8) 测试报告聚合:所有模块的测试报告都被聚合在一起,结果一目了然,使用其他CI,这几乎是一件不可能完成的任务;
10.1.3 案例环境
1. 本案例环境
本案例环境采用5台服务器。前三台是Docker Swarm集群,第四台是代码版本控制系统,第五台是Jenkins持续集成工具。表10-1是本案例使用的五台服务器的环境介绍。
表10-1 Jenkins持续集成环境
2. 案例拓扑
图10.1是Jenkins发布的拓扑图。
![a55a3d710fca32dff04db3311a130d3a.png](https://i-blog.csdnimg.cn/blog_migrate/2f212641f7467531efd2618d8747c65f.jpeg)
图10.1 Jenkins发布示意图
3. 案例需求
1) Jenkins持续集成将结合Docker Swarm实现完成Web应用部署发布。
2) 将在Jenkins主机创建发布目录发布到Docker Swarm 已创建好的Web服务应用目录。
4. 案例实现思路
1)基于Tomcat部署Jenkins持续集成工具;
2)安装部署Subversion;
3)安装Jenkins插件;
4)配置Publish over SSH插件;
5)创建一个新的工程项目;
6)验证Jenkins持续集成持续交付。
10.2 案例实施
使用SVN(版本控制器)作为Web应用的发布工具,按下述步骤完成Web应用的发布。
1) 部署Jenkins;
2) 部署SVN;
3) 安装Jenkins插件;
4) 添加凭据;
5) 配置插件;
6) 构建新工程项目;
7) 验证Jenkins持续集成持续交付。
下面将部署并配置Jenkins持续集成环境。
1.基于Tomcat部署Jenkins
基于前面课程已介绍Tomcat相关理论及部署内容,本章不做过多介绍。从官网http://mirrors.jenkins.io/war/2.118/下载 jenkins.war,保存到Jenkins服务器的 $CATALINA_BASE/webapps。启动Tomcat 会自动部署。在将jenkins.war部署到Tomcat目录后,在浏览器http://192.168.168.91:8080/jenkins ,如图10.2所示。
![67e862eff8a0512793e6c5021d51cbcc.png](https://i-blog.csdnimg.cn/blog_migrate/b58a695d0bab92cdc9f79b04f60ad53f.jpeg)
图10.2
通过图10.2可以很明显的看出Tomcat方式启动Jenkins已经成功。初次部署Jenkins,会生成一个初始登录密码。
[root@localhost ~]# cat /root/.jenkins/secrets/initialAdminPassword
909ce9e5e72440d2b90ea891ef8148d9
复制这段管理员密码,登录Jenkins,选择安装推荐插件,如图10.3所示。后续可以根据需求安装jenkins插件。Comment by 周 士昆: 是的。
![39d19d9be9ca73f40c4bf8bd3bd00eda.png](https://i-blog.csdnimg.cn/blog_migrate/704b9fc0ddb1493b3fa5632baa9437ff.jpeg)
图10.3
安装完插件后,会提示创建一个新用户,如图10.4所示。
![72b4d157317adb872fd12e1c7db0d920.png](https://i-blog.csdnimg.cn/blog_migrate/72979430faa10221886ec89417e5f079.jpeg)
图10.4
用户第一次登录后选择"系统管理"按钮页面内容,如图10.5所示。
![c7fd5682bb7241ce7085a07846033ebe.png](https://i-blog.csdnimg.cn/blog_migrate/3c1c2f55501cb9cfa7e85d1a2b80ef9d.jpeg)
图10.5
2. 安装部署Subversion
Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统。它于 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。
相对于的RCS、CVS,SVN采用了分支管理系统,它的设计目标就是取代CVS。互联网上免费的版本控制服务多基于Subversion。说得简单一点,SVN就是用于多个人共同开发同一个项目,共用资源的目的。
下面是安装并部署Subversion的命令和结果。
[root@svn ~]# yum install subversion
[root@svn ~]# mkdir -p /kgc/svn
[root@svn ~]# svnadmin create /kgc/svn
[root@svn~]# vi /kgc/svn/conf/passwd
kgc-test=benet.com
[root@svn~]# vi /kgc/svn/conf/authz
[/]
kgc-test=rw
//编辑配置文件,注释去掉,前面不能留空格。
[root@svn~]#cd /kgc/svn/conf/
[root@svn conf]# cat svnserve.conf | grep -v "^#" | grep -v "^$"
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
realm = /kgc/svn
[sasl]
启动svn即可完成部署。
[root@svn conf]# svnserve -d -r /kgc/svn
创建分支,模拟提交代码。
[root@svn ~]# svn mkdir svn://192.168.9.231/product-station -m "mkdir by zsk create 2018-0807"
[root@svn ~]# svn list svn://192.168.9.231
product-station/
[root@svn ~]# svn checkout svn://192.168.9.231/product-station
[root@svn ~]# cd product-station/
[root@svn product-station]# vim index.html
kgc-web-version
[root@svn product-station]# svn commit -m 'commit'
正在发送 index.html
传输文件数据.
提交后的版本为 6。
3. 安装Jenkins插件
Jenkins 插件管理器允许安装新的插件和更新Jenkins服务器上的插件。Jenkins将连接到联机资料库,检索可用的和已更新的插件。如果Jenkins服务器无法直接连接到外部资源,也可以从Jenkins网站上下载,网址是http://mirror.xmission.com/jenkins/plugins/。
在已运行的Jenkins主页中,点击左侧的系统管理,找到管理插件选中"可选插件"选项卡进入如图10.6所示,在过滤搜索框中敲入要安装的SSH、Publish Over SSH、SSH Agent插件,并勾中其左侧的复选框即可开始安装操作。
![2d463c17ab8ee7be592bc94916449e11.png](https://i-blog.csdnimg.cn/blog_migrate/af6f8ae21cd4dfb700f33940bca54561.jpeg)
图10.6
完成SSH plugin、Publish Over SSH插件的安装后,在系统管理→系统设置页面显示出SSH Site配置选项。
4. Jenkins配置SSH Site
在配置ssh site选项前,必须先添加凭据。Jenkins的"Credentials"直译为"证书"、"凭据"。如果通过意译,那它的理解就是"钥匙",这个翻译对于使用者而言是最为容易理解的。
在配置SVN时,需要使用者提供相应的账号与密码进行登录。假如把要访问的URL地址理解为锁,那么所提供的账号与密码就对应于开这把锁的钥匙。所以说"Credentials"中所记录的就是各种各样的这种钥匙。这里的钥匙对应的锁是有多种可能的,可能是SVN,也可能是Git等,而"Credentials"就是对于这些钥匙所进行的统一管理。
在Jenkins的主页中点击【Credentials】按钮.如图10.7所示。
![72d0cb6870b73827219a108d1605c166.png](https://i-blog.csdnimg.cn/blog_migrate/dc42074d818285d470cbaa57e7f4721b.jpeg)
图10.7
在【Credentials】页面中,点击【Jenkins】超链接跳转到【System】页面,如图10.8所示。
![6e9efc89f5878c0d54af405a7afbda60.png](https://i-blog.csdnimg.cn/blog_migrate/67d730ecc91288bc195eefa62cd3434d.jpeg)
图10.8
点击导航条中【Add domain】超链接,跳转到【Add domain】页面,如图10.9所示,在这里,可以对credentials进行管理操作,创建账户名是"kgc-test"的Domain Name后,点击"OK"按钮。
![22cf66ba800f1f7633bb5fbace289c3c.png](https://i-blog.csdnimg.cn/blog_migrate/2a83210069c73fc2c9bc56a88a8b1209.jpeg)
图10.9
创建完成域名后选择添加凭据,如图10.10所示,显示有六项数据,需要使用者关注。页面右侧第一行的"Kind"表示的是钥匙的种类,保持默认的"Username with password"选项;第二行的"Scope"表示的是作用域,仍然保持默认值"Global(Jenkins,nodes,items,all child items,etc)"; 第三行是"Username",需要填写所对应的svn账号。图10.10中输入的SVN管理员账户是"kgc-test";第四行的"Password"就是账号所对应的密码;第五行的"ID"不需要去填写,它自己会补全的;第六行的"Description"是账号的描述,可以填写"SVN拉取账户"。填写以上数据后,点击"OK"按钮进行保存。
![76e10c80a75457bc0c028c1d986ebb2d.png](https://i-blog.csdnimg.cn/blog_migrate/88979ac9383bcb55e74535c6a3ad4370.jpeg)
图10.10
查看新增的SVN拉取账号,如图10.11。
![4a680b45c3b4d720418e0e740b218e45.png](https://i-blog.csdnimg.cn/blog_migrate/53330dbe56d5747907a8334aecb3d754.jpeg)
图10.11
5. 配置Publish Over SSH
在所有Docker Swarm节点创建目录,命令如下:
[root@manager ~]#mkdir -p /usr/share/nginx/html
在Jenkins的主页面中,点击"系统管理"进入"系统设置"页面找到SSH Server作为后续Docker主机选项。该插件主要是通过SSH连接其他Linux机器,远程传输文件及执行Shell命令,填写IP地址,登录用户名和创建的路径,选择高级勾选Use password authentication, or use a different key填写Docker Swarm Manager节点root登录密码,之后选择Test Configuration测试,测试成功后选择保存,如图10.12所示。
注意:需要事先在Docker 所有节点创建/usr/share/nginx/html目录。
![65ba2af60ae6a6ef2a7b6d5c7538a0ec.png](https://i-blog.csdnimg.cn/blog_migrate/880c8aa61f4f7095c901208485464e71.jpeg)
图10.12
6. 构建一个新工程项目
在Jenkins的主页面中,点击"新建任务",创建一个任务名kgc-test。选择构建一个自由风格的软件项目,点击"确定"按钮,如图10.13所示。
![5554a3dcd97b30d4c0669c9b3242c839.png](https://i-blog.csdnimg.cn/blog_migrate/06af9e043d1c15dfc2948c12b76a4733.jpeg)
图10.13
在刚刚创建kgc-test任务中,选择源码管理Subversion。在构建新任务时需要配置svn拉取代码地址。目的是将svn上面的代码拉取到Jenkins工作目录中(本案例中SVN拉取的工作目录是workspace/kgc-test),如图10.14所示。
![0ba6a20ca3ec2d90ad54433decca65cf.png](https://i-blog.csdnimg.cn/blog_migrate/9b4255e9bef4bcc5183358ef022bf7e8.jpeg)
图10.14
在kgc-test工程中,选择构建后操作中的send build artfacts over SSH进行配置,如图10.15所示。
![23bedd533fc17e2bf71654e7889b1e01.png](https://i-blog.csdnimg.cn/blog_migrate/929ee309411711140d1037831958caa5.jpeg)
图10.15
Exec command文本框中的命令参数如下,具体命令参数在前面课程中详细讲过,这里不再过多介绍。
docker service rm kgc-test
docker service create --name kgc-test --replicas 3 --mount type=bind,source=/usr/share/nginx/html,destination=/usr/share/nginx/html -p 88:80 nginx
kgc-test工程项目配置完成后,可以在Jenkins首页,点击kgc-test工程项目中"立即构建"按钮就可以构建此工程项目,如图10.16所示。
![ee5fd9a970a0e3cced26198ec7797a91.png](https://i-blog.csdnimg.cn/blog_migrate/ddfb1a196b6dd592855e841ea0299f71.jpeg)
图10.16
选择构建工程之后点击构建历史下面的#1,然后选择控制台输出即可看到正在构建中的console out日志信息,输出内容如下所示:
Updating svn://192.168.168.231/product-station at revision '2018-05-31T16:47:58.950 +0800' --quiet
Using sole credentials kgc-test/****** (svn拉取账户) in realm ' /kgc/svn'
At revision 2
No changes for svn://192.168.168.231/product-station since the previous build
SSH: Connecting from host [Jenkins]
SSH: Connecting with configuration [192.168.168.93] ...
SSH: EXEC: STDOUT/STDERR from command [docker service rm kgc-test
docker service create --name kgc-test --replicas 3 --mount type=bind,source=/usr/share/nginx/html,destination=/usr/share/nginx/html -p 88:80 nginx] ...
kgc-test
i7uk34pfy8c99frwud7iiq9hg
overall progress: 0 out of 3 tasks
1/3:
2/3:
3/3:
overall progress: 0 out of 3 tasks
overall progress: 0 out of 3 tasks
overall progress: 0 out of 3 tasks
overall progress: 0 out of 3 tasks
overall progress: 3 out of 3 tasks
verify: Waiting 5 seconds to verify that tasks are stable...
verify: Waiting 5 seconds to verify that tasks are stable...
verify: Waiting 5 seconds to verify that tasks are stable...
verify: Waiting 5 seconds to verify that tasks are stable...
verify: Waiting 5 seconds to verify that tasks are stable...
verify: Waiting 4 seconds to verify that tasks are stable...
verify: Waiting 4 seconds to verify that tasks are stable...
verify: Waiting 4 seconds to verify that tasks are stable...
verify: Waiting 4 seconds to verify that tasks are stable...
verify: Waiting 4 seconds to verify that tasks are stable...
verify: Waiting 3 seconds to verify that tasks are stable...
verify: Waiting 3 seconds to verify that tasks are stable...
verify: Waiting 3 seconds to verify that tasks are stable...
verify: Waiting 3 seconds to verify that tasks are stable...
verify: Waiting 3 seconds to verify that tasks are stable...
verify: Waiting 2 seconds to verify that tasks are stable...
verify: Waiting 2 seconds to verify that tasks are stable...
verify: Waiting 2 seconds to verify that tasks are stable...
verify: Waiting 2 seconds to verify that tasks are stable...
verify: Waiting 2 seconds to verify that tasks are stable...
verify: Waiting 1 seconds to verify that tasks are stable...
verify: Waiting 1 seconds to verify that tasks are stable...
verify: Waiting 1 seconds to verify that tasks are stable...
verify: Waiting 1 seconds to verify that tasks are stable...
verify: Waiting 1 seconds to verify that tasks are stable...
verify: Service converged
SSH: EXEC: completed after 7,604 ms
SSH: Disconnecting configuration [192.168.168.93] ...
SSH: Transferred 1 file(s)
Finished: SUCCESS
至此Jenkins结合Docker Swarm持续集成,告一段落了。
7. 验证Jenkins持续集成持续交付
查看Jenkins是否将svn拉下来的代码拷贝到远程主机192.168.168.93,从下面结果可以看到index.html已经拷贝成功。
[root@manager ~]# cd /usr/share/nginx/html/
[root@manager html]# ls
index.html
注意:Jenkins只是把index.html拷贝到了Wwarm Manager 节点,Node节点也需要拷贝index.html文件。
检查Docker Swarm创建是否成功,执行命令和执行结果如下所示。
[root@manager html]# docker service ps kgc-test
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
oa7rlbjseg1x kgc-test.1 nginx:latest worker01 Running Running 6 minutes ago
ih9lb2ujn16m kgc-test.2 nginx:latest worker02 Running Running 6 minutes ago
zelzmrw2ah5k kgc-test.3 nginx:latest manager Running Running 6 minutes ago
通过浏览器访问,如图10.17所示。
![7daebd2a7e18e361bd5fb4922041c275.png](https://i-blog.csdnimg.cn/blog_migrate/c5078a6656da71e5115c6ce37b4754aa.jpeg)
图10.17
查看访问后容器日志,执行命令和执行结果如下所示。
[root@manager html]# docker service logs -f kgc-test
kgc-test.3.2213i1lu1l3s@manager | 10.255.0.2 - - [31/May/2018:09:17:39 +0000] "GET / HTTP/1.1" 200 12 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0" "-"
kgc-test.3.2213i1lu1l3s@manager | 10.255.0.2 - - [31/May/2018:09:17:47 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0" "-"
kgc-test.3.2213i1lu1l3s@manager | 10.255.0.2 - - [31/May/2018:09:17:47 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0" "-"
kgc-test.3.2213i1lu1l3s@manager | 10.255.0.2 - - [31/May/2018:09:17:47 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0" "-"
kgc-test.3.2213i1lu1l3s@manager | 10.255.0.2 - - [31/May/2018:09:17:47 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0" "-"
kgc-test.3.2213i1lu1l3s@manager | 10.255.0.2 - - [31/May/2018:09:17:47 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0" "-"
可以看到通过Jenkins执行脚本拉过来的应用已成功发布。
第 15 页 共 17 页