从零实现DevOps(四):Jenkins+GitLab自动化部署SpringBoot项目(Jenkins本地环境+Jar包模式)

2023-11-17

从前三篇文章中,我们已经实现了gitlab、jenkins项目的安装与基础配置,并且给Centos7操作系统搭配了jdk、maven等环境变量。从这边文章起,“从零实现DevOps”系列,将正式开始利用Jenkins+Gitlab的完美结合,一步步实现全栈项目的持续集成和持续部署(CI/CD),以后也会引入Docker+Dockerfile+docker-compose的方式去实现快速部署。那么,第一篇文章先传统的SpringBoot项目开刀,在Jenkins本地环境中用jar包的方式简单实现一下,开始吧!!!

一、Jenkins插件和全局环境配置

1、Jenkins设置中文(部分版本不生效,跳过此步骤也可以)

  1. 点击Jenkins首页中的Manage Jenkins,进入系统设置

  2. 点击Plugins,进入插件中心
    在这里插入图片描述

  3. 选择Available Plugins,搜索Locale,勾选后,点击Install without restart(安装无需重启)
    在这里插入图片描述

  4. 等待安装完毕后返回首页
    在这里插入图片描述

  5. 再次点击Manage Jenkins,点击System,进入系统配置

  6. 往下拉,找到Locale,输入框中输入“zh_CN”,勾选下边的按钮(忽略浏览器首选项并向所有用户强制使用此语言),点击保存返回首页 在这里插入图片描述

  7. 地址栏后边加上“/restart”后刷新网址,重启Jenkins 在这里插入图片描述在这里插入图片描述

  8. 等待重启后成功

2、Jenkins安装Maven、GitLab等插件

  1. 与安装中文插件同理,依次搜索安装MavenGitLab插件 在这里插入图片描述
    在这里插入图片描述
  2. 为了万无一失,全部安装后,再次重启一下Jenkins

3、配置GitLab系统凭据

