GitLab CI/CD 持续集成/部署 SpringBoot 项目
一、GitLab CI/CD 介绍
GitLab CI/CD(Continuous Integration/Continuous Deployment)是 GitLab 提供的一种持续集成和持续部署的解决方案。它可以自动化软件的构建、测试和部署过程,以便开发者更快地、更频繁地发布可靠的产品。
整体过程如下图所示:

首先需要在目标机器上部署 Runner 服务,并注册到 gitLab 中,然后在项目中编写 .gitlab-ci.yml 文件,并执行流水线规则,当开发人员提交代码到远程仓库时,根据 .gitlab-ci.yml 文件配置信息,通知 Runner 执行相关脚本等 ,其中会涉及到几个核心特征如下:
-
Pipeline:一系列按照特定顺序执行的作业。这些作业可以被分配到不同的阶段,每个阶段都会按照定义的顺序依次执行。如果一个阶段中的所有作业成功完成,那么就会执行下一个阶段。
-
Jobs and Stages:构成
pipeline的基本单元,每个作业都包含一系列的脚本命令。阶段则是用来组织作业的方式,它允许你控制作业的执行顺序。 -
Runners:执行作业的服务器。
Runner可以在各种环境中安装和使用,包括Linux, Windows, Docker, Kubernetes等。 -
Artifacts:由作业生成的文件,可以在作业结束后保留下来。你可以在之后的作业中使用这些
artifacts,或者直接从GitLab下载。 -
Environment and Deployment:
GitLab CI/CD允许定义多个环境,例如测试环境、预生产环境和生产环境,然后在这些环境中部署你的应用。 -
.gitlab-ci.yml:
GitLab CI/CD的配置文件,定义了pipeline中的所有作业和阶段。
下面通过GitLab CI/CD 持续集成/部署 SpringBoot 项目以演示整个的使用过程。
其中 SpringBoot 项目通过 docker 运行并采用 docker-compose 管理,因此需要保证服务器端环境已经部署好了 docker 和 docker-compose ,由于是 java 项目,jdk 也要事先准备完成。
二、环境部署
2.1 GitLab 安装
关于 GitLab 的部署可以参考下面这篇文章:
使用 docker-compose 搭建私服 Gitlab

2.2 创建 SpringBoot 项目
这里先创建一个 SpringBoot 项目,并编写好测试接口:
@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/t1")public String t1(){return "this is server >>> t1 ";}}
由于采用 docker 运行,所以在项目根目录创建 Dockerfile 文件,内容如下:
FROM java:8
MAINTAINER bxc
WORKDIR /app
ADD target/test-project-0.0.1-SNAPSHOT.jar /app/app.jar
CMD ["java", "-jar", "app.jar","--spring.profiles.active=pro"]
在 gitlab 上创建项目 test-project :

将刚刚创建好的 SpringBoot 项目 push 到 test-project 中:

2.2 Runner 部署安装:
Runner 可以部署在目标机器上,也就是最终运行服务的机器上,也可以是单独的机器通过 ssh 控制目标机器部署服务。
安装 Runner :
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash

yum install gitlab-runner

2.3 注册 Runner
首先到 GitLab test_project 项目下设置下的 CI/CD 下:

找到 Runners 点击展开:


将上面红框中的数据记录下来,等下注册时需要使用。
再次回到部署 Runner 的服务器中,执行下面指令:
gitlab-runner register
按照提示的步骤输入上述相关信息:
- GitLab instance URL:
GitLab服务器的URL,上面图片中的第二点。 - registration token:用于注册
Runner的令牌,上面图片中的第三点。 - description:
Runner的描述,用于在GitLab UI中识别你的Runner。 - tags:用于帮助你组织和选择
Runner。当你在.gitlab-ci.yml文件中定义作业时,可以指定需要哪些标签的Runner来执行这个作业,这里我的tags为:runner。 - optional maintenance note:可选,主要用于记录有关
Runner的额外信息,比如配置详情、负责维护的人、最后一次更新或维护的日期等。 - Enter an executor:决定了
Runner如何执行CI/CD作业。GitLab Runner支持多种Executor,包括shell, docker, ssh, virtualbox等,我这里选择shell的形式。
操作完后可以到 gitlab 上刷新页面查看是否注册成功:

