1987WEB视界-分享互联网热点话题和事件

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

微服务架构实战:使用Jenkins实现自动化构建

1987web2023-10-06WEB开发55
使用Jenkins实现自动化构建

使用Jenkins实现自动化构建

一个大型平台的微服务架构设计通常会产生很多项目工程,因此会有很多服务和应用需要部署,并且需要不断地迭代和更新,这是一个庞大的工程,所以我们需要借助自动化工具,实现各个微服务工程的CICD工作流程。

CICD是持续集成(Continuous Integration)和持续部署(Continuous Deployment)的总称,是指通过自动化的构建、测试和部署,实现软件产品可循环使用的快速交付流程。

Jenkins是一个基于Java开发的功能强大的自动化构建工具,并且有一个非常丰富的插件仓库,可以很好地扩充和丰富其本身的功能。因此,Jenkins是实现自动化构建的一个很不错的工具。

单击Jenkins首页上的Plugins选项,可以查看各种插件的介绍,如图15-1所示。

本章我们使用Jenkins,结合Maven、Docker、Selenium和JMeter等工具,建立一个可持续交付的自动化设施。

持续交付工作流程

从代码提交开始,建立一个包括自动测试和自动部署的持续交付工作流程如图15-2所示。

这个工作流程的步骤如下所示:

(1)开发者向GitLab提交代码。

(2)GitLab使用 WebHook通知Jenkins有代码更新。

(3)Jenkins 从节点(Slave)拉取代码,打包并构建镜像。

(4)Jenkins使用从节点上构建的镜像运行测试用例。

(5)如果测试(Test)通过,则将镜像推送到镜像仓库。

(6)Jenkins在应用服务器上进行更新部署。

(7)Jenkins将构建报告以邮件方式通知开发者。

在开发者向代码库提交代码之后,整个流程都是自动进行的。如果中间某个环节出现错误,则中止流程的执行,并将结果通知相关人员。提交的代码不仅包括应用程序,还包括构建镜像的脚本、测试用例的脚本和部署的编排脚本等。

其中,各个步骤的操作可以使用插件或直接在命令行中使用各种工具来完成。

例如,拉取项目代码会用到Git插件;打包项目会用到 Maven;构建镜像和应用部署可直接通过命令行使用Docker或docker-compose;集成测试可通过命令行执行由Selenium、JMeter等生成的脚本。

下面,我们通过一个简单的案例,演示和说明Jenkins 的使用方法。

Jenkins的安装

下面的安装过程以MacOS为例进行说明。

因为Jenkins需要JVM的支持,所以请确保机器上已经安装了JDK 1.8或以上版本。为了完成后面的自动化演示,请确保机器中已经安装了Maven、Git客户端和 Docker等。

打开Jenkins官网,进入下载页面,选择左边的LTS稳定版中的Mac OSX版本进行下载,如图15-3所示。

下载完成后,单击安装包jenkins-2.89.1.pkg开始安装。

安装过程比较简单,直接单击继续按钮,按提示使用系统推荐使用的插件即可。安装完成后,通过下列网址打开本地的Jenkins控制台:

http://localhost:8080

第一次打开后会看到如图15-4所示页面。

按图15-4的提示打开管理员密码文件,把密码复制并粘贴到密码输入框中,单击右下角的Continue 按钮。如果密码验证成功,则会提示读者创建一个操作员用户。在创建用户之后,即可登录Jenkins控制台。新用户登录的欢迎界面如图15-5所示。

Jenkins的基本配置

由于要用到Maven编译和打包,所以单击欢迎界面的系统管理→全局工具配置选项,如图15-6所示,打开全局工具配置对话框。

在全局工具配置对话框中单击Maven安装选项,配置一个名字,并设置Maven的安装路径,如图15-7所示。

单击图15-6中的管理插件选项,从弹出的对话框中单击可选插件选项,找到Maven Invoker plugin插件,勾选后单击直接安装按钮,如图15-8所示。

