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

news/2024/11/15 11:48:36/文章来源:https://www.cnblogs.com/leovany/p/18302202

目录
  • 【CICID】GitHub-Actions-SpringBoot项目部署
  • 0 流程图
  • 1 创建SprinBoot项目
    • 1.1 项目结构
    • 1.2 Dockerfile文件
  • 2 云服务器环境搭建
    • 2.1 安装docker
    • 2.2 获取IP、账号、密码
  • 3 Github配置
    • 3.1 配置密码
    • 3.2 创建Action
    • 3.2 action代码
  • 4 触发
  • 5 效果
    • 5.1 查看Action信息
    • 5.3 云服务器
      • 5.3.1 登录服务器,查看docker
      • 5.3.2 页面访问
  • 6 参考文档

【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#前言

  • 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.hqwc.cn/news/743755.html

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

相关文章

使用Visual Studio诊断工具检查内存泄漏——订阅Events

参考文章 8 Ways You can Cause Memory Leaks in .NET订阅事件导致内存泄漏的原因 订阅事件后,该对象将保留对你的类的引用。除非你使用不捕获类成员的匿名方法。 防止Event内存泄漏的方法注销订阅事件。 使用弱句柄(weak-handler)模式。 如果可能,请使用匿名函数进行订阅,…

Jetpack Compose(9)——嵌套滚动

自定义 Composable 组件 目录一、Composable 组件渲染流程1.1 组合1.2 布局1.3 绘制二、自定义组合三、自定义布局3.1 LayoutModifier (自定义 View)3.2 Layout (自定义 ViewGroup)3.3 固有特性测量Intrinsic3.3.1 使用内置组件的固有特性测量3.3.2 自定义固有特性测量3.4 …

ACCESS 用普通按钮控制导航窗体-子窗体中的显示目标

Forms!控制面板!NavigationSubform.SourceObject = "目标窗体"注: 在导航窗体的属性面板中不会显示SourceObject属性,但它是真实存在的.

ECMA标准ECMAScript(JavaScript的一个标准)和C#

2024 年 6 月 26 日,第 127 届 ECMA 大会正式批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为最新 ECMAScript 标准。ECMAScript是ECMA标准中最著名的编程语言标准,它定义了JavaScript语言的核心特性。C#语言则是由ECMA国际组织制定的编程语言标准,目前最新的版本…

CAD、GIS与Three.js如何完美结合,实现2D与3D数据可视化的无限可能

CAD、GIS与Three.js是热门的三大软件或技术,如何将三都完美结合起来,实现2D与3D数据可视化的无限可能呢?现状 AutoCAD是全球最流行的CAD软件之一,其生成的DWG文件格式已经成为二维绘图的事实标准格式。然而,由于AutoCAD使用的是私有文件格式,这些文件只能在支持该格式的C…

HSQL 数据库介绍(2)--使用

本文主要介绍 HSQLDB 的基本使用,文中所使用到的软件版本:Java 11.0.22、HSQLDB 2.7.2。 1、进程内模式 直接使用 JDBC 连接数据库即可,如果数据库不存在会自动创建。 1.1、file 数据库@Test public void inProcessFile() throws SQLException {String dbName = "test&…

Tita的OKR:高端制造行业的OKR案例

高端设备制造行业的发展趋势:产业规模持续扩大:在高技术制造业方面,航空、航天器及设备制造业、电子工业专用设备制造等保持较快增长。新能源汽车保持产销双增,新材料新产品生产也高速增长。 标志性装备不断突破:例如,火电机组、核电机组和水电机组单机容量均超百万千瓦,…

Deepfake Day1:Baseline解读

Deepfake Deepfake是一种使用人工智能技术生成的伪造媒体,特别是视频和音频 深度伪造技术(Deepfake)主要可以分为以下几个研究方向:面部交换:专注于在两个人的图像之间执行身份交换。 面部重演:强调转移源运动和姿态。 说话面部生成:专注于在角色生成中实现口型与文本内…

Blog记录

2024-07-13 博客建立 2024-07-14 博客快照

【Unity】自制PolygonCollider2D

防止和UnityEngine的PolygonCollider2D重名,所有类包裹在了我自己定义的名称空间JimDevPack中,名称空间的声明部分在文章代码中略去了。定义PolygonCollider2D和基类 基类 public class Collider2D : MonoBehaviour {}PolygonCollider2D public class PolygonCollider2D : Co…

C++11 标准库 线程库thread梳理

目录<thread>this_thread命名空间1. get_id()2. sleep_for()3. sleep_until()4. yield()thread类构造函数:类方法1. get_id()2. join()3. detach()4. joinable()5. operator=6. hardware_concurrency(static)多线程的两种计算场景 <thread> this_thread命名空间 在…

大模型中的tempture以及top-p问题

原文:https://blog.csdn.net/jarodyv/article/details/128994176 参考:https://blog.csdn.net/engchina/article/details/138258047 为了使大模型的生成和表达更加多样,GPT采用了tempture以及top-p方法。 GPT的输出层后面一般跟着softmax,在判别式模型中我们会输出概率最高…