2.4 部署 Maven
由于是基于 Maven 管理的 SpringBoot 依赖,因此需要在 Rnner 的机器上部署 Maven:
下载 maven 包 :
https://maven.apache.org/download.cgi

将下载的安装包上传至服务器中,这里我是 /opt/maven 下
解压安装包:
tar -zxvf apache-maven-3.9.5-bin.tar.gz
在 conf/settings.xml 增加阿里镜像源:
<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>

将 maven 命令添加到环境变量中:
vi /etc/profile
追加以下内容:
export MAVEN_HOME=/opt/maven/apache-maven-3.9.5
export PATH=$MAVEN_HOME/bin:$PATH
刷新配置
source /etc/profile
测试查看maven版本
mvn -v

三、测试 Runner 是否正常
在 SpringBoot 项目根目录创建 .gitlab-ci.yml 文件,先测试下打印 hello world,内容如下:
stages:- deploydeploy-job:tags:- runnerstage: deployscript:- echo "hello world"
提交代码至远程仓库:
git add .
git commit -m 'ci'
git push

到 gitlab 中刷新查看:

这里绿色的对号表示已经执行成功了 .gitlab-ci.yml 中的定义,可以点击进去查看:

点击 deploy-job 可以查看执行结果:

四、CI/CD 持续集成/部署 SpringBoot 项目
由于是采用 docker-compose 管理运行 SpringBoot 项目,这里在根目录创建 docker-compose.yml ,内容如下:
version: '2.0'services:test-project:restart: alwaysimage: test-project:1.0container_name: test-projectports:- "8080:8080"networks:- test
networks: test:
修改 .gitlab-ci.yml 文件,增加打包部署的脚本:
stages:- deploydeploy:tags:- runnerstage: deployscript:- pwd- mvn clean package- docker-compose down- docker build -t test-project:1.0 .- docker-compose up -d
提交至远程仓库:

到 gitlab 中查看:



点击可以看到运行的日志:

如果在打包镜像的时候报下面错误:
Couldn’t connect to Docker daemon at http+docker://localhost - is it running?
在安装 Runner 的时候会默认创建一个 gitlab-runner 用户,该用户需要有操作 docker 的权限 :
为 gitlab-runner 用户授权:
sudo usermod -aG docker gitlab-runner
重启 docker:
sudo systemctl restart docker
然后再重新运行流水线。
流水线运行结束后到机器上docker ps 查看是否有 test-project 容器:

容器已经启动了,可以通过浏览器访问测试接口:
http://ip:8080/test/t1

成功访问!
下面再创建一个测试接口 t2 :
@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/t1")public String t1(){return "this is server >>> t1 ";}@GetMapping("/t2")public String t2(){return "this is server >>> t2 ";}}
提交代码到远程仓库:

等待流水线构建成功:

访问 t2 测试接口:
http://ip:8080/test/t2

