当前位置: 首页 > news >正文

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍

本文件主要介绍如何将SpringBoot应用使用Docker方式部署,并用Gitlab CI/CD进行构建和部署。

环境准备

  1. 已安装Gitlab仓库
  2. 已安装Gitlab Runner,并已注册到Gitlab和已实现基础的CI/CD使用
  3. 创建Docker Hub仓库,教程中使用的是阿里云的Docker Hub仓库
  4. Gitlab Runner所在服务器和部署应用的服务器都已安装好Docker,并成功登录上创建好的Docker Hub仓库
  5. Gitlab Runner所在服务器与部署应用的服务器之间已实现免登陆访问
  6. 能成功访问的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方式部署&#xff0c;并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner&#xff0c;并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库&#xff0c;教程中使用的是阿里云的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 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 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数组中两个数的最大异或值(哈希表、前缀树:实现前缀树)

数组中两个数的最大异或值(哈希表、前缀树&#xff1a;实现前缀树) LeetCode题目&#xff1a;https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/ 哈希表解法 本题使用哈希表方法主要运用到一个定理&#xff1a;异或满足算法交换律。即如果a^b c&#x…...

机场运行关键指标计算规则

一、总体指标 1.放行正常率 机场放行航班&#xff1a;计划出港时间在当天的已出港航班&#xff0c;航班任务为正班、加班、旅包 放行正常航班&#xff1a;实际起飞时间≤MAX[实际落地时间10分钟&#xff08;计划出港时间-计划进港时间&#xff09;&#xff0c;计划出港时间]3…...

基于元学习神经网络的类人系统泛化

Nature 上介绍了一个关于AI在语言泛化方面的突破性研究。科学家们创建了一个具有人类般泛化能力的AI神经网络&#xff0c;它可以像人类一样将新学到的词汇融入现有词汇&#xff0c;并在新环境中使用它们。与ChatGPT 相比&#xff0c;该神经网络在系统性泛化测试中表现得更好。 …...

力扣第322题 零钱兑换 c++ java 动态规划

题目 322. 零钱兑换 中等 相关标签 广度优先搜索 数组 动态规划 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组…...

uniapp 子组件内使用定时器无法清除

涉及到的知识点&#xff1a;1.ref绑定在组建上获取组件实例。2.emit逆向传值&#xff0c;不需要点击触发&#xff0c;watch监听即可。 需求&#xff1a;在父页面的子组件定时发送请求&#xff0c;离开父页面就停止&#xff0c;再次进入就开启。 问题&#xff1a;在父页面的子…...

加载动态库的几种方式

静态加载、动态加载和延迟加载 dll加载方式大致可以分为3类&#xff1a;静态加载、动态加载和延迟加载 1.静态加载&#xff0c;dll的加载发生在程序main函数启动前。 2.动态加载&#xff0c;使用LoadLibrary或者LoadLibraryEx来加载一个dll。当dll加载成功时&#xff0c;你会…...

视频转序列图片:掌握技巧,轻松转换

随着社交媒体和视频平台的日益普及&#xff0c;视频已成为我们生活中不可或缺的一部分。有时&#xff0c;我们需要将视频转换为图片序列&#xff0c;例如制作GIF动图或提取视频中的特定画面。现在一起来看云炫AI智剪如何将视频转换为序列图片&#xff0c;并轻松实现转换。 操作…...

python 数据挖掘库orange3 介绍

orange3 是一个非常适合初学者的data mining library. 它让使用者通过拖拽内置的组件来形成工作流。让你不需要写任何代码就可以体验到数据挖掘和可视化的魅力。 它的桌面如下&#xff0c;这里我创建了 3 个节点&#xff0c;分别是数据集、小提琴图&#xff0c;散点图 其中 …...

Android和JNI交互 : 常见的图像格式转换 : NV21、RGBA、Bitmap等

1. 前言 最近在使用OpenCV处理图片的时候&#xff0c;经常会遇到需要转换图像的情况&#xff0c;网上相关资料比较少&#xff0c;也不全&#xff0c;有时候得费劲老半天才能搞定。 自己踩了坑后&#xff0c;在这里记录下&#xff0c;都是我在项目中遇到的图像转化操作&#xf…...

AndroidAuto 解决连接手机启动AA屏闪一下问题

AndroidAuto一般在AndroidManifest.xml注册的Activity配置过滤监听特定手机的USB插拔启动AA <activityandroid:name=".sink.ui.MainActivity"android:configChanges="keyboard|keyboardHidden|uiMode"android:windowSoftInputMode="stateHidden&qu…...

jbase实现业务脚本化

经过晚上和早上的努力&#xff0c;终于补上框架最后一块了&#xff0c;业务脚本侦听变化后自动编译jar包和调用&#xff0c;实现维护成本低&#xff0c;开发效率高的框架的基本体系。 实现自动编译jar包的类 package appcode;import org.w3c.dom.Document; import org.w3c.do…...

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等&#xff1f;1.2 为什么需要幂等性&#xff1f;1.3 接口超时&#xff0c;应该如何处理&#xff1f;1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面&#xff0c;主键/唯一索引冲突3.2 数据库层面&#xff0c;乐观锁…...

基于设深度学习的人脸性别年龄识别系统 计算机竞赛

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习机器视觉的…...

0001Java安卓程序设计-基于Android多餐厅点餐桌号后厨前台服务设计与开发

文章目录 **摘** **要****目** **录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 移动互联网时代的到来&#xff0c;给人们的生活带来了许多便捷和乐趣。随着用户的不断增多&#xff0c;其规模越来越大&#…...

Node.js 中解析 HTML 的方法介绍

在 Web 开发中&#xff0c;解析 HTML 是一个常见的任务&#xff0c;特别是当我们需要从网页中提取数据或操作 DOM 时。掌握 Node.js 中解析 HTML 的各种方式&#xff0c;可以大大提高我们提取和处理网页数据的效率。本文将介绍如何在 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 并发用户测试 附件&#xff1a; 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…...

AI:53-基于机器学习的字母识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

Qwen系列之Qwen3解读:最强开源模型的细节拆解

文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

MySQL基本操作(续)

第3章&#xff1a;MySQL基本操作&#xff08;续&#xff09; 3.3 表操作 表是关系型数据库中存储数据的基本结构&#xff0c;由行和列组成。在MySQL中&#xff0c;表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...