【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 参考文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容