注意,在设置settings.xml配置中的repositys路径时,如果是在本机测试,则最好与IDEA的配置相同,这样打包时将不用再重新下载一次依赖包。

在Jenkins的命令行配置中,为了能够正常使用Docker 和 docker-compose,我们需要对Jenkins的系统权限进行设置。因为Jenkins 使用默认用户jenkins开启服务,所以权限设置就是为这个用户进行授权。

通过如下操作步骤,为jenkins用户设置一个免密码配置,这样,在Jenkins 的命令行配置中,就可以使用超级管理员的命令sudo了。

在MacOS的终端中,执行下列命令,切换到超级管理员root

输入root的密码:

appledeMacBook-Air:/ apples suPassword:

编辑sudoers,并找到如下所示信息:

sh-3.2vi/etc/sudoers
root and usersingroup wheel can run anything onanymachineasanyuserroot
ALL = (ALL) ALL
%admin
ALL- (ALL) ALL

在上面信息的后面,参照root的权限设置,添加如下所示的配置并保存:

jenkinsALL=(ALL)NOPASSWD:ALL%adminALL=(ALL)NOPASSWD:ALL

使用dscl命令把jenkins用户加进 admin用户组中,这个命令等同于Linux操作系统中的usermod命令:

sh-3.2dscl . -append /Groups/admin GroupMembership jenkins

至此,就完成了Jenkins的权限设置。

Jenkins的自动部署实例

为了演示Jenkins的使用,下面创建一个自动部署实例。

在这个实例中使用的是一个功能非常简单的项目,项目中只有一个主程序,代码如下所示

@SpringBootApplication@RestControllerpublicclassDemoApplication{publicstaticvoidmain(String[] args){
SpringApplication.run(DemoApplication.class,args);
}@RequestMapping(value ="/")publicStringindex(){return"Hello world! ";
}
}

应用启动后,打开首页将输出Hello World!。

下面介绍这个自动部署项目的实现过程。

创建任务

在Jenkins首页中单击新建选项,打开创建任务页,如图15-9所示。

输入任务名称demo,并选择构建一个自由风格的软件项目选项,单击确定按钮,即可创建一个空任务,如图15-10所示。

配置任务

在图15-10中,单击源码管理选项,显示如图15-11所示对话框。在图15-11中勾选Git选项,在代码库的地址栏中输入demo项目的存放地址。

因为这是一个公开项目,所以不用设置访问项目的权限。如果是一个私有项目,则必须在图15-11的Credentials中配置对项目有存取权限的用户名和密码。

单击图15-11中的构建触发器选项,在构建触发器对话框中勾选Poll SCM选项,配置一个定时任务的日程表,如图15-12所示。

图15-12中的日程表00 20***,表示在每天的20:00点整执行任务构建。在本实例中不使用定时任务。

接下来,使用 Maven 配置项目的打包。单击构建选项,在增加构建步骤下拉列表中选择Invoke top-level Maven targets选项,如图15-13所示。

其中,在Maven Version中选择前面安装的Maven,在Goals中输人如下所示的打包命令:

cleanpackage

配置创建镜像和部署的操作命令,这里会用到Dockerfile和 docker-compose.yml,这两个文件已经包含在项目工程的docker目录中。

