使用Jenkins实现项目持续集成部署
十多年前,敏捷开发人员开始拥抱并促进测试驱动的开发和持续集成(CI)。利用这些技术,只要开发人员将源代码检查到源存储库中,我们就可以自动构建源代码,执行详尽的单元测试套件以确保应用程序正常运行。许多测试驱动的开发人员也开始在辅助CI流程中进行集成测试和性能测试。
通过持续集成,我们可以比前几年更快地发现错误并更快地发布代码。毫不夸张地说,CI驯服了构建和部署周期的“构建”方面。如今,许多开发团队已经从CI转移到CD,CD代表持续交付或持续部署。无论使用哪种名称,CD都是将软件从代码检入转移到暂存甚至生产部署的过程。
这部分开源Java项目引入了与领先的CI / CD自动化服务器Jenkins的持续集成。我们将首先概述CI和CD过程,然后使用Maven和Jenkins设置Java Web项目。这里,将学习如何使用JUnit在Jenkins中构建和对项目进行单元测试,以及如何对构建失败进行故障排除。
CI / CD简介
在连续的集成过程中,可以自动签出,构建,测试各种方式将已检入源代码存储库中的代码,然后发布到存储库中。为了使连续集成正常工作,您需要像Jenkins这样的CI服务器,它可以监视源代码存储库中的新更改并以可配置的方式做出响应。
以使用Maven构建的Java应用程序为例。在检测到代码更改时,您的CI服务器可以通过执行来响应mvn clean install。在典型的Maven构建配置中,它将作为构建命令的一部分执行一组新的单元测试。在构建源代码时,服务器可以执行任意数量的其他操作:
提交的代码通过单元测试后,将功能分支合并回主分支或主分支。
执行静态代码分析,例如代码覆盖率,代码复杂性,常见错误检查等。
将构建工件发布到存储库,例如Artifactory或Sonatype Nexus
将您的应用程序部署到集成测试环境
执行集成测试
将您的应用程序部署到性能测试环境
对您的应用程序执行负载测试
将您的应用程序部署到用户验收测试环境(UAT)
将您的应用程序部署到生产环境
这些步骤是您可以在CI / CD流程中执行的所有类型的活动。CI通常包含开发生命周期的构建和测试阶段,而CD则将该过程扩展到将构建工件部署到服务器以进行测试。在某些环境中,CD一直到生产。
连续集成通常使用Jenkins,Bamboo或TeamCity之类的工具完成,该工具将构建步骤编排到集成管道中。Jenkins可能是最受欢迎的CI / CD产品,它与Docker搭配得很好。
Jenkins简介
Jenkins是一个基于Java开发的开源软件项目,用于支持构建、部署和自动化任何项目。在实际开发中,通常将他作为项目的持续集成、部署工具来使用,其使用场景可以通过一张图来表达,如图所示。
在图中,Jenkins进行项目集成管理的流程如下。
(1)开发人员将更改后的代码提交到代码仓库中(如GitHub);
(2)持续集成工具Jenkins会定期(或人工手动)从代码仓库拉取指定项目;
(3)Jenkins工具会根据具体配置,自动化打包、构建镜像、推送镜像,并最终生成Docker容器来启动服务,形成对应的测试环境;
(4)测试人员会在对应的测试环境下测试Jenkins自动化集成、部署的服务;
(5)当项目测试成功后,可以使用Jenkins工具将测试成功的项目自动构建到发布环境下,也可以人工手动部署到发布环境下。
当使用Jenkins后,无需人工操作就可以自动化完成项目的持续集成和部署,这对于实际项目开发来说,有着极大的好处。
Jenkins安装
Jenkins官网提供了多种安装方式,包括基于Java的war包,Linux、MacOS和Windows系统等方式。这里我们选择比较通用的war包方式为例,在集群管理节点manager1机器上安装一个Jenkins工具(由于Jenkins是由java开发的,所以在安装Jenkins之前要确保已安装了JDK并配置了系统环境),具体步骤如下。
1.下载Jenkins
在浏览器中输入Jenkins官网地址https://jenkins.io/download/访问其下载页面,选中页面中Long-term Support (LTS,长期支持)版本最下方的Generic java package(.war),进行Jenkins的war包下载,如图所示。
2.启动Jenkins服务
将下载好的jenkins.war放到manager1机器中的某个目录下,直接使用如下指令即可启动Jenkins服务。
$ java -jar jenkins.war --httpPort=49001
执行上述指令后,就会在Linux系统上通过war包的方式启动Jenkins服务。
需要注意的是,Jenkins内部默认配置的端口是8080(这与开发中很多端口有冲突),所以我们在启动Jenkins服务时,使用--httpPort参数指定了服务启动的端口为49001。
3.Jenkins初始化安装
通过浏览器访问地址http://192.168.197.143:49001就可以正式访问Jenkins服务,在首次安装访问Jenkins时,会涉及到Jenkins的初始化安装,具体说明如下。
(1)初始化认证密码
在Jenkins首次启动并访问时需要一个认证密码,该密码在Jenkins初次启动时会自动生成并存储在jenkins目录的某个文件中(初始化页面会有提示,本示例中的初始化密码存储位置在/home/manager1/.jenkins/secrets/initialAdminPassword文件中),输入指定密码后,单击右下角的“Continue”按钮即可,其效果如图所示。
(2)初始化插件安装
输入初始化认证密码后,会进入一个Jenkins插件定制安装界面,这也是首次启动访问Jenkins时会出现的页面,页面中会提供Install suggested plugins(安装建议插件)和Select plugins to install(自行选择插件安装)两种方式,如图所示。
通常情况下,都会选择左侧的Install suggested plugins进行初始化插件安装,然后Jenkins服务就会进入插件安装过程。
(3)创建管理员用户
当完成上一步初始化插件安装后,页面会自动跳转到一个Create First Admin User(创建管理员用户)的页面,需要输入管理员信息,其效果如图所示。
在该页面编辑好管理员信息后,单击右下角的“Save and Finish”按钮,就完成了Jenkins的初始化操作,然后在后续页面中单击“Starg using Jenkins”按钮就可以正式进入Jenkins主页面,其效果如图所示。
到达该主页面后,就表示Jenkins安装及初始化完毕。
10.1.1 Jenkins的集成插件配置
Jenkins安装完成后,如果想要完成项目的自动化持续集成和部署工作,那么就需要针对与项目有关的软件进行安装和配置,该配置过程具体如下。
1.安装Maven插件
因为我们之前创建的微服务是Maven项目,在使用Jenkins时也需要创建一个Maven项目进行持续集成,所以这里需要配置Maven插件。
依次单击主页面的“系统管理”à“插件管理”à“可选插件”面板,然后在右侧搜索框输入“Maven Integration plugin”关键字进行搜索。搜索出结果后,选中该插件,并单击下方的“直接安装”按钮即可进行Maven插件安装,其效果如图所示。
2.系统全局插件配置
完成所需插件的安装后,必须在Jenkins上进行全局插件配置,这样才能让Jenkins与其他软件关联工作,这里配置的全局插件主要有JDK(项目编译工具)、Git(代码仓库GitHub管理工具)、Maven(项目打包工具)和Docker(项目部署工具)。
依次单击主页面的“系统管理”=>“ Global Tool Configuration”面板,进入全局插件配置页面,然后根据整个项目从拉取代码到部署服务所需要的工具进行配置,各个插件工具的配置效果分别如图所示。
需要说明的是,由于Jenkins中对Git已经有了默认配置,所以我们不需要做任何修改(当然也可以参考其他工具的配置方式配置自定义安装的Git工具);JDK和Maven配置的路径则是10.3.1小节中搭建基础环境时对应的路径;Docker的路径也是manager1机器上安装的Docker路径(可以通过whereis docker指令查看,默认配置路径为/usr/lib/docker)。这里所有工具的名称都可以自行定义。
完成全局工具配置后,单击左下角的“Save”按钮就会跳转到Jenkins主页面。至此,Jenkins中的插件配置就已经完成。
服务自动化部署
完成Jenkins的安装配置后,就可以使用Jenkins工具来自动化集成、部署微服务项目了,其具体使用方式如下。
1.构建新任务
在Jenkins主页面,单击左侧的“新建”按钮,将会跳转到任务构建界面,其效果如图所示。
在任务构建页面中填写需要自动化集成、部署的任务名称,然后选中“构建一个maven项目”,最后单击“OK”按钮就会自动跳转到该任务配置页面,如图所示。
从图中框选部分内容可以看出,想要使用Jenkins完成自动化构建、部署工作,还需要对构建任务分步骤进行配置,其主要配置项的配置步骤如下。
(1)配置源码仓库地址
使用Jenkins自动构建任务,就需要从源码仓库(这里使用的是GitHub)自动拉取此次构建任务的项目源码。在“源码管理”中选择“Git”,并在“Repository URL”中输入需要部署的项目所在的GitHub源码地址,如图所示。
(2)构建触发器
构建触发器就是构建任务时的触发规则,用来规定什么时候触发任务的构建。其具体情形如图所示。
从图可以看出,Jenkins构建触发器提供了多种构建规则,这里针对其中常用的3种构建规则进行介绍,具体如下。
l Build periodically:表示在某个时间点进行自动任务构建,比如“H 2 * * *”表示每天凌晨2点开始执行项目构建(不管项目是否更新);
l Poll SCM:表示每隔一段时间会自动检查更新进行任务构建,比如“*/10 * * * *”表示每10分钟开始检查源码,如果有更新就自动执行构建。
l 当默认没有进行构建触发器配置时,我们可以在对应的任务面板中选择“立即构建”按钮,可以随时进行手工触发任务构建。
(3)服务发布配置
任务构建完成后,可以配置服务部署指令。此示例中,我们将会自动把整个服务项目自动部署到集群环境下,因此这里就需要进行服务发布配置,其效果如图所示。
在Post Steps(服务发布配置)页面,选择“Add post-build step”下拉列表中的“Execute shell”选项,并在命令框中输入需要发布服务的shell指令。为了确保集群环境下服务的正常部署,需要确认集群已经开启并且已经预先自定义好指定网段的网络,同时还要在集群管理节点进行私有仓库登录认证。
完成上述所有步骤的配置后,单击左下角的“保存”按钮就会跳转到该任务主页面,效果如图所示。
另外,关于构建任务配置界面中的其他步骤,如果有需要,还可以进行相应的配置,这里就不作详细介绍了。
2.自动化部署服务
在任务构建配置页面的构建触发器配置中,如果配置了定期自动构建服务,就不需要再做任何工作了,该构建任务会在指定的触发规则下进行任务的自动构建和部署工作。
为了演示Jenkins自动构建、部署服务的效果,单击任务主界面左侧的“立即构建”按钮后,会触发一次立即构建项目的动作,然后整个服务就会进入自动构建过程。此时我们可以单击“构建历史”中的倒三角,选择“Console Output”选项来查看整个构建过程的输出信息,如图所示。
选择进入任务对应的Console Output输出信息页面后,效果如图所示。
该任务初次自动化构建过程会需要一定的时间,当整个任务构建并发布完成后,Console Output控制台就会有构建成功或者失败的提示信息。
最终Console Output控制台打印出“Finished:SUCCESS”信息,这就表明通过Jenkins自动集成的服务项目已构建并部署成功。