从0开始利用Jenkins构建Maven项目(微服务)并自动发布

news2024/11/27 2:48:25

0. 前言

本文旨在帮助读者梳理如何从0开始利用Jenkins构建Maven项目(微服务)的自动发布任务

本文目录如下:

如何完成自动部署

    • 0. 前言
    • 1. 配置工具类地址
      • 1.1 JDK
      • 1.2 Git
      • 1.3 Maven
    • 2. 安装Jenkins
    • 3. 安装额外的工具插件
    • 4. 配置必要参数
      • 4.1 配置仓库人员的用户名和密码
      • 4.2 maven及其配置文件位置
      • 4.3 服务器地址与密码
      • 4.4 开放2375远程访问端口,允许docker客户端以http请求访问私服
    • 5. 微服务部署实例
      • 5.1 新建任务,配置仓库
      • 5.2 Pre Step
      • 5.3 Build
      • 5.4 Post Step
    • 6. 总结

1. 配置工具类地址

以下内容来源于:Jenkins安装并部署Java项目完整流程

首先是在本地安装三个jenkins自动配置相关的工具

1.1 JDK

由于我们使用docker来启动jenkins,其自带有jdk,因此不需要再下载JDK,查看其容器携带的config.v2.json可发现,jdk路径为:

/opt/java/openjdk

1.2 Git

同JDK一致,docker容器中的jenkins自带有git,其路径为

/usr/bin/git

1.3 Maven

个人的Maven安装目录是/usr/bin/maven

mkdir /usr/bin/maven
wget http://mirror.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar xzvf apache-maven-3.6.3-bin.tar.gz

安装好后,处理一下settings.xml,配置国内镜像源:

vim /usr/bin/maven/apache-maven-3.6.3/conf/settings.xml

在内填充如下内容:

<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

设置一下本地仓库地址,这里最好设置在maven安装目录下,以保证docker容器映射后,本地仓库可查,我的设置如下:

<localRepository>/usr/bin/maven/apache-maven-3.6.3/repo</localRepository>

最后配置环境变量,保证mvn可查:

vim /etc/profile

在末尾填充:

export M2_HOME=/usr/bin/maven/apache-maven-3.6.3
PATH=$M2_HOME/bin:$PATH

然后执行source /etc/profilemvn -v能显示版本即配置成功

2. 安装Jenkins

我们使用Docker快速安装Jenkins,需要注意的是,在docker hub直接搜索Jenkins,出来的最新版也只有2.4.0版本,其界面如下所示:
在这里插入图片描述
该版本是不友好的,由于其没有携带Localization Chinese插件,因此无法自动进行插件的安装与更新

使用以下命令在linux中安装最新版本的jenkins:

docker run\ 
-d --name jenkins -p 8081:8080 -p 50000:50000\ 
-v /var/jenkins_home:/var/jenkins_home\ 
-v /usr/bin/maven/apache-maven-3.6.3:/usr/bin/maven/apache-maven-3.6.3\  
jenkins/jenkins

-v /usr/bin/maven/apache-maven-3.6.3:/usr/bin/maven/apache-maven-3.6.3 这一句必须要保持一致:

  • 如果没有在创建容器时建立maven映射,jenkins将无法找到mvn执行程序
  • 如果映射路径不统一,jenkins执行mvn时将面临配置文件丢失问题

安装成功后,访问服务器的8081端口即可进入jenkins登录页面,登录后的新版本界面应如下所示:
在这里插入图片描述

3. 安装额外的工具插件

本部分参考文献:Jenkins常用插件汇总以及简单介绍原创

下面给出我在使用过程中认为必装的插件列表:

  • Maven Release Plug-in:该插件使得在部署SpringBoot项目时流程更清晰简便
  • Git Parameter:该插件使得可以添加Git远程仓库链接(安装后需重启Jenkins,否则会一直报Java.io异常)
  • Publish Over SSH:该插件使得构建项目时可通过远程SSH发送文件或指令,从而在jenkins中控制其他服务器构建容器

其他的插件选择性安装,安装插件的位置:系统管理–>系统配置–>插件管理–>Available Plugins

安装好后,新建任务时,你应该可以选择Maven任务,配置任务时,在源码配置部分你应该可以增加Git远程仓库,在全局设置管理你应该可以设置远程服务器连接