成功访问到 t2 测试接口。
相关文章:
GitLab CI/CD 持续集成/部署 SpringBoot 项目
一、GitLab CI/CD 介绍 GitLab CI/CD(Continuous Integration/Continuous Deployment)是 GitLab 提供的一种持续集成和持续部署的解决方案。它可以自动化软件的构建、测试和部署过程,以便开发者更快地、更频繁地发布可靠的产品。 整体过程如…...
第二证券:政策效应逐步显现 A股修复行情有望持续演绎
上星期,A股商场延续企稳反弹的态势,上证指数震荡上涨0.43%;沪深两市日均成交额回升至8700亿元左右;北向资金近一个月初次转为周净买入5.57亿元。 安排观点一起认为,在稳增加、稳预期相关政策持续发力,上市…...
sql逻辑优化
1.分页 通常使用每页条数及第一页作为参数 开发接口 GetMapping("/querySystemList") public List<SystemAduit> querySystemList(RequestParam("keyword") String keyword,RequestParam(name "offset", defaultValue "0") i…...
【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度
文章目录 5.1 树的基本概念5.1.1 树的定义树有序树、无序树 5.1.2 森林的定义5.1.3 树的术语1. 父亲(parent)、儿子(child)、兄弟(sibling)、后裔(descendant)、祖先(anc…...
2024 Android Framework学习大纲之基础理论篇
2024 Android Framework学习大纲之基础理论篇 受到当前经济影响,互联网越来越不景气了,因此Android App开发也是越来越不景气,中小型公司越来越偏向跨平台开发,比如Flutter,这样能节省成本,笔者也曾经是一名6年多工作经…...
【深度学习】Yolov8 区域计数
git:https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-Region-Counter/readme.md 很长时间没有做yolov的项目了,最近一看yolov8有一个区域计数的功能,不得不说很实用啊。 b站:https://www.bilibili.com/vid…...
Windows 系统服务器部署jar包时,推荐使用winsw,将jar包注册成服务,并设置开机启动。
一、其他方式不推荐的原因 1、Spring Boot生成的jar包,可以直接用java -jar运行,但是前提是需要登录用户,而且注销用户后会退出程序,所以不可用。 2、使用计划任务,写一个bat处理文件,里面写java -jar运行…...
npm 包管理
1. 命令 // 查看是否登录 npm who am i // 登录:输入用户名、密码、邮箱、一次性登录密码(邮箱接收) npm login // 创建 npm init // 快速创建 npm init -y // 发包 npm publish // 发包(开源) npm publish --access …...
力扣370周赛 -- 第三题(树形DP)
该题的方法,也有点背包的意思,如果一些不懂的朋友,可以从背包的角度去理解该树形DP 问题 题解主要在注释里 //该题是背包问题树形dp问题的结合版,在树上解决背包问题 //背包问题就是选或不选当前物品 //本题求的是最大分数 //先转…...
GPT学习笔记
百度的文心一言 阿里的通义千问 通过GPT能力,提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日,第一代iPhone发布,开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线: Copilot - 副驾驶 应用…...
Apex的addError()显示的消息中实现换行
直接用‘<br/>’是无效的,因为addError默认不转义HTML符号,如果需要转义,应该将第二个参数escape设置为false。不过即使设置了也只对classic页面生效,lightning页面还是无法转义。 官方文档: 参考资料…...
STM32中微秒延时的实现方式
STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现(通用)4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序,由于网上找到的驱动方法良莠不齐,笔者在实现时序过…...
2005-2021年全国各省家庭承包耕地面积和家庭承包耕地流转总面积数据(无缺失)
2005-2021年全国各省家庭承包耕地面积和家庭承包耕地流转总面积数据 1、时间:2005-2021年 2、来源:农村经营管理统计NB 3、指标:家庭承包经营耕地面积、家庭承包耕地流转总面积(单位:亩) 4、范围&#…...
【六、http】go的http的客户端重定向
一、http的重定向 重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻…...
AI:61-基于深度学习的草莓病害识别
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...
idea文件比对
idea文件比对 1.项目内的文件比对2.项目间的文件比对3. 剪切板对比4. 版本历史(不同分支和不同commit)对比 1.项目内的文件比对 在项目中选择好需要比对的文件(类),然后选择Compare Files Mac下的快捷键是Commandd, 这样的比对像是git冲突解决一样 …...
重磅发布|美创科技新一代 数据安全管理平台(DSM Cloud)全新升级
重磅发布 新一代 数据安全管理平台(DSM Cloud) 美创科技新一代 数据安全管理平台(简称:DSM Cloud)全新升级,正式发布。 在业务上云飞速发展过程中,快速应对数据激增,同时有效保障数…...
比SAM小60倍的分割一切模型:MobileSAM
1 MobileSAM SAM就是一类处理图像分割任务的通用模型。与以往只能处理某种特定类型图片的图像分割模型不同,SAM可以处理所有类型的图像。 在SAM出现前,基本上所有的图像分割模型都是专有模型。比如,在医学领域,有专门分割核磁图…...
版本控制系统-SVN
SVN Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统。 官网:https://subversion.apache.org 资料:https://svnbook.red-bean.com、https://www.runoob.com/svn/svn-tutorial.html 下载:https://sourceforg…...
【电路笔记】-串联RLC电路分析
串联RLC电路分析 文章目录 串联RLC电路分析1、概述2、瞬态响应3、AC响应4、RCL和CLR配置5、结论 电阻器 、电感器 (L) 和电容器 © 是电子器件中的三个基本无源元件。 它们的属性和行为已在交流电阻、交流电感和交流电容文章中详细介绍。 在本文中,我们将重点讨…...
百考通智能任务书:贴合你的选题,拒绝空话假大空
毕业设计任务书是高校教学管理中的关键环节,它不仅标志着研究工作的正式启动,更是后续开题、实施、论文撰写和答辩全过程的行动依据。然而,许多学生在撰写时常常因不熟悉本专业写作规范、技术表达能力有限,或缺乏权威模板参考而陷…...
2026年,揭秘那些真正安全的原生态食材厂家你不可不知的秘密
随着人们生活水平的提升以及对健康的日益重视,选择真正安全的原生态食材已经成为许多人购买食物的标准。但市场的繁杂使得甄别真正安全的食材厂家变得愈加困难。今天,我将通过几个关键角度,为大家揭秘那些真正安全的原生态食材厂家的秘密&…...
神经网络与深度学习 第3周课程总结
深度学习视觉应用课程总结 一、常用计算机视觉数据集数据集名称发布方/年份规模图像规格类别数主要用途核心特点MNIST美国国家标准与技术研究院60k训练10k测试2828灰度图10类(0-9手写数字)入门级图像分类最经典的手写数字识别基准数据集Fashion-MNISTZalando(2017)60k训练10k测…...
从“DOC/PDF”到“WPS”:细看GJB438C-2021文档格式要求背后的国产化信号与落地指南
从“DOC/PDF”到“WPS”:GJB438C-2021文档格式变革的深度解读与实施策略 当一份国家军用标准在文档格式描述中刻意删除"DOC/PDF"字样,转而明确标注"(WPS)文档处理器"时,这绝非简单的技术参数调整。…...
终极Node.js Mock工具:Mockery入门到精通实战教程
终极Node.js Mock工具:Mockery入门到精通实战教程 【免费下载链接】mockery Simplifying the use of mocks with Node.js 项目地址: https://gitcode.com/gh_mirrors/mock/mockery Mockery是Node.js生态中简化Mock使用的终极工具,它为开发者提供了…...
ComfyUI-WD14-Tagger:3分钟实现AI智能图像标签提取,效率提升10倍
ComfyUI-WD14-Tagger:3分钟实现AI智能图像标签提取,效率提升10倍 【免费下载链接】ComfyUI-WD14-Tagger A ComfyUI extension allowing for the interrogation of booru tags from images. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-WD14-…...
全方位梳理 OpenClaw 部署与使用干货
OpenClaw 一键安装包|可视化部署,简化环境配置流程 ✨适配系统:Windows10/11 64 位 当前版本:v2.7.5(虾壳云版) ✨核心优势:全程可视化操作,不用命令行、不用手动配置 Python/Node…...
3分钟掌握抖音视频批量下载:解放双手的素材收集革命
3分钟掌握抖音视频批量下载:解放双手的素材收集革命 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为一个个手动保存抖音视频而烦恼吗?想要高效收集创作者素材却苦于没有合适的…...
LLM测试工程师必看,Claude E2E测试架构设计,从用例生成、黄金样本构建到回归基线告警闭环
更多请点击: https://codechina.net 第一章:LLM测试工程师必看,Claude E2E测试架构设计,从用例生成、黄金样本构建到回归基线告警闭环 核心架构概览 Claude端到端测试架构采用三层解耦设计:输入层(动态用…...
关于软件版本升级的故事
起因在群里有网友说软件的版本升级比较简单,俺就回了四个字母“PACS”,并补上了一个表情 然后看见开始细说了:一、PACS 属于哪一类?PACS 软件 第二类医疗器械(独立软件)国家药监局分类:Ⅱ 类 2…...
