【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-latest
    env:
      # 端口号
      Port: 8081
      # 云服务地址
      Host_IP: ${{secrets.REMOTE_SERVER01_IP}}
      # 路径
      Host_Dir: "/cicd"
      # 账号
      Host_Role: root
      # 云服务密码
      Host_PWD: ${{secrets.REMOTE_SERVER01_PWD}}
      # 版本
      VERSION : 0.1

    steps:
      # 定义环境变量
      - name: Define environment variables
        run: |
          # 定义全局变量
          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 environment
        run: |
          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 code
        uses: actions/checkout@v3       # 使用官方的checkout action,用于将仓库中的最新代码检查并拉取到工作目录中

      # 设置JDK版本
      - name: Set up JDK 1.8
        uses: actions/setup-java@v3     # 安装java环境的action
        with:
          java-version: '8.0'           # 指定jkd版本
          distribution: 'temurin'
          cache: maven                  # 使用maven缓存,避免每次构建项目时都要重新下载maven依赖

      # 构建镜像
      - name: Build docker image
        run: |
          docker build -t ${FILE_NAME}:${VERSION} .    # 构建docker镜像,命令最后的点代表Dockerfile所在目录
          docker save -o  ${FILE_NAME}.tar  ${FILE_NAME}:${VERSION} # 保存压缩后的docker镜像,这一步是为了方便后面我们将该镜像上传至指定的服务器


      # 查看镜像文件大小
      - name: Print file size
        run: |
          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 image
        uses: matheusvanzan/sshpass-action@v2
        with:
          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 tar
        uses: matheusvanzan/sshpass-action@v2
        with:
          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 script
        run:
          sshpass -p ${Host_PWD} scp -r -o StrictHostKeyChecking=no ./${FILE_NAME}.tar ${Host_Role}@${Host_IP}:${Host_Dir}



      # 加载tar文件,加载docker镜像
      - name: Load new docker image
        uses: matheusvanzan/sshpass-action@v2
        with:
          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 project
        uses: matheusvanzan/sshpass-action@v2
        with:
          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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker部署canal 并监听mysql

1.部署mysql 需要开启mysql的binlong,和创建好用户等 可以参考这个 Docker部署Mysql数据库详解-CSDN博客 2.部署canal 参考这一篇: docker安装Canal,开启MySQL binlog ,连接Java,监控MySQL变化_docker canal-CSD…

简单搭建卷积神经网络实现手写数字10分类

搭建卷积神经网络实现手写数字10分类 1.思路流程 1.导入minest数据集 2.对数据进行预处理 3.构建卷积神经网络模型 4.训练模型,评估模型 5.用模型进行训练预测 一.导入minest数据集 MNIST--->raw--->test-->(0,1,2...) 10个文件夹 MNIST--->raw-…

【Linux】基于环形队列RingQueue的生产消费者模型

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 环形队列的概念及定义 POSIX信号量 RingQueue的实现方式 RingQueue.hpp的构建 Thread.hpp Main.cc主函数的编写 Task.hpp function包装器的使用 总结 前言…

《Python数据科学之一:初见数据科学与环境》

《Python数据科学之一:初见数据科学与环境》 欢迎来到“Python数据科学”系列的第一篇文章。在这个系列中,我们将通过Python的镜头,深入探索数据科学的丰富世界。首先,让我们设置和理解数据科学的基本概念以及在开始任何数据科学项…

《C专家编程》 C++

抽象 就是观察一群数据,忽略不重要的区别,只记录关注的事务特征的关键数据项。比如有一群学生,关键数据项就是学号,身份证号,姓名等。 class student {int stu_num;int id_num;char name[10]; } 访问控制 this关键字…

安全防御:防火墙概述

目录 一、信息安全 1.1 恶意程序一般会具备一下多个或全部特点 1.2 信息安全五要素: 二、了解防火墙 2.1 防火墙的核心任务 2.2 防火墙的分类 2.3 防火墙的发展历程 2.3.1 包过滤防火墙 2.3.2 应用代理防火墙 2.3.3 状态检测防火墙 补充防御设备 三、防…

Torch-Pruning 库入门级使用介绍

