【CICID】GitHub-Actions-SpringBoot项目部署

[TOC]

【CICID】GitHub-Actions-SpringBoot项目部署

0 流程图

image-20240616161657214

1 创建SprinBoot项目

​ IDEA创建本地项目,然后推送到 Github

1.1 项目结构

image-20240616162532127

1.2 Dockerfile文件

根据自身项目,修改

CMD ["java","-jar","/app/target/SprintBoot-Template-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

# Docker 镜像构建
FROM maven:3.5-jdk-8-alpine as builder# 指定工作目录
WORKDIR /app
# 将文件复制到容器里
COPY pom.xml .
COPY src ./src
# 方案一:用本地打的包
# COPY target ./target
# 方案二:容器内打包,并跳过测试用例
RUN mvn package -DskipTests# 启动服务
#   -- 指定 application-prod.yml 启动
CMD ["java","-jar","/app/target/SprintBoot-Template-0.0.1-SNAPSHOT.jar","--spring.profiles.active=prod"]

2 云服务器环境搭建

​ 准备好自己购买的云服务,搭建环境

2.1 安装docker

​ 安装教程:https://www.runoob.com/docker/centos-docker-install.html

2.2 获取IP、账号、密码

​ Github配置中使用

3 Github配置

3.1 配置密码

  • REMOTE_SERVER01_IP : 云服务器地址
  • REMOTE_SERVER01_PWD: 登录密码 (默认使用root角色)

image-20240616165032014

3.2 创建Action

image-20240616163542900

image-20240616163711973

3.2 action代码

  • jobs.build.env : 定义变量
    • Host_IP: 远程服务器的地址
    • Host_Dir : 远程服务器的存放目录
    • Host_Role :远程服务器的账号
    • Host_PWD :远程服务器的密码
    • VERSION : 版本号
name: SpringBoot项目部署on:# 当向分支进行git push时触发该工作流push:branches:- "main"# 当向master分支合并分支时触发该工作流pull_request:branches:- "main"# 工作流具体执行的任务
jobs:build:# 运行在虚拟机上,指定虚拟机及其版本runs-on: ubuntu-latestenv:# 端口号Port: 8081# 云服务地址Host_IP: ${{secrets.REMOTE_SERVER01_IP}}# 路径Host_Dir: "/cicd"# 账号Host_Role: root# 云服务密码Host_PWD: ${{secrets.REMOTE_SERVER01_PWD}}# 版本VERSION : 0.1steps:# 定义环境变量- name: Define environment variablesrun: |# 定义全局变量PROJECT_NAME=$(basename $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')FILE_NAME=${PROJECT_NAME}-backend# 写入环境中echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_ENV"echo "FILE_NAME=$FILE_NAME" >> "$GITHUB_ENV"# 测试环境变量- name: Use variable from environmentrun: |echo "================= env ============"echo "端口号:$Port"echo "仓库全名称:$GITHUB_REPOSITORY"echo ${GITHUB_REF##*/}echo "服务器地址: $Host_IP"echo "服务器密码: $Host_PWD"echo "服务器目录: $Host_Dir"echo "项目版本号: $VERSION"echo "================= GITHUB_ENV ============"echo "项目名称 (从环境变量): $PROJECT_NAME"echo "文件名称 (从环境变量): $FILE_NAME"# 拉取最新代码- name: Pull latest codeuses: actions/checkout@v3       # 使用官方的checkout action,用于将仓库中的最新代码检查并拉取到工作目录中# 设置JDK版本- name: Set up JDK 1.8uses: actions/setup-java@v3     # 安装java环境的actionwith:java-version: '8.0'           # 指定jkd版本distribution: 'temurin'cache: maven                  # 使用maven缓存,避免每次构建项目时都要重新下载maven依赖# 构建镜像- name: Build docker imagerun: |docker build -t ${FILE_NAME}:${VERSION} .    # 构建docker镜像,命令最后的点代表Dockerfile所在目录docker save -o  ${FILE_NAME}.tar  ${FILE_NAME}:${VERSION} # 保存压缩后的docker镜像,这一步是为了方便后面我们将该镜像上传至指定的服务器# 查看镜像文件大小- name: Print file sizerun: |FILE_PATH="./${FILE_NAME}.tar"FILE_SIZE_MB=$(echo "scale=2; $(stat -c%s "$FILE_PATH") / (1024 * 1024)" | bc) # 生成文件大小echo "Generated file size: $FILE_SIZE_MB MB"# 删除旧的docker镜像- name: Delete old docker imageuses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run:# 停止运行中的docker容器、删除该容器、删除镜像docker stop ${{env.FILE_NAME}} || true && docker rm ${{env.FILE_NAME}} || true && docker rmi ${{env.FILE_NAME}}:${{env.VERSION}} || true# 删除旧的docker镜像压缩包- name: Delete old docker taruses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run: |echo "Attempting to delete ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar"rm -rf ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar# 上传新的docker镜像- name: upload new docker image and start-up scriptrun:sshpass -p ${Host_PWD} scp -r -o StrictHostKeyChecking=no ./${FILE_NAME}.tar ${Host_Role}@${Host_IP}:${Host_Dir}# 加载tar文件,加载docker镜像- name: Load new docker imageuses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run:docker load -i ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar# docker run 运行,启动容器- name: Run projectuses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run:docker run -d -p ${{env.Port}}:8080 --name ${{env.FILE_NAME}} ${{env.FILE_NAME}}:${{env.VERSION}}

4 触发

  • Push 触发

    代码push到Github时,自动触发

  • 手动触发

5 效果

5.1 查看Action信息

执行成功,若执行失败点进去可以看报错信息

image-20240616170348739

image-20240616172006222

5.3 云服务器

5.3.1 登录服务器,查看docker

  • 查看docker镜像:docker images
  • 查看docker容器:docker ps -a

image-20240616170821515

5.3.2 页面访问

image-20240616170911821

6 参考文档

  • 免费使用 GitHub Actions 自动打包部署 Spring Boot 项目到服务器

    https://blog.imzjw.cn/posts/d347d656/index.html#%E5%89%8D%E8%A8%80

  • github actions实现CICD https://blog.csdn.net/m0_68377725/article/details/132033543

  • 使用 GitHub Actions 自动构建部署发布 Spring Boot 应用

    https://blog.ning.moe/posts/gitub-actions/index.html

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

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

相关文章

国产精品ORM框架-SqlSugar详解 SqlSugar初识 附案例源码 云草桑 专题一

国产精品ORM框架-SqlSugar详解 1、SqlSugar初识 2、开始实操 3、增删改操作 4、进阶功能 5、集成整合 6、脚手架应用 sqlsugar 官网-CSDN博客 国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题二-CSDN博客 1、SqlSugar初识 1.1 基本概念和历史 SqlSugar 是一款 老牌 …

vim网络和安全的操作及shell的使用

目录 vim模式 一般模式下的基本操作: 一般模式切换到编辑模式: 一般模式切换到命令模式: Vim多窗口使用技巧 横向切割打开: 纵向切割打开: 关闭多窗口: 窗口的切换: 网络:…

《大数据基础》相关知识点及考点,例题

1.6大数据计算模式 1、MapReduce可以并行执行大规模数据处理任务,用于大规模数据集(大于1TB)的并行运算。MapReduce 极大地方便了分布式编程工作,它将复杂的、运行于大规模集群上的并行计算过程高度地抽象为两个函数一一Map和Redu…

[MySQL][复核查询][多表查询][自连接][自查询]详细讲解

目录 1.铺垫&基本查询回顾1.多表查询1.何为笛卡尔积?2.示例 2.自连接1.何为自连接?2.示例 3.子查询1.何为子查询?2.单行子查询3.多行子查询4.多列子查询5.在from子句中使用子查询6.合并查询 1.铺垫&基本查询回顾 前面讲解的MYSQL表的…

获取欧洲时报中国板块前新闻数据-scrapy

这里写目录标题 1.创建项目文件二.爬虫文件编写三.管道存储四.settings文件 1.创建项目文件 创建scrapy项目的命令&#xff1a;scrapy startproject <项目名字> 示例&#xff1a; scrapy startproject myspiderscrapy genspider <爬虫名字> <允许爬取的域名>…

修改了mybatis的xml中的sql不重启服务器如何动态加载更新

目录 一、背景 二、注意 三、代码 四、使用示例 五、其他参考博客 一、背景 开发一个报表功能&#xff0c;好几百行sql&#xff0c;每次修改完想自测下都要重启服务器&#xff0c;启动一次服务器就要3分钟&#xff0c;重启10次就要半小时&#xff0c;耗不起时间呀。于是在…

windows docker nvidia wsl2

下载驱动(GeForce Experience里的也可以)https://www.nvidia.cn/Download/index.aspx 安装wsl2https://blog.csdn.net/qq_39942341/article/details/121512900?ops_request_misc%257B%2522request%255Fid%2522%253A%2522172122816816800227436617%2522%252C%2522scm%2522%253A…

Docker构建LNMP环境并运行Wordpress平台

1.准备Nginx 上传文件 Dockerfile FROM centos:7 as firstADD nginx-1.24.0.tar.gz /opt/ COPY CentOS-Base.repo /etc/yum.repos.d/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c make && \useradd -M -s /sbin/nologin nginx && \cd /o…

沙尘传输模拟教程(基于wrf-chem)

沙尘传输模拟教程(基于wrf-chem) 文章目录 沙尘传输模拟教程(基于wrf-chem)简介实验目的wrf-chem简介 软件准备wps、wrf-chem安装conda安装ncl安装ncap安装 数据准备气象数据准备下垫面数据准备 WPS数据预处理namelist.wps的设置geogrid.exe下垫面处理ungrib.exe气象数据预处理…

SSE(Server Sent Event)实战(3)- Spring Web Flux 实现

上篇博客 SSE&#xff08;Server Sent Event&#xff09;实战&#xff08;2&#xff09;- Spring MVC 实现&#xff0c;我们用 Spring MVC 实现了简单的消息推送&#xff0c;并且留下了两个问题&#xff0c;这篇博客&#xff0c;我们用 Spring Web Flux 实现&#xff0c;并且看…

STM32(六):STM32指南者-定时器实验

目录 一、基本概念1、常规定时器2、内核定时器 二、基本定时器实验1、实验说明2、编程过程&#xff08;1&#xff09;配置LED&#xff08;2&#xff09;配置定时器&#xff08;3&#xff09;设定中断事件&#xff08;4&#xff09;主函数计数 3、工程代码 三、通用定时器实验实…

【Neural signal processing and analysis zero to hero】- 2

Nonstationarities and effects of the FT course from youtube: 传送地址 why we need extinguish stationary and non-stationary signal, because most of neural signal is non-stationary. Welch’s method for smooth spectral decomposition Full FFT method y…

【TDA4板端部署】基于 Pytorch 训练并部署 ONNX 模型在 TDA4

1 将torch模型转onnx模型 Ti转换工具只支持以下格式&#xff1a; Caffe - 0.17 (caffe-jacinto in gitHub) Tensorflow - 1.12 ONNX - 1.3.0 (opset 9 and 11) TFLite - Tensorflow 2.0-Alpha 基于 Tensorflow、Pytorch、Caffe 等训练框架&#xff0c;训练模型&#xff1a;选择…

数据结构与算法(2):顺序表与链表

1.前言 哈喽大家好喔&#xff0c;今天博主继续进行数据结构的分享与学习&#xff0c;今天的主要内容是顺序表与链表&#xff0c;是最简单但又相当重要的数据结构&#xff0c;为以后的学习有重要的铺垫&#xff0c;希望大家一起交流学习&#xff0c;互相进步&#xff0c;让我们…

数据结构之跳表SkipList、ConcurrentSkipListMap

概述 SkipList&#xff0c;跳表&#xff0c;跳跃表&#xff0c;在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中&#xff0c;跳跃表使用概率均衡技术而不是使用强制性均衡&#xff0c;因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lis…

AQS详解(详细图文)

目录 AQS详解1、AQS简介AbstractQueuedSynchronizer的继承结构和类属性AQS的静态内部类Node总结AQS的实现思想总结AQS的实现原理AQS和锁的关系 2、AQS的核心方法AQS管理共享资源的方式独占方式下&#xff0c;AQS获取资源的流程详解独占方式下&#xff0c;AQS释放资源的流程详解…

如何通过DBC文件看懂CAN通信矩阵

实现汽车CAN通信开发&#xff0c;必不可少要用到DBC文件和CAN通信矩阵。 CAN通信矩阵是指用于描述 CAN 网络中各个节点之间通信关系的表格或矩阵。它通常记录了每个节点能够发送和接收的消息标识符&#xff08;ID&#xff09;以及与其他节点之间的通信权限。 通信矩阵在 CAN 网…

利用Msfvenom获取WindowsShell

一、在kali主机上利用msfvenom生成windows端的安装程序(exe文件),程序名最好取一个大家经常安装的程序,如腾讯视频、爱奇艺等。 (1)由于生成的程序可能会被杀毒软件识别,我们比较一下使用单个编码器生成的程序与用两个编码器生成的程序,哪个更容易被识别。 利用单个编码…

SSE(Server Sent Event)实战(2)- Spring MVC 实现

一、服务端实现 使用 RestController 注解创建一个控制器类&#xff08;Controller&#xff09; 创建一个方法来创建一个客户端连接&#xff0c;它返回一个 SseEmitter&#xff0c;处理 GET 请求并产生&#xff08;produces&#xff09;文本/事件流 (text/event-stream) 创建…

如何使用Milvus Cloud进行稀疏向量搜索

如何使用Milvus Cloud进行向量搜索Milvus Cloud 是一款高度可扩展、性能出色的开源向量数据库。在最新的 2.4 版本中,Milvus Cloud 支持了稀疏和稠密向量(公测中)。本文将利用 Milvus Cloud 2.4 来存储数据集并执行向量搜索。 接下来,我们将演示如何利用 Milvus Cloud 在 M…