4. 配置必要参数

jenkins自动构建并发布Maven项目的流程梳理:

  • 从Git仓库拉取代码至本地工作空间:/var/jenkins_home/workspace/[project_name]
  • 执行preBuild工作,一般包括以下步骤:
    • 清理工作空间中可能存在的target目录
    • 清理私服中前一次的微服务打包镜像
    • 根据pom.xml文件以及docker_build插件,执行微服务打包–>生成镜像–>上传镜像的一系列流程(docker_build是不安全的,其要求docker开放远程操作端口且无需验证
  • 执行Build工作:指定父工程pom.xml
  • 执行postBuild工作:运行docker容器

根据流程,我们可梳理出各个流程中需要配置的重要参数:

  • 拉取代码:配置仓库人员的用户名和密码(也可采用令牌访问的方式)
  • preBuild:
    • 清理target目录需要mvn命令支持,因此需要配置maven及其配置文件位置
    • 清理私服中前一次打包镜像,需要使用到docker命令,这里有两种实现选择:(1)直接访问docker远程端口;(2)通过SSH向远程服务器(私服服务器)发送指令,后者更为安全,这里选用后者,其需要配置服务器地址以及密码
    • 调用docker_build插件,需要开放docker远程访问端口2375,以及允许docker私服被docker客户端以http请求访问。因此,此处涉及到两个配置:开放2375远程访问端口;允许docker客户端以http请求访问私服
  • Build:无需额外配置
  • postBuild:无需额外配置

4.1 配置仓库人员的用户名和密码

在这里插入图片描述
生成项目时,在Git的Credentials处点击添加以配置

4.2 maven及其配置文件位置

全局工具配置中,将第一部分安装好的maven路径配置过来(由于已经在生成容器时映射了该路径,因此该路径下的文件可查)

首先是配置maven配置文件路径:
在这里插入图片描述
然后配置maven路径:
在这里插入图片描述
由此,我们保证了jenkins调用mvn时,以下内容可查(均为映射路径):

  • 配置文件可查
  • 本地仓库可查

此处顺带配置一下JDK和Git的地址,如第一部分所给出的:

jdk: /opt/java/openjdk
git: /usr/bin/git

4.3 服务器地址与密码

在系统配置下,找到Publish over SSH配置项,配置服务器的Name(自定义,如aliyun), Hostname(主机地址,如192.168.0.1),Username(用户名,如root),在高级配置中选择使用密码验证,并在Password输出密码。配置好后应如下图所示:

在这里插入图片描述
此时,在使用SSH发送指令时,即可指定该远程服务器(这也是在不同服务器部署不同微服务容器的基础)

4.4 开放2375远程访问端口,允许docker客户端以http请求访问私服

以下内容来源于:Docker开启远程安全访问

简单总结一下步骤:

  • 编辑docker.service文件:vim /usr/lib/systemd/system/docker.service
  • 找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 --insecure-registry [私服地址]:5000,前者开放docker远程访问,允许任何ip以tcp请求访问2375端口,后者允许以http请求访问私服
  • 运行:systemctl daemon-reload && systemctl restart docker

运行成功后即配置成功

以上就是建立项目前需要做好的配置工作,接下来我将以一个微服务部署的例子介绍如何编写自动部署项目的流程

5. 微服务部署实例

以黑马程序员的学成在线项目为实例,挑选了其中五个微服务进行部署,分别是:system, gateway, auth, content, media(其余的则是打包时的依赖),项目结构如下
在这里插入图片描述
其中,system,content,media采用api–>service–>model三层架构,最终在父工程中打包并以api生成微服务,如下图所示:
在这里插入图片描述

5.1 新建任务,配置仓库

首先,在jenkins中新建一个任务,配置好源码仓库
在这里插入图片描述

5.2 Pre Step

正如之前所述,Pre Step要完成以下工作:

  • 调用SSH向私服远程发送清理残余镜像指令,指令如下:
docker stop xuecheng-plus-gateway 
docker rm xuecheng-plus-gateway 
docker rmi 172.21.74.125:5000/xuecheng-plus-gateway:0.0.1-SNAPSHOT 
docker stop xuecheng-plus-auth 
docker rm xuecheng-plus-auth 
docker rmi 172.21.74.125:5000/xuecheng-plus-auth:0.0.1-SNAPSHOT 
docker stop xuecheng-plus-system 
docker rm xuecheng-plus-system
docker rmi 172.21.74.125:5000/xuecheng-plus-system-api:0.0.1-SNAPSHOT 
docker stop xuecheng-plus-content 
docker rm xuecheng-plus-content 
docker rmi 172.21.74.125:5000/xuecheng-plus-content-api:0.0.1-SNAPSHOT 
docker stop xuecheng-plus-media
docker rm xuecheng-plus-media 
docker rmi 172.21.74.125:5000/xuecheng-plus-media-api:0.0.1-SNAPSHOT 

最终成型模块如下:
在这里插入图片描述

  • 调用mvn指令清理target目录,并重构maven项目
    • 首先是整体清理以及重构父工程pom,自动下载项目的所有依赖至本地仓库
      在这里插入图片描述
    • 然后分别对五个微服务,调用docker_builder插件,完成打包–>生成镜像–>上传的一系列流程
      在这里插入图片描述
      这里顺便贴一个docker_builder插件的pom配置方式:
<build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring-boot.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.2.2</version>
            <configuration>
                <!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和 TAG,我们要直接传到私服-->
                <!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本-->
                <!--<imageName>${project.artifactId}:${project.version}</imageName>-->
                <imageName>http://172.21.74.125:5000/${project.artifactId}:${project.version}</imageName>
                <!--也可以通过以下方式定义image的tag信息。 -->
                <!-- <imageTags>
                     <imageTag>${project.version}</imageTag>
                     &lt;!&ndash;build 时强制覆盖 tag,配合 imageTags 使用&ndash;&gt;
                     <forceTags>true</forceTags>
                     &lt;!&ndash;build 完成后,push 指定 tag 的镜像,配合 imageTags 使用&ndash;&gt;
                     <pushImageTag>true</pushImageTag>
                 </imageTags>-->
                <baseImage>java:8u20</baseImage>
                <maintainer>docker_maven docker_maven@email.com</maintainer>
                <workdir>/root</workdir>
                <cmd>["java", "-version"]</cmd>
                <!--来指明Dockerfile文件的所在目录,如果配置了dockerDirectory则忽略baseImage,maintainer等配置-->
                <!--<dockerDirectory>./</dockerDirectory>-->
                <!--2375是docker的远程端口,插件生成镜像时连接docker,这里需要指定docker远程端口-->
                <dockerHost>http://172.21.74.125:2375</dockerHost>
                <!--入口点,project.build.finalName就是project标签下的build标签下 的filename标签内容,testDocker-->
                <!--相当于启动容器后,会自动执行java -jar ...-->
                <entryPoint>["java", "-Dfile.encoding=utf-8","-jar", "/root/${project.build.finalName}.jar"]</entryPoint>
                <!--是否推送到docker私有仓库,旧版本插件要配置maven的settings文件。 -->
                <pushImage>true</pushImage>
                <registryUrl>http://172.21.74.125:5000</registryUrl>  <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                <resources>
                    <resource>
                        <targetPath>/root</targetPath>
                        <directory>${project.build.directory}</directory>
                        <!--把哪个文件上传到docker,相当于Dockerfile里的add app.jar /-->
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

至此,Pre Step已为我们准备好docker容器运行的镜像

5.3 Build

Build只需要设置root pom即可,具体该设计的目的此处不明

在这里插入图片描述

5.4 Post Step

Post Step只需通过SSH远程向服务器发送运行docker容器的命令即可

运行命令整理如下:

docker run -p 63070:63070 --name xuecheng-plus-auth -idt 172.21.74.125:5000/xuecheng-plus-auth:0.0.1-SNAPSHOT
docker run -p 63010:63010 --name xuecheng-plus-gateway -idt 172.21.74.125:5000/xuecheng-plus-gateway:0.0.1-SNAPSHOT
docker run -p 63110:63110 --name xuecheng-plus-system -idt 172.21.74.125:5000/xuecheng-plus-system-api:0.0.1-SNAPSHOT
docker run -p 63040:63040 --name xuecheng-plus-content -idt 172.21.74.125:5000/xuecheng-plus-content-api:0.0.1-SNAPSHOT
docker run -p 63050:63050 --name xuecheng-plus-media -idt 172.21.74.125:5000/xuecheng-plus-media-api:0.0.1-SNAPSHOT

成型配置如下:
在这里插入图片描述

6. 总结

本文从0开始,一步步介绍了如何利用Jenkins来构建Maven项目(微服务)并自动发布,其中有很多的细节需要读者耐心阅读,如有疑问欢迎留言!

最后,SSH远程指令的形式将是未来进行多机微服务部署的基础与关键,其为jenkins提供了丰富多彩的操作远程服务器的支持,需要读者花费精力去领悟它!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TiDB实战篇-索引设计

简介 实战索引设计 数据映射原理 索引 唯一索引 二级索引 索引实例 索引设计 索引创建&#xff08;建表的时候创建&#xff09; 建表完以后添加 联合索引&#xff08;最左原则&#xff0c;索引覆盖&#xff09; 使用例子 索引覆盖 表达式索引 表达式索引的使用 不可见…

【youcans 的 OpenCV 学习课】23. 人脸检测:Haar 级联检测器

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】23. 人脸检测&#xff1a;Haar 级联检测器 4. Haar 级联分类器5. Haar 人脸/人眼检测器5.1 OpenCV 中的级联分类器5.2 Haar 级联检…

OPNET Modeler 调试简介

在使用 OPNET Modeler 软件运行仿真时&#xff0c;经常会遇到错误&#xff0c;发现和定位错误所在的地方是解决错误的第一步&#xff0c;那么怎么定位错误呢&#xff0c;这个时候就需要采用仿真调试器 (OPNET Simulation Debugger&#xff0c;ODB)进行调试了。 在 OPNET 中&…

【模电实验】电路元件伏安特性的测绘及电源外特性的测量

实验2电路元件伏安特性的测绘及电源外特性的测量 实验目的 学习测量线性和非线性电阻元件伏安特性的方法&#xff0c;并绘制其特性曲线学习测量电源外特性的方法掌握运用伏安法判定电阻元件类型的方法学习使用直流电压表、电流表&#xff0c;掌握电压、电流的测量方法 实验原…

Java BIO(Blocking IO:同步并阻塞式IO)

1.基本介绍 1>.Java BIO就是传统的java io编程,其相关的类和接口在"java.io"包下; 2>.BIO(Blocking I/O): 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理; 如果这个连接不做任何事情会造成(服务器)不必…

【C++】STL——list深度剖析 及 模拟实现

文章目录 前言1. list的介绍及使用1.1 list的介绍1.2 list的使用遍历插入删除数据Operations迭代器的功能分类list 的sort性能测试 2. list的模拟实现2.1 STL_list源码浏览2.2 基本结构实现2.3 思考&#xff1a;list迭代器是否可以用原生指针2.4 list迭代器的实现&#xff08;重…

RocketMQ5.1 NameServer 路由管理

文章目录 1. 路由管理核心组件介绍2. RouteInfoManager 路由表3. 路由管理3.1 注册 Broker3.2 注销 Broker3.3 拼凑 TopicRouteData 此文章基于 RocketMQ 5.1 版本进行分析&#xff0c;与 4.x 版本相比此文章分析的部分源码有很大的区别 1. 路由管理核心组件介绍 路由管理是指…

亚马逊、沃尔玛、ebay测评出现风控、砍单、封号怎么解决?

大家好&#xff0c;我是亚马逊测评珑哥&#xff0c;提前祝各位跨境朋友五一假期愉快。 很多卖家和工作室的朋友加珑哥&#xff0c;沟通中很多朋友都在问为什么测评中一直被砍单&#xff0c;封号是什么原因&#xff1f;其实测评不是你随便买个IP&#xff0c;或者买几个买家号就…

轻松掌握mysql慢查询定位与优化知识点

在这里插入图片描述 1、利用工具定位慢sql 1、运维工具Skywalking 1、定位到慢接口 2、追踪慢sql的执行情况 2、利用MySQL的日志定位慢sql 在调式阶段才开启慢日志的查询&#xff0c;因为会损耗一些性能。 3、分析是否正确使用了索引 当我们已经定位到具体哪个sql较慢时&…

【计算几何】帝国边界划分问题【Voronoi图的原理】

一、说明 Voronoi 单元也称为泰森多边形。 Voronoi 图在许多领域都有实际和理论应用&#xff0c;主要是在科学和技术领域&#xff0c;但也在视觉艺术领域使用。Voronoi 图以数学家 Georgy Voronoy 的名字命名&#xff0c;也称为 Voronoi 镶嵌、Voronoi 分解、Voronoi 分区或 Di…

减少过拟合:暂退法

文章目录 &#xff08;一&#xff09;过拟合&#xff08;二&#xff09;暂退法 &#xff08;一&#xff09;过拟合 1.过拟合产生的原因 (1)根本原因&#xff1a; 我们都知道模型参数的优化方式&#xff1a;反向传播更新梯度&#xff0c;然后随机梯度下降。 也非常清楚模型参…

【Java笔试强训 9】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;另类加法…

弗洛伊德算法(求最短路径)

弗洛伊德算法介绍 和迪杰斯特拉算法一 样&#xff0c; 弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径迪杰斯特拉算法用于计算图中某-一个顶点到其他项点的最短路径。弗洛伊德算法VS迪杰斯特拉算…

【数据库架构】PostgreSQL的最佳群集高可用性方案

如果您的系统依赖PostgreSQL数据库并且您正在寻找HA的集群解决方案&#xff0c;我们希望提前告知您这是一项复杂的任务&#xff0c;但并非不可能实现。 我们将讨论一些解决方案&#xff0c;您可以从中选择对您的容错要求。 PostgreSQL本身不支持任何多主群集解决方案&#xff0…

Python Unet ++ :医学图像分割,医学细胞分割,Unet医学图像处理,语义分割

一&#xff0c;语义分割&#xff1a;分割领域前几年的发展 图像分割是机器视觉任务的一个重要基础任务&#xff0c;在图像分析、自动驾驶、视频监控等方面都有很重要的作用。图像分割可以被看成一个分类任务&#xff0c;需要给每个像素进行分类&#xff0c;所以就比图像分类任务…

C++-FFmpeg-8-(1)基本概念与原理-rtsp-I、P、B 帧-DTS、PTS-

目录 1.rtsp是什么&#xff1f; 2. I、P、B 帧 3.DTS、PTS 4.rtsp协议抓包分析&#xff1f; 1.rtsp是什么&#xff1f; 流程&#xff1a; 鉴权&#xff1a; 2种 &#xff1a;basice64 Digest 哈希值 哈希值不可逆。nonce 做的单项散列&#xff08;MD5,SHA512&#xff0…

HTML(二) -- 表格设计

目录 1. 基本格式&#xff1a; 表格常用属性&#xff1a; 2. 表格标签 为什么使用表格&#xff1f; 简单通用、结构稳定数据显示的非常的规整、可读性非常好 1. 基本格式&#xff1a; <table style"border: 1px solid black;" border"1px">&l…

AWE2023什么值得看?智哪儿带你五大关键词读懂AWE2023

4月27至30日&#xff0c;2023年中国家电及消费电子博览会&#xff08;AWE 2023&#xff09;在上海浦东新国际博览中心开展。 作为与德国IFA、美国CES并肩的全球前三国际家电及消费电子展览会&#xff0c;时隔两年AWE终于重启。沉淀两年&#xff0c;它的规模也是历年最大&#x…

QT+OpenCV配置

QTOpenCV配置 1 下载CMake2 安装CMake3 下载OPenCV4 配置环境变量4.1 配置QT环境变量4.2 配置CMake环境变量4.3 重启电脑生效 5 CMake编译OPenCV5.1 解决报错 6 测试 1 下载CMake 链接&#xff1a;https://cmake.org/download/ 2 安装CMake 3 下载OPenCV 链接&#xff1a;htt…

本地elasticsearch中文分词器 ik分词器安装及使用

ElasticSearch 内置了分词器&#xff0c;如标准分词器、简单分词器、空白词器等。但这些分词器对我们最常使用的中文并不友好&#xff0c;不能按我们的语言习惯进行分词。 ik分词器就是一个标准的中文分词器。它可以根据定义的字典对域进行分词&#xff0c;并且支持用户配置自…