Dockerfile中的内容如下所示:
FROM java:8VOLUME/tmp
ADDdemo-0.0.1-SNAPSHOT.jar app.jar
RUN bash 一ctouch /app.jarEXPOSE8080
ENTRYPOINT
,"/app.jar"]
["java","-Djava.security.egd=file:/dev/./urandom","-jar

docker-compose.yml中的部署脚本如下所示:

demo:build:ports:"8888:8080"

单击构建选项,在增加构建步骤下拉列表中选择Execute shell选项,在Command"中输入如下所示命令:

cd/Users/Shared/Jenkins/Home/workspace/demo /dockercp-f ../target/demo-0.0.1-SNAPSHOT .jarsudo/usr/local/bin/docker-compose down --rmi allsudo/usr/local/bin/docker-compose up -d

这些命令与我们在主机上直接使用Docker等工具部署应用的命令相同,即先停止正在运行的容器,再删除容器和镜像,最后重新进行部署,如图15-14所示。

执行任务

当手动执行任务时,首先单击任务的名称,返回任务首页。然后在任务首页中单击左侧菜单中的立即构建选项即可,如图15-15所示。

在任务执行过程中,会在控制台中输出信息,一个完整的执行过程的输出日志如下所示

Startedbyusermr.csjBuildinginworkspace/Users/Shared/Jenkins/Home/workspace/demo>gitrev-parse--is-inside-work-treetimeout=10FetchingchangesfromtheremoteGitrepository>gitconfigremote.origin.urlhttps://gitee.com/chenshaojian/demo.gittimeout=10Fetchingupstreamchangesfromhttps://gitee.com/chenshaojian/demo.git>git--versiontimeout=10>gitfetch--tags--progresshttps://gitee.com/chenshaojian/demo.git+refs/heads/*:refs/remotes/origin/*>gitrev-parserefs/remotes/origin/master^{commit]timeout=10>gitrev-parserefs/remotes/origin/origin/master"{commit}timeout=10CheckingoutRevision1b0348a999cee3a1920b1b20576b54e58a50ab2(refs/remotes/origin/master)>gitconfigcore.sparsecheckouttimeout=10>gitcheckout-f 1b0348a999cee3a1920b1b2c576b54e58a50ab2Commit message:"add docker-compose">gitrev-list8791f0a371ab67a83d1005197744475de5f177dftimeout=10[demo]$/Users/apple/apache-maven-3.5.0/bin/mvn clean package[INFO]Scanningforprojects...[INFO][INFO]-------------[INFO]Buildingdemo0.0.1-SNAPSHOT[INFO][INFO][INFO]---maven-clean-plugin:2.6.1:clean(default-clean)&demo---[INFO]Deleting/Users/Shared/Jenkins/Home/workspace/demo/target[INFO][INFO]---maven-resources-plugin:2.6:resources(default-resources)&demo-[INFO]UsingUTF-8encodingtocopyfilteredresources.[INFO]Copying1resource[INEO]Copying0resource[INFO][INFO]---maven-compiler-plugin:3.1:compile(default-compile)demo---[INFO]Changesdetected-recompilingthemodule![INFO]Compiling1sourcefileto/Users/Shared/Jenkins/Home/workspace/demo/target/classes[INEO][INFO]---maven-resources-plugin:2.6:testResources(default-testResources)edemo---[INFO]UsingUTF-8encodingtocopyfilteredresources.[INFO]skipnonexistingresourceDirectory/Users/Shared/Jenkins/Home/workspace/demo/src/test/resources[INFO][INFO]---maven-compiler-plugin:3.1:testCompile(default-testCompile)Cdemo[INFO]Changesdetected-recompilingthemodule![INFO]Compiling1sourcefileto/Users/Shared/Jenkins/Home/workspace/demo/target/test-classes[INEO][INFO]---maven-surefire-plugin:2.20:test(default-test)Cdemo---[INFO]Testsareskipped.[INFO][INFO]---maven-jar-plugin:2.6:jar(default-jar)demo--[INFO]Building jar:/Users/Shared/Jenkins/Home/workspace/demo/target/demo-0.0.1-SNAPSHOT.jar[INFO][INFO]---spring-boot-maven-plugin:1.5.8.RELEA.SE:repackage(default)demo[INFO][INEO]BUILDSUCCESS[INFO][INFO]Totaltime:5.095s[INFO]Finished at:2017-10-30T16:18:18+08:00[INFO]FinalMemory:29M/182M[INFO][demo]$/bin/sh-xe/Users/Shared/Jenkins/tmp/jenkins4696633078670494346.sh+cd/Users/Shared/Jenkins/Home/workspace/demo/docker+cp-f../target/demo-0.0.1-SNAPSHOT.jar.+sudo/usr/local/bin/docker-composedown--rmiallRemovingimagedocker_demoFailed to remove image for service demo:404 Client Error:NotFound("Nosuchimage: docker_demo:latest")+sudo/usr/local/bin/docker-composeup-dBuildingdemoStep 1/6 : FROM java:8--->d23bdf5b1b1bStep2/6:VOLUME/tmp--->Usingcache--->64c36a425bbfStep 3/6:ADDdemo-0.0.1-SNAPSHOT.jarapp.jar--->1788813d23d2step4/6:RUNbash-ctouch /app.jar--->Runningine4cfd4447b78--->2c44a754963bRemovingintermediatecontainere4cfd4447b78Step5/6:EXPOSE8080--->Runningin95b96954618e--->8bc53f642637Removingintermediatecontainer95b96954618eStep6/6:ENTRYPOINTjava-Djava.security.egd=file:/dev/./urandom-jar/app.:一-->Runninginal92a418f4f1--->3a27629ceba9Removingintermediatecontainera192a4184f1Successfullybuilt3a27629ceba9Successfully tagged docker demo:latestImageforservicedemowasbuiltbecauseitdidnotalreadyexist.Torebuithisimageyoumustuse`docker-composebuildordocker-compose up --buildCreating docker demo_1..
Creating docker_demo_1-[1A-[2K
Creating docker demo 1 ...一[ 32mdone-[Om--[1BFinished:sUCCESS

从控制台的输出日志中可以看到构建已经成功完成。这时,我们可以通过下面的网址打开应用运行的首页:

http://localhost:8888

从中可以看到我们预期的结果,即输出Hello World!,如图15-16所示。

在本节的输出日志中,有一个如下所示的错误提示:

+sudo/usr/local/bin/docker-composedown--rmiallRemovingimagedockerdemoFailedtoremoveimageforservicedemo:404ClientError:NotFound("No suchimage: docker demo: latest")

出现这个错误提示的原因是在第一次构建时,并不存在可以移除的镜像,但这并不影响整个构建过程的执行。

现在验证一下项目更新的自动化部署效果。首先将项目主程序的输出结果Hello World ! 改为Hello Jerkins! ,然后提交代码。完成之后,再在Jenkins 中单击立即构建选项,构建完成后,刷新访问应用的浏览器,即可看到如图15-17所示的效果。

再次查看控制台的输出日志,现在,移除镜像的命令已经不再显示错误,而是输出了如下所示的结果,表示已经停止了运行的容器,并移除了原来的容器和镜像:

+sudo/usr/local/bin/docker-composedown--rmiallStoppingdockerdemo1...-[1A-[2KStoppingdockerdemo1...-[32mdone-[Om-[1BRemovingdockerdemo1...一-[1A[2KRemovingdockerdemo1...-[32mdone-[Om一[1BRemovingimagedockerdemo

这里只是一个简单的自动部署的演示,在实际使用中,可以通过定时任务,或结合使用WebHook 的代码提交通知,实现自动部署。另外,还可以通过Selenium、JMeter等工具生成测试脚本,增加自动测试的功能。

小结

本章介绍了如何使用自动化构建工具Jenkins 设计持续交付的工作流程,并以一个简单的实例演示了自动部署的实现过程。在该实例中,我们使用Git进行代码拉取、使用 Maven进行程序打包、使用Docker进行镜像的创建和应用的更新与部署。从这个实例中可以看出Jenkins的强大的可扩展性。

通过对本章的学习,相信读者能够根据实际情况,建立一个完善的自动化基础设施,从而实现在微服务发布中集成测试和持续部署的自动化构建流程。

本文给大家讲解的内容是微服务架构实战:使用Jenkins实现自动化构建

  1. 下篇文章给大家讲解的是通用源码阅读mybatis源码详解:源码阅读的意义、方法;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

2、poll scm(轮询)配置

Jenkins的定时构建时间设置

Jenkins自带两种模式,来管理定时触发构建项目: