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

news2024/11/23 4:26:01

[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

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

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

相关文章

Scrapy框架实现数据采集的详细步骤

需求描述: 本项目目标是使用Scrapy框架从宁波大学经济学院网站(nbufe.edu.cn)爬取新闻或公告详情页的内容。具体需求如下: 1、通过遍历多个页面(共55页)构建翻页URL。 2、使用scrapy自带的xpath从每页的…

STM32智能机器人避障系统教程

目录 引言环境准备智能机器人避障系统基础代码实现:实现智能机器人避障系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:机器人导航与避障问题解决方案与优化收尾与总结 1. 引言 智能机器人避…

Android ImageDecoder把瘦高/扁平大图相当于fitCenter模式decode成目标小尺寸Bitmap,Kotlin

Android ImageDecoder把瘦高/扁平大图相当于fitCenter模式decode成目标小尺寸Bitmap,Kotlin val sz Size(MainActivity.SIZE, MainActivity.SIZE)val src ImageDecoder.createSource(mContext?.contentResolver!!, uri)val bitmap ImageDecoder.decodeBitmap(sr…

iPhone数据恢复篇:在 iPhone 上恢复找回短信的 5 种方法

方法 1:检查最近删除的文件夹 iOS 允许您在 30 天内恢复已删除的短信。您需要先从“设置”菜单启用“过滤器”。让我们来实际检查一下。 步骤 1:打开“设置” > “信息”。 步骤 2:选择“未知和垃圾邮件”,然后切换到“过滤…

全开源批量SEO外链工具html源码

全开源批量SEO外链工具html源码,已更新增加大量高质量外链 若需要增加修改其他外链请打开txt文件 修复优化页面端代码,界面布局 源码为自适应端,手机和电脑端都适配 源码下载:https://download.csdn.net/download/m0_66047725…

Redis作为缓存,如何保证MySQL数据库与Redis缓存一致性(双写一致性)?

双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。 强一致性:如果项目要求数据库与Redis保持高度一致,可以采用读写锁保证强一致性。采用redisson实现的读写锁,在读的时候添加共…

基于单片机的停车场车位管理系统设计

1.简介 停车场车位管理系统是日常中随处可见的一种智能化车位管理技术,使用该技术可以提高车位管理效率,从而减轻人员车位管理工作负荷。本系统集成车牌识别、自动放行、自助缴费等技术,并且具备车位占用状态实时监测与车位数量实时统计、查询…

论文翻译:Rethinking Interpretability in the Era of Large Language Models

https://arxiv.org/abs/2402.01761 在大型语言模型时代的可解释性再思考 摘要 在过去十年中,随着越来越大的数据集和深度神经网络的兴起,可解释机器学习领域的兴趣迅速增长。同时,大型语言模型(LLMs)在广泛的任务中…

STM32-寄存器点灯案例详解

本文以PA1引脚点亮LED灯为案例,解析了STM32寄存器操作的配置过程,以及从手册查询方法和寄存器配置步骤。 一、概念 1.十六进制和二进制之间相互转换关系 首先,需要了解十六进制和二进制之间的基本转换方法。十六进制是一种基数为16的数制&…

如何在VS200和VScode里面查看数组全部值

如何在VS200和VScode里面查看数组全部值 如何在VS200和VScode里面查看数组全部值 如何在VS200和VScode里面查看数组全部值 需要在调试阶段,在监视窗口添加表达式即可 第一种是解包,能够从0开始查看指定元素个数 第二种是指针索引,能够从0开…

Dpm-tse:目标声音提取的扩散概率模型

第二章 目标说话人提取之《DPM-TSE: A DIFFUSION PROBABILISTIC MODEL FOR TARGET SOUND EXTRACTION》 文章目录 前言一、任务二、动机三、挑战四、方法1.概率扩散模型2.修正噪音时间表和采样步骤3. 模型框架4. 五、实验评价1.数据集2.消融实验3.客观评价4.主观评价 六、结论七…

链接追踪系列-10.mall-swarm微服务运行并整合elk-上一篇的番外

因为上一篇没对微服务代码很详细地说明,所以在此借花献佛,使用开源的微服务代码去说明如何去做链路追踪。 项目是开源项目,fork到github以及gitee中,然后拉取到本地 后端代码: https://gitee.com/jelex/mall-swarm.gi…

全栈 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL笔记(一)

前言 阅读本文你需要有 Next.js 基础 React 基础 Prisma 基础 tailwind 基础 MySql基础 准备工作 打开网站 https://ui.shadcn.com/docs 这不是一个组件库。它是可重用组件的集合,您可以将其复制并粘贴到应用中。 打开installation 选择Next.js 也就是此页面…

C字符串和内存函数介绍(三)——其他的字符串函数

在#include<string.h>的这个头文件里面&#xff0c;除了前面给大家介绍的两大类——长度固定的字符串函数和长度不固定的字符串函数。还有一些函数以其独特的用途占据一席之地。 今天要给大家介绍的是下面这三个字符串函数&#xff1a;strstr&#xff0c;strtok&#xf…

php 可逆与不可逆加密函数

https://andi.cn/page/621536.html

基于机器学习的锂离子电池容量估计(MATLAB R2021B)

锂离子电池已经广泛应用于电动汽车或混合动力汽车的能源存储装置。由于电化学成分的衰退&#xff0c;锂离子电池随着使用时间的增加&#xff0c;电池性能不断退化&#xff0c;导致电池容量和功率发生衰退。电池容量衰退的因素主要有金属锂沉积&#xff0c;活性物质分解和电解液…

周报(1)<仅供自己学习>

文章目录 一.pytorch学习1.配置GPU2.数据读取问题1&#xff08;已解决问题2&#xff08;已解决 3.卷积的学习 二.NeRF学习1.介绍部分问题1&#xff08;已解决 2.神经辐射场表示问题2&#xff08;已解决问题3&#xff08;已解决问题4&#xff08;已解决问题5&#xff1a;什么是视…

NSSCTF中24网安培训day1中web的题目

我flag呢 直接查看源代码即可CtrlU [SWPUCTF 2021 新生赛]Do_you_know_http 用Burpsuite抓包&#xff0c;之后在User-agent下面添加XFF头&#xff0c;即X-Forwarded-For:127.0.0.1 [SWPUCTF 2022 新生赛]funny_php 首先是php的弱比较&#xff0c;对于num参数&#xff0c;我们…

【ChatGPT】深入解析Prompt提示词及如何高效使用ChatGPT

一、Prompt提示词是什么&#xff1f; 1.1 Prompt的定义 Prompt是人工智能领域中的一个关键概念&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;和生成型AI模型中。简而言之&#xff0c;prompt是一段文本或指令&#xff0c;用于引导或启动AI模型的特定响应或操作。…

在pycharm 2023.2.1中运行由R语言编写的ipynb文件

在pycharm 2023.2.1中运行由R语言编写的ipynb文件 背景与目标&#xff1a; 项目中包含由R语言编写的ipynb文件&#xff0c;希望能在pycharm中运行该ipynb文件。 最终实现情况&#xff1a; 未能直接在pycharm中运行该ipynb文件&#xff0c;但是替代的实现方法有&#xff1a;…