【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker
介绍
本文件主要介绍如何将SpringBoot应用使用Docker方式部署,并用Gitlab CI/CD进行构建和部署。
环境准备
- 已安装Gitlab仓库
- 已安装Gitlab Runner,并已注册到Gitlab和已实现基础的CI/CD使用
- 创建Docker Hub仓库,教程中使用的是阿里云的Docker Hub仓库
- Gitlab Runner所在服务器和部署应用的服务器都已安装好Docker,并成功登录上创建好的Docker Hub仓库
- Gitlab Runner所在服务器与部署应用的服务器之间已实现免登陆访问
- 能成功访问的SpringBoot应用
第1,2点可参考文章GitLab CI/CD 应用
第3,4点可参考文章 Docker之镜像上传(阿里云镜像仓库)、使用Dockerfile创建镜像并运行容器
第5点可参考文章 服务器间免登陆访问
Gitlab Runner服务器配置脚本
进入目录/home/gitlab-runner,在该目录下新增两个脚本
pre-docker-start.sh脚本内容
#!/bin/bash
echo "开始检查是否存在运行中的容器 $1 ..."
count=$(docker ps | grep $1 | wc -l)
echo "运行中的容器数量: $count"
if [[ $count -gt 0 ]];thendocker stop $1
fi
count1=$(docker ps -a | grep $1 | wc -l)
echo "已停止的容器数量: $count1"
if [[ $count1 -gt 0 ]];thendocker rm $1
fi
echo "结束脚本"
after-docker-start.sh脚本内容
#!/bin/bash
echo "开始检查是否存在运行中的容器 $1 ..."
count=$(docker ps | grep $1 | wc -l)
echo "运行中的容器数量: $count"
if [[ $count -gt 0 ]];thenecho "$1 启动成功"
elseecho "$1 启动失败"
fi
echo "结束脚本"
在SpringBoot项目的根目录中新增Dockerfile和.gitlab-ci.yml文件

Dockerfile文件内容,推荐文章 使用Dockerfile创建镜像并运行容器,详细语法介绍可查看 官方文档-参考手册
FROM openjdk:8-jreMAINTAINER gitlab gitlab@test.com
ENV LANG en_US.utf8
ENV LC_ALL C.UTF-8
# 挂载目录
VOLUME /home/gitlab-demo
# 时区设置
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# 创建目录
RUN mkdir -p /home/gitlab-demo
# 指定路径
WORKDIR /home/gitlab-demo
EXPOSE 18000
COPY ./target/gitlab-demo-1.0-SNAPSHOT.jar app.jar
ENV SPRING_PROFILES_ACTIVE="dev" EXTRA_OPTS=""
ENTRYPOINT ["/bin/sh", "-c", "java ${EXTRA_OPTS} -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} -jar app.jar"]
.gitlab-ci.yml文件内容,详细语法介绍可查看 官方文档-CI/CD YAML 语法参考
variables:APP_NAME: gitlab-demoVERSION: 0.0.1PORT: 18000
stages:- build- deploybuild:stage: buildtags:- buildrules:- if: $CI_COMMIT_BRANCH == "dev"variables:DOCKER_PREFIX: gitlab-dev- if: $CI_COMMIT_BRANCH == "test"variables:DOCKER_PREFIX: gitlab-test- if: $CI_COMMIT_BRANCH == "main"variables:DOCKER_PREFIX: gitlab-prodscript:- echo "==================before docker build ================"- echo "variables = {DOCKER_PREFIX = ${DOCKER_PREFIX}}"# - docker images | grep uwell-gateway | awk '{print $3}' | xargs docker rmi- mvn clean install -DskipTests- docker build -t ${APP_NAME}:${VERSION} ./- docker tag ${APP_NAME}:${VERSION} registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}- docker push registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}- docker rmi ${APP_NAME}:${VERSION}deploy:stage: deploytags:- deployrules:- if: $CI_COMMIT_BRANCH == "dev"variables:DOCKER_PREFIX: gitlab-devSERVER_PATH: 开发环境IPSPRING_PROFILES_ACTIVE: dev- if: $CI_COMMIT_BRANCH == "test"variables:DOCKER_PREFIX: gitlab-testSERVER_PATH: 测试环境IPSPRING_PROFILES_ACTIVE: testscript:- echo "==================before docker deploy ================"- echo "variables = {DOCKER_PREFIX = ${DOCKER_PREFIX}, SERVER_PATH = ${SERVER_PATH}, SPRING_PROFILES_ACTIVE = ${SPRING_PROFILES_ACTIVE}}"- ssh root@${SERVER_PATH} "docker pull registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}"- ssh root@${SERVER_PATH} 'bash -s' < /home/gitlab-runner/pre-docker-start.sh $APP_NAME- ssh root@${SERVER_PATH} "docker run -d -p ${PORT}:${PORT} -e SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE} --name=${APP_NAME} registry.cn-hangzhou.aliyuncs.com/${DOCKER_PREFIX}/${APP_NAME}:${VERSION}"- ssh root@${SERVER_PATH} 'bash -s' < /home/gitlab-runner/after-docker-start.sh $APP_NAME
验证
提交代码后,打开Gitlab的web页面,找到CI/CD的任务执行记录

