Jenkins 入门教程之三 Jenkins 与 SVN 持续集成实战

上篇:Jenkins 入门教程之二 Jenkins 与 SVN 搭建 CI-CD 环境

下面的实战内容是在上篇内容的基础上进行操作的,为了保证连贯性,建议先将上篇的操作步骤执行完再阅读本篇内容。

通过 Eclipse 创建基于 Maven 的 SpringBoot Web 项目,用于测试 Maven 构建项目

创建 Maven 项目的时候,Archetype 选择”maven-archetype-quickstart”,此 SpringBoot Web 项目不需要 web.xml,只需在 pom.xml 配置文件里指定 packaging 为 war 类型即可。项目内容很简单,访问 JSP 页面直接输出字符串 “hello Jim”。项目源码下载链接已经给出,下载解压后直接导入项目到 Eclipse,执行”spring-boot:run” 命令即可运行项目,浏览器输入以下地址验证是否运行正常:http://127.0.0.1:8080/demo/hello点击下载完整的代码点击下载 SHA256 校验文件

jenkins-springboot-maven-project

在 Eclipse 里创建 SVN 资源库,并将 SpringBoot Web 项目的源码提交 SVN 资源库

这里的 SVN 资源库是上一篇教程里创建的 Subversion 仓库 jenkins-repo,访问的用户名是 jenkins,密码是 123456;因为宿主机与 Docker 容器(SVN)配置了端口映射,因此 Eclipse 里可以直接使用以下 URL 访问对应的 SVN 仓库: http://127.0.0.1:9126/svn/jenkins-repo

jenkins-eclipse-create-repo

将 jenkins-study 项目的源码提交到 SVN 资源库后的目录结构

jenkins-eclipse-commit-repo

Jenkins 创建任务

jenkins-create-job

选择 “构建自有风格的软件项目”

jenkins-create-job2

找到 “Source Code Management”,选择 “Subversion”,点击”Add” 按钮,添加访问 SVN 仓库 jenkins-repo 的用户名和密码

jenkins-create-job4

在 “Source Code Management” 中继续填写 jenkins-study 项目所在 SVN 仓库 jenkins-repo 完整的 URL 地址,选择上面添加的 SVN 仓库用户名和密码;构建类型选择 “Invoke top-level Maven targets”,而 Maven 版本则选择之前在 “全局工具配置” 中指定的 Maven 版本,构建命令填 “clean install”,最后保存设置内容。特别注意,如果这里的 URL 地址使用 SVN 协议,那 Jenkins 将会提示无效 URL 的错误信息,因此需要使用 HTTP 协议来访问 SVN 仓库,同时完整的 URL 地址必须包含 Maven 项目的名称,因为 Jenkins 默认会去找 URL 地址下的 pom.xml 文件。使用 HTTP 协议访问的前提是 Subversion 集成了 Web 服务,具体教程在这里,通过 Apache、Subversion 搭建 SVN 服务器,实现使用 HTTP/SVN 协议访问 SVN 仓库

1
2
3
4
5
6
7
8
# 因为SVN服务安装在Docker容器内(基于Debian镜像),Jenkins同样也安装在Docker容器内(基于Tomcat镜像),因此下图URL中的IP是SVN服务所在Docker容器的IP。因为之前在Docker容器内安装Subversion并集成了Apache,而Apache默认端口是80,所以下图的URL地址可以不指定具体的端口。

# 获取SVN服务所在Docker容器的IP地址
# docker exec -it svn-httpd ip addr
111: eth0@if112: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

jenkins-create-job3
jenkins-create-job5
jenkins-create-job6

手动对之前的 jenkins-study 项目执行构建操作

构建过程中,Jenkins 默认会从 SVN 仓库检出对应的项目源码到 ~/.jenkins/workspace 目录(Jenkins 所在服务器的文件目录),同时在 Jenkins 构建任务页面左边的小窗口内可以看到相关构建信息(构建进度、日志等)。第一次构建过程耗时会比较长,因为 Maven 需要从中央仓库下载很多依赖包;如果想加快构建速度,局域网内可以通过 Nexus 搭建 Maven 本地仓库,然后在 Maven 的配置文件 settings.xml 中添加本地仓库的地址。

jenkins-job-build
jenkins-job-build2
jenkins-job-build3

配置构建完成后将 War 包部署到 Tomcat 应用服务器

这里的 Tomcat 应用服务器,一般指测试服务器或者生产服务器。由于 Jenkins 需要将 War 部署到 Tomcat 服务器上,因此这里的 Tomcat 服务器需要预先需要配置管理员用户。先找到”Post-build Actions” 配置项,选择”Add post-build action” –> “Deploy war/ear to a container(依赖 deploy to container 插件)”,然后填写 War 包文件的相对路径、访问 Tomcat 项目时使用的项目名称。接着选择”Add Container” –> “Tomcat 8.x”,点击 “Add” 按钮,填写 Tomcat 服务器管理员用户的用户名和密码、访问 Tomcat 服务器的 URL 地址,然后点击 “Save” 按钮保存设置。最后再次执行构建操作,构建完成后可以查看构建日志或者在浏览器输入以下地址,验证构建生成的 War 包文件是否成功部署到指定的 Tomcat 服务器上,浏览器可以访问 URL:http://127.0.0.1:8082/jenkins-study/demo/hello

