微服务架构实战:使用Jenkins实现自动化构建
wptr33 2024-11-17 02:41 35 浏览
使用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 su
Password:
编辑“sudoers”,并找到如下所示信息:
sh-3.2# vi/etc/sudoers
# root and users in group wheel can run anything on any machine as any userroot
ALL = (ALL) ALL
%admin
ALL- (ALL) ALL
在上面信息的后面,参照root的权限设置,添加如下所示的配置并保存:
jenkins ALL=(ALL) NOPASSWD: ALL
%admin ALL=(ALL) NOPASSWD: ALL
使用“dscl”命令把“jenkins”用户加进 admin用户组中,这个命令等同于Linux操作系统中的“usermod”命令:
sh-3.2# dscl . -append /Groups/admin GroupMembership jenkins
至此,就完成了Jenkins的权限设置。
Jenkins的自动部署实例
为了演示Jenkins的使用,下面创建一个自动部署实例。
在这个实例中使用的是一个功能非常简单的项目,项目中只有一个主程序,代码如下所示
@SpringBootApplication@RestController
public class DemoApplication {
public static void main (String[] args){
SpringApplication.run(DemoApplication.class,args) ;
}
@RequestMapping (value = "/")public String index(){
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”中输人如下所示的打包命令:
clean package
配置创建镜像和部署的操作命令,这里会用到Dockerfile和 docker-compose.yml,这两个文件已经包含在项目工程的docker目录中。
Dockerfile 中的内容如下所示:
FROM java:8
VOLUME/tmp
ADDdemo-0.0.1-SNAPSHOT.jar app.jar
RUN bash 一c'touch /app.jar'EXPOSE8080
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 /docker
cp -f ../target/demo-0.0.1-SNAPSHOT .jar
sudo /usr/local/bin/docker-compose down --rmi all
sudo /usr/local/bin/docker-compose up -d
这些命令与我们在主机上直接使用Docker等工具部署应用的命令相同,即先停止正在运行的容器,再删除容器和镜像,最后重新进行部署,如图15-14所示。
执行任务
当手动执行任务时,首先单击任务的名称,返回任务首页。然后在任务首页中单击左侧菜单中的“立即构建”选项即可,如图15-15所示。
在任务执行过程中,会在控制台中输出信息,一个完整的执行过程的输出日志如下所示
Started by user mr.csj
Building in workspace /Users/Shared/Jenkins/Home/workspace/demo>git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
>git config remote.origin.url https://gitee.com/chenshaojian/demo.git #timeout=10
Fetching upstream changes from https://gitee.com/chenshaojian/demo.git>git --version # timeout=10
>git fetch --tags --progress https://gitee.com/chenshaojian/demo.git+refs/heads/* :refs/remotes/origin/*
>git rev-parse refs/remotes/origin/master^ { commit] # timeout=10
>git rev-parse refs/remotes/origin/origin/master"{ commit}# timeout=10Checking out Revision 1b0348a999cee3a1920b1b20576b54e58a50ab2
(refs/remotes/origin/master)
>git config core.sparsecheckout # timeout=10
>git checkout-f 1b0348a999cee3a1920b1b2c576b54e58a50ab2Commit message: "add docker-compose"
>git rev-list 8791f0a371ab67a83d1005197744475de5f177df # timeout=10[demo]$/Users/apple/apache-maven-3.5.0/bin/mvn clean package
[INFO]Scanning for projects. . .
[INFO]
[INFO]-------------
[INFO] Building demo 0.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] Using 'UTF-8' encoding to copy filtered resources.
[INFO]Copying 1 resource
[INEO]Copying 0 resource[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) demo ---[ INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to
/Users/Shared/Jenkins/Home/workspace/demo/target/classes[INEO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) edemo ---
[INFO] Using 'UTF-8'encoding to copy filtered resources.[INFO] skip non existing resourceDirectory
/Users/Shared/Jenkins/Home/workspace/demo/src/test/resources[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile)Cdemo
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to
/Users/Shared/Jenkins/Home/workspace/demo/target/test-classes[INEO]
[ INFO] ---maven-surefire-plugin:2.20:test (default-test) C demo ---[INFO] Tests are skipped.
[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] BUILD SUCCESS[INFO]
[INFO]Total time: 5.095 s
[INFO] Finished at: 2017-10-30T16:18:18+08:00[INFO] Final Memory: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-compose down --rmi allRemoving image docker_demo
Failed to remove image for service demo:404 Client Error: Not Found ("No suchimage: docker_demo: latest")
+ sudo /usr/local/bin/docker-compose up -dBuilding demo
Step 1/6 : FROM java: 8
--->d23bdf 5b1b1b
Step 2/6:VOLUME /tmp---> Using cache
--->64c36a425bbf
Step 3/6: ADD demo-0.0.1-SNAPSHOT.jar app.jar--->1788813d23d2
step 4/6:RUN bash-c 'touch /app.jar'---> Running in e4cfd4447b78
--->2c44a754963b
Removing intermediate container e4cfd4447b78Step 5/6 :EXPOSE 8080
---> Running in 95b96954618e---> 8bc53f642637
Removing intermediate container 95b96954618e
Step 6/6:ENTRYPOINT java-Djava.security.egd=file:/dev/./urandom-jar/app.:一-->Running in al92a418f4f1
--->3a27629ceba9
Removing intermediate container a192a4184f1Successfully built 3a27629ceba9
Successfully tagged docker demo: latest
Image for service demo was built because it did not already exist. To rebuithis image you must use `docker-compose build' or 'docker-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-compose down --rmi allRemoving image docker demo
Failed to remove image for service demo:404 Client Error:Not Found ("No suchimage: docker demo: latest")
出现这个错误提示的原因是在第一次构建时,并不存在可以移除的镜像,但这并不影响整个构建过程的执行。
现在验证一下项目更新的自动化部署效果。首先将项目主程序的输出结果“Hello World ! ”改为“Hello Jerkins! ”,然后提交代码。完成之后,再在Jenkins 中单击“立即构建”选项,构建完成后,刷新访问应用的浏览器,即可看到如图15-17所示的效果。
再次查看控制台的输出日志,现在,移除镜像的命令已经不再显示错误,而是输出了如下所示的结果,表示已经停止了运行的容器,并移除了原来的容器和镜像:
+ sudo /usr/local/bin/docker-compose down--rmi all
Stopping docker demo 1 ...
-[1A-[2K
Stopping docker demo 1 ... -[32mdone-[ Om-[1BRemoving docker demo 1 ...
一-[1A[2K
Removing docker demo 1 ...-[32mdone-[ Om一[1BRemoving image docker demo
这里只是一个简单的自动部署的演示,在实际使用中,可以通过定时任务,或结合使用WebHook 的代码提交通知,实现自动部署。另外,还可以通过Selenium、JMeter等工具生成测试脚本,增加自动测试的功能。
小结
本章介绍了如何使用自动化构建工具Jenkins 设计持续交付的工作流程,并以一个简单的实例演示了自动部署的实现过程。在该实例中,我们使用Git进行代码拉取、使用 Maven进行程序打包、使用Docker进行镜像的创建和应用的更新与部署。从这个实例中可以看出Jenkins的强大的可扩展性。
通过对本章的学习,相信读者能够根据实际情况,建立一个完善的自动化基础设施,从而实现在微服务发布中集成测试和持续部署的自动化构建流程。
本文给大家讲解的内容是微服务架构实战:使用Jenkins实现自动化构建
- 下篇文章给大家讲解的是通用源码阅读mybatis源码详解:源码阅读的意义、方法;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持!
相关推荐
- 第 28 章:核心功能 SQL 查询 - PostgreSQL入门
-
欢迎来到我们史诗级教程的最终章!在上一章,我们成功地构建了博客系统的数据库骨架。现在,这个结构精良的数据库正静静地等待着我们去使用它。...
- postgresql的6种索引介绍_postgresql默认用户名和密码
-
postgresql几种索引PostgreSQL支持多种索引类型,每种索引的设计原理、适用场景和优缺点各有不同。以下是对主要索引类型的详细介绍:...
- 第 20 章:索引与性能优化 - PostgreSQL入门
-
到目前为止,我们已经学习了如何设计表、保证数据完整性、以及如何用各种方式查询数据。但当我们的表从几十行增长到几百万、甚至上亿行时,一个之前只需要0.1秒的查询,可能会变成需要几分钟甚至几小时的“灾...
- PostgreSQL 主从复制 完整指南_主从复制mysql
-
PostgreSQL主从复制(StreamingReplication)完整指南PostgreSQL主从复制是一种实时同步数据的机制,可以实现高可用性(HA)、读写分离和负载均衡。其...
- PostgreSQL监控神器,千万注意这5大关键指标!
-
PostgreSQL监控神器,千万注意这5大关键指标!在当今数据驱动的业务环境中,数据库的性能和稳定性直接关系到企业的运营效率与用户体验。PostgreSQL作为一款功能强大的开源关系型数据库,被广泛...
- Retool 如何升级主应用 4TB 的 PostgreSQL 数据库
-
本文最初发布于Retool官方博客。...
- PostgreSQL查询计划_postgresql查询计划中的cost组成
-
深入解析PostgreSQL查询计划:优化性能的关键在数据库管理系统中,查询计划是执行SQL查询时的关键组成部分。PostgreSQL作为一款功能强大的开源关系型数据库,其查询计划的生成与优化对于提升...
- 第 27 章:数据库与表结构实现 - PostgreSQL入门
-
在上一章,我们已经绘制好了博客系统的宏伟蓝图。现在,是时候戴上安全帽,化身“建筑工程师”,将图纸上的设计一砖一瓦地搭建成真实的数据库结构了。...
- PostgreSQL事务处理_postgresql时区问题
-
PostgreSQL事务处理:原理、应用与优化引言...
- 第 14 章:集合运算 (UNION, INTERSECT, EXCEPT) - PostgreSQL入门
-
在之前的章节里,我们所有的操作(JOIN...
- PostgreSQL 安装指南及日常使用_postgresql 11安装
-
PostgreSQL安装与日常使用PostgreSQL是一款功能强大、开源的对象关系型数据库,支持高级SQL标准、扩展功能、事务完整性和高并发。本指南涵盖安装、配置、日常使用、性能优化、常见...
- 第 23 章:函数与存储过程 (PL/pgSQL) - PostgreSQL入门
-
到目前为止,我们与数据库的交互方式都是从外部客户端(如psql...
- PostgreSQL是不是你的下一个JSON数据库?
-
根据Betteridge定律(任何头条的设问句可以用一个词来回答:不是),除非你的JSON数据很少修改,并且查询很多。最新版的PostgreSQL添加更多对JSON的支持,我们曾经问过PostgreS...
- "揭秘PostgreSQL:你必须掌握的数据类型全解析!"
-
揭秘PostgreSQL:你必须掌握的数据类型全解析!在数据库管理系统中,PostgreSQL以其强大的功能和稳定性而著称。为了充分发挥其性能,理解并熟练掌握其数据类型是至关重要的。本文将深入探讨Po...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
如何将AI助手接入微信(打开ai手机助手)
-
redission YYDS spring boot redission 使用
-
SparkSQL——DataFrame的创建与使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
-
- 第 28 章:核心功能 SQL 查询 - PostgreSQL入门
- postgresql的6种索引介绍_postgresql默认用户名和密码
- 第 20 章:索引与性能优化 - PostgreSQL入门
- PostgreSQL 主从复制 完整指南_主从复制mysql
- PostgreSQL监控神器,千万注意这5大关键指标!
- Retool 如何升级主应用 4TB 的 PostgreSQL 数据库
- PostgreSQL查询计划_postgresql查询计划中的cost组成
- 第 27 章:数据库与表结构实现 - PostgreSQL入门
- 谁帮我看看,为啥我的PostgreSQL查询速度这么慢???
- PostgreSQL事务处理_postgresql时区问题
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)