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

avatar
作者
筋斗云
阅读量:6

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!