jenkins-job-deploy0
jenkins-job-deploy
jenkins-job-deploy2
jenkins-job-deploy3

配置远程触发构建

找到”Build Triggers” 配置项,勾选”Trigger builds remotely”,填写 Token 的值(任意字符串),最后点击”Save” 按钮保存设置。通过浏览器或者 CURL 工具访问链接 http://127.0.0.1:8888/jenkins/job/jenkins-study/build?token=yOEBc7Dcd4duKSNt ,测试远程触发构建是否配置成功;其中 http://127.0.0.1:8888/jenkines 是访问 Jenkins 服务器的 URL 地址。构建成功后,在 Jenkins 构建任务页面左边的小窗口(构建历史)内可以看到新创建的构建历史。

jenkins-remote-build-trigger
jenkins-remote-build-trigger2

获取用户的 crumb 值,使用 CURL 命令触发远程构建时需要用到

一般来说,当在 Jenkins 内启用了” 防止跨站点请求伪造”,且通过 CURL 命令触发远程构建时才需要带上 crumb 值。下面先介绍如何获取某用户的 API Token,因为后续将用到 API Token 的值。
jenkins-crumb
jenkins-crumb2
jenkins-crumb3
jenkins-crumb4

1
2
3
4
5
6
7
8
9
10
11
# 浏览器输入以下地址获取某用户的crumb值,其中clay是用户名,115613e7bde4a846d49800f9e004cda2e4是上面获取得到的API Token
http://clay:115613e7bde4a846d49800f9e004cda2e4@127.0.0.1:8888/jenkins/crumbIssuer/api/xml

# 返回结果为某用户的crumb值
<defaultCrumbIssuer _class="hudson.security.csrf.DefaultCrumbIssuer">
<crumb>a2088f0de8aca0d5a05079eed6ea972a</crumb>
<crumbRequestField>Jenkins-Crumb</crumbRequestField>
</defaultCrumbIssuer>

# 以后触发Jenkin远程构建时需要携带的请求消息头为以下值
Jenkins-Crumb:a2088f0de8aca0d5a05079eed6ea972a

通过 CURL 命令触发远程构建

1
2
3
4
5
6
7
# 首先按照上面的操作,配置远程触发构建,并获取某用户的crumb值

# 命令的格式
# curl -X post -v -u [Jenkins 用户名]:[Jenkins 密码] -H "请求消息头信息" http://[Jenkins 服务器IP地址]:[Jenkins 服务器端口号]/jenkins/job/[Jenkins 项目名称]/build?token=[API Token]

# 完整的CURL命令,构建成功后在Jenkins构建任务左边的小窗口(构建历史)内可以看到新创建的构建历史
# curl -X post -v -u clay:123456 -H "Jenkins-Crumb:a2088f0de8aca0d5a05079eed6ea972a" http://127.0.0.1:8888/jenkins/job/jenkins-study/build?token=yOEBc7Dcd4duKSNt

配置 SVN 钩子程序

1
2
3
4
5
6
7
8
9
10
11
12
13
# 连接Docker容器(SVN)
# docker exec -it jenkins-svn-httpd /bin/bash

# 进入SVN仓库jenkins-repo的hooks目录,并创建钩子程序(不带.tmpl后缀),然后赋予可执行的权限
# cd /var/lib/svn/jenkins-repo/hooks
# cp post-commit.tmpl post-commit
# chmod 755 post-commit

# 编辑post-commit文件,将文件原有的内容都注释掉,然后在文件末尾追加CURL命令
# 注意,由于SVN与Jenkins服务都部署在Docker容器内,因此这里CURL命令中的服务器IP不能是127.0.0.1,必须是Jenkins服务所在Docker容器的IP
# vim post-commit
# "$REPOS"/hooks/mailer.py commit "$REPOS" $REV "$REPOS"/mailer.conf
# curl -X post -v -u clay:123456 -H "Jenkins-Crumb:a2088f0de8aca0d5a05079eed6ea972a" http://127.0.0.1:8888/jenkins/job/jenkins-study/build?token=yOEBc7Dcd4duKSNt

验证 SVN 钩子程序是否生效

Eclipse 内修改 Maven 项目 jenkins-study 的代码,然后将代码提交到 SVN 仓库,观察 Jenkins 构建任务页面左边的小窗口(构建历史)内是否有新构建历史出现,如果有则说明 SVN 钩子程序生效了。

Jenkins 常规构建流程总结

jenkins-process

下篇:Jenkins 入门教程之四 Jenkins 与 Git 持续集成实战