可能是因为版本问题,我点击系统级的Credentials时,并没有添加凭据的地方,所以,我选择在添加Gitlab地址的地方添加令牌

  1. 点击Manage Jenkins,点击System,进入系统配置
  2. 往下拉,找到GitLab,其他不需要填写,点击添加,再点击弹出的Jenkins图标 ,进行配置凭据 在这里插入图片描述
  3. 配置Credentials(ID和描述可填可不填,知道即可),点击添加即可,返回首页(弹框点击
    Username with password
    最简单的凭证类型,字面理解即可掌握精髓,就是保存用户名和密码。 在这里插入图片描述
  4. 返回首页,在系统的Credentials中,查看配置的凭据 在这里插入图片描述
  5. 红框的就是你刚才添加的凭据,还可以点进去进行修改账号密码操作 在这里插入图片描述
    点击Change Password可以修改密码 在这里插入图片描述

4、配置Maven环境变量

  1. 点击Manage Jenkins,点击Tools(有些版本的jenkins也叫Global Config),进入工具配置
  2. 往下拉找到Maven,点击新增Maven
  3. 取消勾选Install automatically,用我们自己的Maven版本 在这里插入图片描述
  4. 新增Maven内容,Name随便取,MAVEN_HOME用的是自己配置的maven路径(mvn -v在这里插入图片描述
    在这里插入图片描述
    点击保存返回首页!!!

二、创建并配置Jenkin流水线(重点来了)

1、创建Job

  1. 点击左侧新建ItemCreate a job,创建一个流水线 在这里插入图片描述
  2. 输入任务名称,选择第一个“Freestype project”,点击确定即可
    在这里插入图片描述

2、源码管理(配置Gitlab地址和分支)

  1. 进入Gitlab,找到自己的项目,复制你的项目git地址
    在这里插入图片描述

  2. 配置页面,往下拉,找到源码管理,将git地址复制进Repository URL,并选择Credentials(在一.3中配置的,也可以在这里添加并选择) 在这里插入图片描述

  3. 文中提示报错“Failed to connect to repository : Error performing git command: git ls-remote -h http://192.168.1.11/root/test_project.git HEAD”,是因为服务器未安装git导致,yum安装一下

    yum install git
    

在这里插入图片描述
4. 安装成功后,再次把git地址粘贴进Repository URL,就不会出现刚才的错误了
在这里插入图片描述
5. 继续往下拉,在“指定分支”处,配置你想要自动部署的分支
在这里插入图片描述
觉得手欠的可以先应用一下,再继续进行,防止误关闭页面!!!

3、构建触发器(配置GitLab的Webhooks)

  1. 继续往下拉页面,找到“构建触发器”,勾选“Build when a change is pushed to GitLab

在这里插入图片描述
触发策略由自己决定

- Push Events:提交Push代码触发
- Opened Merge Request Events:合并分支触发
  1. 配置GitLab的Webhooks,搭建钩子,触发部署事件(重中之重)

  2. 打开Gitlab需要部署的项目,左侧点击设置,然后点击Webhooks
    在这里插入图片描述

  3. Webhooks中:URL是“Build when a change is pushed to GitLab”后边的那个地址,粘贴进去
    在这里插入图片描述
    在这里插入图片描述

  4. 回到jenkins,往下拉,点击高级,找到“Secret token”,点击“Generate”,生成令牌,并把这个令牌粘贴进Gitlab-Webhooks的“Secret 令牌”中
    在这里插入图片描述
    在这里插入图片描述

  5. 在Webhoos配置中,勾选推送事件合并请求事件,并点击“添加webhooks

    推送事件中,你可以配置所有分支或者指定的分支,一般来说,部署哪个分支选择哪个即可

    所以,我选择的“通配符样式”,并指定的“dev”分支(dev
    在这里插入图片描述

  6. 点击保存时,Gitlab有可能会报错“Url is blocked: Requests to the local network are not allowed”,这是因为你没有开启Webhooks的出站请求!

解决方法:
(1)进入管理员设置
在这里插入图片描述(2)点击设置,进入网络设置

(3)找到出站请求,点击展开,勾选“允许来自 webhooks 和集成对本地网络的请求”,保存更改即可
在这里插入图片描述

(4)重新配置webhook,即可成功。成功效果如图:
在这里插入图片描述
再次提醒,Jenkins最好点击一次应用,防止丢失!!!

小贴士

其实,在此步骤完成后,你可以将jenkins保存一下,回到首页。并且在刚才配置的Gitlab-webhooks中,点击测试的推送事件,尝试一下,项目能不能成功打包!!!

在这里插入图片描述
回到Jenkins,可以发现已经成功构建一次
在这里插入图片描述
然后去你服务器的“/root/.jenkins/workspace”中,去看看有没有项目代码,target文件夹中有没有jar包~~~
在这里插入图片描述
可以发现,我的Gitlab项目已经上传成功,并且打包成功!!!
如果你有兴趣,也可以看看构建的控制台输出,里边也有打包的输入内容,神奇吧~~~
在这里插入图片描述
在这里插入图片描述

4、构建环境(Build)

勾选“Add timestamps to the Console Output”,方便打印控制台日志!!!
在这里插入图片描述

5、Build Steps(Maven打包项目)

  1. 点击增加构建步骤,选择“Invoke top-level Maven targets

  2. Maven版本选择在一、4中配置的maven版本,“目标”是我们打包命令

    clean package -Dmaven.test.skip=true -U
    

在这里插入图片描述

6、增加构建步骤(杀死已有进程+启动jar包)

  1. 编写jar包启动脚本
cd /data/java

touch start.sh

vim start.sh

脚本内容如下,需要根据个人情况改三个地方

第4行:Java环境变量配置位置(一般是:source /etc/profile)

第6行:jar包位置

第8行:jar包名称

#!/bin/bash
#cp /dev/null /nohup.out
# 重新加载环境变量
source ~/.bash_profile
# 跳转到Jar地址
cd /data/java
# 设置Jar包名称变量
APP_NAME=jimapaotui-2.0.jar
# 杀死原有进程号
ID=`ps -ef | grep $APP_NAME | awk '{print $2}'`
echo "------start---------"
for id in $ID
do
        kill -9 $id
        echo "killed $id"
done
# 防止杀死进程
BUILD_ID=dontKillMe
# 启动Jar包
nohup java -jar $APP_NAME > nohup.out 2>&1 &
echo "------end---------"

为start.sh增加执行权限

sudo chmod +x start.sh

在这里插入图片描述

  1. 点击“增加构建步骤”。选择”Execute shell”,并添加如下的命令
#!/bin/bash
# 复制jar包到脚本中指定的位置
cp ./target/jimapaotui-2.0.jar /data/java
# 执行启动脚本
sh /data/java/start.sh

如图:
在这里插入图片描述
至此,流水线配置已全部完毕,接下来,进行测试流程!!!

四、测试功能

从刚才指定的dev分支提交一次代码
在这里插入图片描述
Jenkin已经开始构建了
在这里插入图片描述
构建成功
在这里插入图片描述
去服务器上看看jar包是否上传,是否执行成功

cd /data/java
ps -ef | grep **.jar

在这里插入图片描述

五、总结

至此,Jenkins结合GitLab实现本地代码自动化部署的功能已经实现,下一期我们会实现远程服务器部署Jar包项目的实例!!!

所有你想象的一切,皆是现实!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零实现DevOps(四):Jenkins+GitLab自动化部署SpringBoot项目(Jenkins本地环境+Jar包模式) 的相关文章

  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 在docker容器中运行Jenkins有什么优势

    我发现了很多关于如何运行你的博客Jenkins in Docker但没有人真正解释这样做的好处 这是我发现的唯一原因 使用 Docker 的理由 https twasink net 2016 08 01 setting up a jenki
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • etcd 集群搭建及常用场景分析

    概述 etcd 是一个分布式一致性k v存储系统 可用于服务注册发现与共享配置 具有以下优点 简单 相比于晦涩难懂的paxos算法 etcd基于相对简单且易实现的raft算法实现一致性 并通过gRPC提供接口调用 安全 支持TLS通信 并可
  • 项目import其他class类失败,解决办法:清楚缓存

    如题 今天导入新的项目的时候遇到一些问题 这里记录一下 1 问题 所有的类都是 java文件而不是 class pom文件全部报错 maven 加载不进来 解决 一阵排查发现是加载项目的包目录加载错了 在最外层打开的导致找不到下级的目录 2
  • Too many open files的四种解决办法【转】

    摘要 Too many open files有四种可能 一 单个进程打开文件句柄数过多 二 操作系统打开的文件句柄数过多 三 systemd对该进程进行了限制 四 inotify达到上限 领导见了孔乙己 也每每这样问他 引人发笑 孔乙己自己
  • opencv-光流法

    import numpy as np import cv2 import sys cap cv2 VideoCapture video2 mp4 feature params dict maxCorners 100 qualityLevel
  • matlab实现三自由度机械臂旋转

    matlab实现三自由度的机械臂旋转 1 内容与要求 根据表一机械臂长度 以及图一机械臂配置为机械臂开发一个控制器 使其能够执行特定的任务 更具体地说 让机械臂的末端执行器移动到特定的点 项目要求 你的控制器应该能够控制一个3 自由度的机械
  • 《消息队列高手课》缓存策略:如何使用缓存来减少磁盘IO?

    现代的消息队列 都使用磁盘文件来存储消息 因为磁盘是一个持久化的存储 即使服务器掉电也不会丢失数据 绝大多数用于生产系统的服务器 都会使用多块儿磁盘组成磁盘阵列 这样不仅服务器掉电不会丢失数据 即使其中的一块儿磁盘发生故障 也可以把数据从其
  • 解决 windows 下浏览器无法上网,QQ/微信正常上网

    解决 windows 下浏览器无法上网 QQ 微信正常上网 解决 windows 下浏览器无法解析DNS配置 gt 注意 本处只 提供一种解决思路 并不代表所有问题都能被解决 可以尝试一下 这种问题 一般在浏览器中会 直奔主题 原因 1 查
  • 计算机视觉(十二):Mask R-CNN

    1 引言 Mask R CNN是在Faster R CNN架构为基础上改进的一种目标检测架构 并且能够有效的完成高质量的语义分割 Mask R CNN主要结构如下图所示 那我们就来一步步介绍Mask R CNN的部分 2 特征提取方法 通过
  • aps是什么意思_aps是什么意思

    aps的意思是 1 美国物理学会 全称 American Physical Society 2 人名 短语 APS Assembly空气加压系统 APS Automated Packaging Systems自动封装系统 例句 1 I re
  • win10环境下PCL安装和配置回顾(一)

    2020年博主有写过几篇关于PCL的博客 这边想先回顾下 再增加点新内容 之前写的博客专栏如下链接 https blog csdn net jiugeshao category 11993239 html spm 1001 2014 300
  • 基于FPGA的频率计设计

    文章目录 写在前面 1 什么是频率计 2 测量方法与基本原理 3 待测信号如何输入FPGA 一 实验程序 1 RTL图 2 Verilog 参考设计 3 指派引脚 二 调试验证 输入不同频率的方波 写在前面 1 什么是频率计 频率计是一种专
  • 正则表达式用ajax怎么写,使用AJAX(包含正则表达式)验证用户登录的步骤

    我们来分一下步骤吧 1 HTML代码 页面先写出来 2 正则表达式验证输入的用户名密码是否正确 失去焦点验证 3 Ajax异步提交 4 servlet这是后台处理代码获取数据并对比响应 然后跳转成功页面 效果图 结构 代码如下 table
  • TensorFlow 的基本概念和使用场景

    TensorFlow 是一个热门的机器学习框架 由 Google 开发 用于构建和训练神经网络和其他机器学习模型 下面是 TensorFlow 的基本概念和使用场景 基本概念 1 张量 Tensor 是 TensorFlow 中的基本数据结
  • 防止运营商劫持apk

    title 防止运营商劫持apk tags https upyun apk 运营商 劫持 categories 工作日志 date 2017 05 25 18 18 56 目前f6部分系统使用了upyun的服务 包含apk的下载和静态资源等
  • Exception常见异常类型和处理机制

    Exception 意外异常 异常层次结构的父类 Throwable 是异常Exception与Error的父类 直接继承自Object Error通常指系统发生的严重性的错误 不能通过程序代码解决的问题 Exception异常可以通过修改
  • 在ipad任意界面都可以写字_不再泡面!大学生如何用iPad高效学习

    如果你还是一个学生 相信平时上课记笔记一定是最头疼的问题 平时的笔记期末就不见了等等 用电子的方式记录就可以完美解决这个问题 而目前比较推崇 流行的方式就是使用iPad Apple Pencil的组合 书写的感觉也接近纸质 但同样的 你也需
  • 多层嵌套的 javabean转化为xml时 更改嵌套的属性名称时 报错重复

    我们先来看下报错 如果需要给多层嵌套javabean 转化为xml时 转化的标签名字不符 我们需要该怎么做呢 不是多层嵌套的我们可以直接使用 XmlElement name 来进行别名 如果多层的话 我们则需要给在每个路过的类上都需要加上
  • 公众号H5开发如何在本地调试

    1 设置本地hosts的地址映射 如blog test com映射127 0 0 1 方法 修改hosts的地址映射 使域名解析到指定IP 2 配置公众号网页授权获取用户基本信息 3 修改vue配置 vue cli3创建的项目 在项目根目录
  • 【PLC 课程设计】花式喷泉

    花式喷泉的控制 要求 按下启动按钮 喷泉装置开始工作 按下停止按钮 喷泉装置停止工作 喷泉的工作方式由花式选择开关和单步 连续开关决定 当单步 连续开关在单步位置时 喷泉只能按照花样选择开关设定的方式运行一个循环 花样选择开关用于选择喷泉的
  • 从零实现DevOps(四):Jenkins+GitLab自动化部署SpringBoot项目(Jenkins本地环境+Jar包模式)

    从前三篇文章中 我们已经实现了gitlab jenkins项目的安装与基础配置 并且给Centos7操作系统搭配了jdk maven等环境变量 从这边文章起 从零实现DevOps 系列 将正式开始利用Jenkins Gitlab的完美结合