【Jenkins 学习笔记】玩转持续集成与持续交付

【本文目录】


1 Jenkins 概述

Jenkins 是一个开源软件项目,是基于Java开发的一种可拓展持续集成工具,主要用于持续、自动地构建 / 测试 / 集成软件项目以及监控一些定时执行的任务

Jenkins拥有的特性包括:

  • 易于安装,只要把 jenkins.war 部署到 Tomcat 即可运行
  • 易于配置,所有配置都是通过其提供的 web 界面实现
  • 集成 RSS/E-mail,通过 RSS 发布构建结果或当构建完成时通过 e-mail 通知
  • 生成 JUnit / TestNG 测试报告
  • 分布式构建,支持 Jenkins 能够让多台计算机一起构建/测试
  • 文件识别,Jenkins 能够跟踪哪次构建生成哪些 jar,哪次构建使用哪个版本的 jar 等
  • 插件支持,支持扩展插件,你可以开发适合自己团队使用的工具

2 持续集成

持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。一个标准的持续集成系统能做到

  • 软件构建自动化:配置完成后,CI 系统会依照预先制定的时间表或者针对某一特定事件,对目标软件进行构建
  • 构建可持续的自动化检查:CI 系统能持续地获取新增或修改后嵌入的源代码,也就是说,当软件开发团队需要周期性的检查新增或修改后的代码时,CI 系统会不断确认这些新代码是否破坏了原有软件的成功构建。这减少了开发者们在检查彼此相互依存的代码中变化情况需要花费的时间和精力
  • 构建可持续的自动化测试:构建检查的扩展部分,构建后执行预先制定的一套测试规则,完成后触发通知(Email,RSS等等)给相关的当事人
  • 生成后后续过程的自动化:当自动化检查和测试成功完成,软件构建的周期中可能也需要一些额外的任务,诸如生成文档、打包软件、部署构件到一个运行环境或者软件仓库。这样,构件才能更迅速地提供给用户使用。

部署一个 CI 系统需要的最低要求是,一个可获取的源代码的仓库,一个包含构建脚本的项目。下图概括了CI系统的基本结构:

该系统的各个组成部分是按如下顺序来发挥作用的:

  • 1、开发者检入代码到源代码仓库
  • 2、CI 系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区
  • 3、CI 系统会在对应的工作区内执行构建过程
  • 4、(配置如果存在)构建完成后,CI 系统会在一个新的构件中执行定义的一套测试。 完成后触发通知(Email,RSS 等等)给相关的当事人
  • 5、(配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如服务器)或存储为软件仓库中的一个新版本。软件仓库可以是 CI 系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像 Java.net、 SourceForge 之类的网站
  • 6、CI 系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件

而 Jenkins 就是这样一个 CI 系统


3 JavaEE 项目部署方式对比

手动部署

自动部署

“自动化” 的具体体现:向版本库提交新的代码后,应用服务器上自动部署,用户或测试人员使用的马上就是最新的应用程序

搭建上述持续集成环境可以把整个构建、部署过程自动化,很大程度上减轻工作量。对于程序员的日常开发来说不会造成任何额外负担——自己把代码提交上去之后,服务器上运行的马上就是最新版本——一切都发生在无形中


4 Jenkins + Git 持续集成环境搭建

4.1 系统结构总述

  • 创建虚拟机安装 Linux 系统(这里用的 Ubuntu 16.04 64位)
  • 版本控制子系统
    • GitHub 服务器
    • 项目对应版本库
    • 版本库中钩子程序
  • 持续集成子系统
    • JDK
    • Tomcat
    • Maven
    • Jenkins
      • 主体程序
      • Maven 插件
      • Deploy to Web Container 插件

4.2 测试项目 与 版本控制子系统

使用 IDEA 创建一个 基于 Maven 的 JavaWeb 项目并上传到 GitHub 中(我已经将项目上传到 https://github.com/laiyuancai/HelloWorld

至于怎么创建项目和上传到 GitHub 这里就不一 一赘述了,下面给出参考网址

4.3 应用发布子系统

即创建一个 Linux 虚拟机,并安装好 jdk、maven、git 、Tomcat。这里也不一 一赘述了,下面给出参考网址

4.4 Jenkins 主体程序安装配置

首先 下载 Jenkins ,将 jenkins.war 放在 Tomcat 的解压目录下的 /webapps 目录下

启动 Tomcat 并访问 http://虚拟机IP:8080/jenkins

依照网页上的提示填入文件内容(也是 admin 的密码),点继续

选择【安装推荐的插件】

如果某些插件安装失败,重试即可。接着可以新建账号或者以管理员身份继续,这里新建一个管理员账号

开始使用 Jenkins !

4.5 系统初始化设置

点击左侧【系统管理-全局安全配置】

点击左侧【系统管理-全局工具配置】,设置 Maven 的 settings.xml 的默认路径和全局默认路径,JDK 的别名和环境变量 JAVA_HOME (注意去掉自动安装的勾选),Git 的别名和 Git 的可执行文件路径(注意去掉自动安装的勾选)

继续在全局工具配置页面,配置 Maven 的路径,最后点击【保存】(如果有 Gradle / Docker 的可以继续配置)

4.6 安装插件

点击【管理插件】,然后选择【可选插件】,找到【Deploy to container】,选择【直接安装】

4.7 创建工程

1、点击【新建任务】,输入项目名称,选择【构建一个自由风格的软件项目】,最后点【确定】

2、确定之后来到项目设置页面,点击【源码管理】,选择 【Git】,首先填入仓库的 URL ,然后点击 【Add】,选择【jenkins】,添加 GitHub 的账号密码,然后选择你所添加的 GitHub 的【凭证】

PS:这里指定的仓库地址是要定位到【pom.xml】文件所在的文件夹,因为 Jenkins 就是到项目根目录下查找【pom.xml】的

3、点击项目设置页面中的【构建】,选择【Invoke top-level Maven targets】

然后选择指定 Maven 的版本,最后在【Goals】中指定执行的 Maven 构建命令

4、点击项目设置页面中的【构建后操作】,选择【Deploy war/ear to a container】

在【WAR/EAR files】中填入 war 包以项目根目录为基准的相对路径,然后【Context path】中填入浏览器访问项目时使用的项目名,然后点击【Add Container】指定一个容器,并添加 Tomcat 的登录凭证,指定 Tomcat URL

最后点击【保存】

5、保存之后来到了项目界面,目前不能点工作区,因为里面没有文件。我们先点【立即构建】生成工作区

PS:在 jenkins 中,其使用天气状况来表示构建成功率

6、点击项目中的【配置-构建触发器】

远程触发的基本原理是 Git 服务器给 Jenkins 项目特定的 URL 地址发送请求, 但必须以请求参数的形式携带一个特定值,这个特定值就是这里的 “身份验证令牌”

假设

那么最终的访问地址就是:http://192.168.70.131:8080/jenkins/job/HelloWorld/build?token=CLOUD_TOKEN

触发访问地址中 Jenkins 访问地址是根据实际情况改变的,项目名称根据实际 情况改变, 其他都不变

4.8 编辑 Git 版本库钩子程序

现在,只要我们修改了项目文件之后,然后提交到 GitHub 中,jenkins 的自动构建与部署就会自动触发,现在直接刷新 http://192.168.70.131:8080/HelloWorld 就可以看到我们修改的结果啦