项目地址:https://github.com/VainF/Torch-Pruning Torch-Pruning 是一个专用于torch的模型剪枝库,其基于DepGraph 技术分析出模型layer中的依赖关系。DepGraph 与现有的修剪方法(如 Magnitude Pruning 或 Taylor Pruning)相结合…

uniapp实现水印相机

uniapp实现水印相机-livePusher 水印相机 背景 前两天拿到了一个需求,要求在内部的oaApp中增加一个卫生检查模块,这个模块中的核心诉求就是要求拍照的照片添加水印。对于这个需求,我首先想到的是直接去插件市场,下一个水印相机…

《Python数据科学之五:模型评估与调优深入解析》

《Python数据科学之五:模型评估与调优深入解析》 在数据科学项目中,精确的模型评估和细致的调优过程是确保模型质量、提高预测准确性的关键步骤。本文将详细探讨如何利用 Python 及其强大的库进行模型评估和调优,确保您的模型能够达到最佳性能…

docker中1个nginx容器搭配多个django项目中设置uwsgi.ini的django项目路径

docker中,1个nginx容器搭配多个django项目容器,设置各个uwsgi.ini的django项目路径 被这个卡了一下,真是,哎 各个uwsgi配置应该怎样设置项目路径 django项目1中创建的django项目名为 web 那么uwsgi.ini中要设置为 chdir …

【Vue3 ts】echars图表展示统计的月份数据

图片展示 此处内容为展示24年各个月份产品的创建数量。在后端统计24年各个月份产品数量后,以数组的格式发送给前端,前端负责展示。 后端 entity层: Data Schema(description "月份统计")public class MonthCount {private Stri…

得物六宫格验证码分析

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言(lianxi a…

算法的时间复杂度和空间复杂度-例题

一、消失的数字 . - 力扣&#xff08;LeetCode&#xff09; 本题要求的时间复杂度是O(n) &#xff0c;所以我们不能用循环嵌套&#xff1b; 解法一&#xff1a; int missingNumber(int* nums, int numsSize){int sum10;for(int i0;i<numsSize;i){sum1i;}int sum20;for(i…

C到C嘎嘎的衔接篇

本篇文章&#xff0c;是帮助大家从C向C嘎嘎的过渡&#xff0c;那么我们直接开始吧 不知道大家是否有这样一个问题&#xff0c;学完C的时候感觉还能听懂&#xff0c;但是听C嘎嘎感觉就有点难度或者说很难听懂&#xff0c;那么本篇文章就是帮助大家从C过渡到C嘎嘎。 C嘎嘎与C的区…

MPC轨迹跟踪控制器推导及Simulink验证

文章目录 MPC轨迹跟踪控制器推导及Simulink验证MPC的特点MPC轨迹跟踪控制器推导一 系统离散化二 预测区间状态和变量推导三 代价函数推导四 优化求解 <center> 基于MPC的倒立摆控制系统相关资料Reference&#xff1a; MPC轨迹跟踪控制器推导及Simulink验证 MPC的特点 多…

SAP 消息输出 - Adobe Form

目录 1 安装链接 2 前台配置 - Fiori app 2.1 维护表单模板 (maintain form templates) 2.2 管理微标 (manage logos) 2.3 管理文本 (manage texts) 3 后台配置 3.1 定义表单输出规则 3.2 分配表单模板 SAP 消息输出&#xff0c;不仅是企业内部用来记录关键业务操作也是…

Win11任务栏当中对 STM32CubeMX 的堆叠问题

当打开多个 CubeMX 程序的时候&#xff0c;Win11 自动将其进行了堆叠&#xff0c;这时候就无法进行预览与打开。 问题分析&#xff1a;大部分ST的工具都是基于 JDK 来进行开发的&#xff0c;Win11 将其识别成了同一个 Binary 但是实际上他们并不是同一个&#xff0c;通过配置…

基于conda包的环境创建、激活、管理与删除

Anaconda是一个免费、易于安装的包管理器、环境管理器和 Python 发行版&#xff0c;支持平台包括Windows、macOS 和 Linux。下载安装地址&#xff1a;Download Anaconda Distribution | Anaconda 很多不同的项目可能需要使用不同的环境。例如某个项目需要使用pytorch1.6&#x…

C语言详解(结构体)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…