每个阶段都执行成功后,查看部署应用的服务器,看应用是否成功部署

相关文章:
【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker
介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署,并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner,并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库,教程中使用的是阿里云的Docker…...
GitLab(2)——Docker方式安装Gitlab
目录 一、前言 二、安装Gitlab 1. 搜索gitlab-ce镜像 2. 下载镜像 3. 查看镜像 4. 提前创建挂载数据卷 5. 运行镜像 三、配置Gitlab文件 1. 配置容器中的/etc/gitlab/gitlab.rb文件 2. 重启容器 3. 登录Gitalb ① 查看初始root用户的密码 ② 访问gitlab地址&#…...
[100天算法】-数组中的第 K 个最大元素(day 54)
题目描述 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k 2 输出: 5 示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k 4 输出: 4 说明:你可以假设 k 总…...
每日一题411数组中两个数的最大异或值(哈希表、前缀树:实现前缀树)
数组中两个数的最大异或值(哈希表、前缀树:实现前缀树) LeetCode题目:https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/ 哈希表解法 本题使用哈希表方法主要运用到一个定理:异或满足算法交换律。即如果a^b c&#x…...
机场运行关键指标计算规则
一、总体指标 1.放行正常率 机场放行航班:计划出港时间在当天的已出港航班,航班任务为正班、加班、旅包 放行正常航班:实际起飞时间≤MAX[实际落地时间10分钟(计划出港时间-计划进港时间),计划出港时间]3…...
基于元学习神经网络的类人系统泛化
Nature 上介绍了一个关于AI在语言泛化方面的突破性研究。科学家们创建了一个具有人类般泛化能力的AI神经网络,它可以像人类一样将新学到的词汇融入现有词汇,并在新环境中使用它们。与ChatGPT 相比,该神经网络在系统性泛化测试中表现得更好。 …...
力扣第322题 零钱兑换 c++ java 动态规划
题目 322. 零钱兑换 中等 相关标签 广度优先搜索 数组 动态规划 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组…...
uniapp 子组件内使用定时器无法清除
涉及到的知识点:1.ref绑定在组建上获取组件实例。2.emit逆向传值,不需要点击触发,watch监听即可。 需求:在父页面的子组件定时发送请求,离开父页面就停止,再次进入就开启。 问题:在父页面的子…...
加载动态库的几种方式
静态加载、动态加载和延迟加载 dll加载方式大致可以分为3类:静态加载、动态加载和延迟加载 1.静态加载,dll的加载发生在程序main函数启动前。 2.动态加载,使用LoadLibrary或者LoadLibraryEx来加载一个dll。当dll加载成功时,你会…...
视频转序列图片:掌握技巧,轻松转换
随着社交媒体和视频平台的日益普及,视频已成为我们生活中不可或缺的一部分。有时,我们需要将视频转换为图片序列,例如制作GIF动图或提取视频中的特定画面。现在一起来看云炫AI智剪如何将视频转换为序列图片,并轻松实现转换。 操作…...
python 数据挖掘库orange3 介绍
orange3 是一个非常适合初学者的data mining library. 它让使用者通过拖拽内置的组件来形成工作流。让你不需要写任何代码就可以体验到数据挖掘和可视化的魅力。 它的桌面如下,这里我创建了 3 个节点,分别是数据集、小提琴图,散点图 其中 …...
Android和JNI交互 : 常见的图像格式转换 : NV21、RGBA、Bitmap等
1. 前言 最近在使用OpenCV处理图片的时候,经常会遇到需要转换图像的情况,网上相关资料比较少,也不全,有时候得费劲老半天才能搞定。 自己踩了坑后,在这里记录下,都是我在项目中遇到的图像转化操作…...
AndroidAuto 解决连接手机启动AA屏闪一下问题
AndroidAuto一般在AndroidManifest.xml注册的Activity配置过滤监听特定手机的USB插拔启动AA <activityandroid:name=".sink.ui.MainActivity"android:configChanges="keyboard|keyboardHidden|uiMode"android:windowSoftInputMode="stateHidden&qu…...
jbase实现业务脚本化
经过晚上和早上的努力,终于补上框架最后一块了,业务脚本侦听变化后自动编译jar包和调用,实现维护成本低,开发效率高的框架的基本体系。 实现自动编译jar包的类 package appcode;import org.w3c.dom.Document; import org.w3c.do…...
【安全】Java幂等性校验解决重复点击(6种实现方式)
目录 一、简介1.1 什么是幂等?1.2 为什么需要幂等性?1.3 接口超时,应该如何处理?1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面,主键/唯一索引冲突3.2 数据库层面,乐观锁…...
基于设深度学习的人脸性别年龄识别系统 计算机竞赛
文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习机器视觉的…...
0001Java安卓程序设计-基于Android多餐厅点餐桌号后厨前台服务设计与开发
文章目录 **摘** **要****目** **录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 摘 要 移动互联网时代的到来,给人们的生活带来了许多便捷和乐趣。随着用户的不断增多,其规模越来越大&#…...
Node.js 中解析 HTML 的方法介绍
在 Web 开发中,解析 HTML 是一个常见的任务,特别是当我们需要从网页中提取数据或操作 DOM 时。掌握 Node.js 中解析 HTML 的各种方式,可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在 Node.js 中解析 HTML。 基本概念 HTML 解析…...
软件开发项目文档系列之十如何撰写测试用例
目录 1 概述1.1 编写目的1.2 定义1.3 使用范围1.4 参考资料1.5 术语定义 2 测试用例2.1 功能测试2.1.1 用户登录功能2.1.2 商品搜索功能 2.2 性能测试2.2.1 网站响应时间2.2.2 并发用户测试 附件: 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…...
AI:53-基于机器学习的字母识别
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...
RVC 技术指南:从问题解决到效率提升
RVC 技术指南:从问题解决到效率提升 【免费下载链接】rvc RVC is a Linux console UI for vSphere, built on the RbVmomi bindings to the vSphere API. 项目地址: https://gitcode.com/gh_mirrors/rvc/rvc 问题场景→核心原理→分步方案→进阶技巧 一、环…...
Chatbot Arena排行榜单实战指南:从数据采集到模型优化
Chatbot Arena排行榜单实战指南:从数据采集到模型优化 在构建和优化自己的对话AI时,我们常常面临一个核心问题:如何客观、全面地评估它的性能?闭门造车式的测试往往带有主观偏见,而Chatbot Arena这类公开的排行榜单&a…...
NaViL-9B效果展示:电商主图自动提取卖点文案+竞品对比分析
NaViL-9B效果展示:电商主图自动提取卖点文案竞品对比分析 1. 多模态大模型惊艳登场 想象一下,当你上传一张商品图片,AI不仅能准确识别图片内容,还能自动生成吸引人的卖点文案——这就是NaViL-9B带来的革命性体验。作为原生多模态…...
大模型赋能多尺度空间智能:从具身感知到地球系统建模的跨学科探索
1. 大模型如何重构空间智能的认知框架 当AlphaGo击败人类棋手时,我们惊叹于AI的策略能力;但当大语言模型开始理解三维空间关系时,这标志着机器认知的质变。空间智能的本质是理解物体间的相对位置、距离和运动规律,这种能力对人类而…...
PlatformIO脚本进阶:告别修改库文件,用Python脚本精准控制FreeRTOS heap文件编译
PlatformIO脚本进阶:精准控制FreeRTOS堆管理文件编译的工程实践 在嵌入式开发中,第三方库的管理一直是个令人头疼的问题。特别是像FreeRTOS这样的实时操作系统,其源代码结构往往包含多个可选组件,开发者需要根据具体硬件和需求选择…...
Claude Code 工程化实战:从工具使用者到 Agent 构建者的进阶之路
Claude Code 工程化实战:从工具使用者到 Agent 构建者的进阶之路 声明: 📝 作者:甜城瑞庄的核桃(ZMJ) 原创学习笔记,欢迎分享,但请保留作者信息及原文链接哦~ 摘要&#…...
无限级数求和与Java实现优化教程
本教程详细讨论了如何准确计算形状 S -(2x)^2/2! (2x)^4/4! - (2x)^6/6! ... 指定范围内的无限级数 [0.1, 1.5] 内部和。文章首先分析了这个级数和 cos(2x) - 1 数学等价性,然后对Java代码中常见的错误进行了深入分析ÿ…...
Bedtools:基因组数据分析的高效工具集
Bedtools:基因组数据分析的高效工具集 【免费下载链接】bedtools A powerful toolset for genome arithmetic. 项目地址: https://gitcode.com/gh_mirrors/be/bedtools 项目价值与应用场景 Bedtools作为一款专注于基因组算术操作的工具集,在生物…...
MIT6.S081 Lab11实战:手把手教你实现E1000网卡驱动的关键函数(附避坑指南)
MIT6.S081 Lab11实战:从零实现E1000网卡驱动的核心逻辑 在操作系统开发领域,网络驱动是连接内核与物理世界的关键桥梁。MIT6.S081课程的Lab11将带领我们深入xv6内核,亲手实现Intel E1000网卡驱动的核心功能。这个实验不仅考验我们对DMA、环形…...
安卓虚拟摄像头:解锁手机摄像头的无限创意可能
安卓虚拟摄像头:解锁手机摄像头的无限创意可能 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam 想要在视频会议中展示精心准备的演示内容?还是希望在直播时使用定制…...
