Github Actions自动化部署——自动上服流水线

引路文艺倾年-CSDN博客飞哥不鸽-CSDN博客 两位哥,哥教我我给他们丢捻了,两位大佬谁看了不说一句牛!

CI/CD

  • CI(Continuous Integration)持续集成,CD(Continuous Deployment)持续部署。
  • CI:指将代码频繁地合并到共享存储库中,并进行自动化构建和测试,以便能够及早发现和解决潜在问题。
  • CD:是指将代码自动化部署到测试或生产环境中

语法

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
  • name: 工作流的名称。
  • on: 指定次工作流的触发器。push 表示只要有人将更改推送到仓库就会触发工作流运行。(点击这里了解如何指定特定分支,路径或标签)
  • jobs: 将工作流运行的所有作业组合到一起。
  • build-and-deploy: 定义的作业的名称。
  • runs-on: 将作业配置为在最新版本的 Ubuntu Linux 上运行。这意味着作业将在 GitHub 托管的新虚拟机上执行。有关使用其他运行器的语法示例,请参阅 GitHub 操作的工作流语法。
  • steps: 将作业中运行的所有步骤组合在一起。嵌套在此部分下的每个项都是一个单独的操作或 shell 脚本。
  • uses: 指定需要运行的 action。
  • env: 指定运行 action 时需要用到的环境变量的值。

一般流水线包含的几个操作要点如下:workflow->job->step->action

下面正式开始!

后端部署:

第一种:公共仓库(服务器主机账号密码等信息在仓库中配置)

1.密钥配置

REMOTE_IP
 REMOTE_PWD

2.main.yml
# Workflow 名称
 name: Deploy bj-hospital
 
 # 定义触发工作流的事件
 on:
   # 当推送到 main 分支时触发
   push:
     branches: [ main ]
 
   # 允许从 Actions 标签页手动运行此工作流
   workflow_dispatch:
 
 # 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
 jobs:
   develop_build:
     # 定义运行的环境
     runs-on: ubuntu-latest
 
     # 定义作业的步骤
     steps: 
       # 第一步:拉取最新提交的代码到虚拟机中
       - name: Pull code 
         uses: actions/checkout@v3
 
       # 第二步:设置 JDK 环境
       - name: Set jdk 
         uses: actions/setup-java@v3
         with:
           distribution: 'temurin' # 指定使用 temurin jdk
           java-version: '8' # 指定 Java 版本
           cache: 'maven' # 缓存 Maven 依赖项
 
       # 第三步:打包项目,跳过测试
       - name: Package 
         run: mvn -B package -Dmaven.test.skip=true
 
       # 第四步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
       - name: Remove Jar 
         run: sshpass -p ${{ secrets.REMOTE_PWD }} ssh -o StrictHostKeyChecking=no root@${{ secrets.REMOTE_IP }} "cd /data/111/111/GitHub_Action && rm -rf ./*"
 
       # 第五步:通过 SCP 将本地生成的 JAR 包和启动脚本上传到远程服务器的指定目录
       - name: Upload 
         run: sshpass -p ${{ secrets.REMOTE_PWD }} scp -r -o StrictHostKeyChecking=no ./target/xxxxx.jar ./run.sh root@${{ secrets.REMOTE_IP }}:/data/bj-hospital/back_end/GitHub_Action
 
       # 第六步:通过 SSH 连接到远程服务器,赋予启动脚本执行权限并运行该脚本来部署项目
       - name: Deploy 
         run: sshpass -p ${{ secrets.REMOTE_PWD }} ssh -o StrictHostKeyChecking=no root@${{ secrets.REMOTE_IP }} "cd /data/111/111/GitHub_Action && chmod +x run.sh && ./run.sh"
3.run.sh
#! /bin/bash
 # 切换到jar包目录下
 cd /data/bj-hospital/back_end/GitHub_Action
 
 AppName=maple-admin.jar
 
 PID=$(ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}')
 if [ x"$PID" != x"" ]; then
     echo "$AppName is running..."
       kill -9 $PID
       echo "$AppName exited."
 fi
 
 source /etc/profile; nohup java -jar $AppName --spring.profiles.active=prod >> /data/bj-hospital/back_end/logs/$AppName-$(date +%Y-%m-%d).log 2>&1 &
 
 PID=$(ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}')
 if [ x"$PID" != x"" ]; then
     echo "$AppName is successfully run..."
 else
     echo "$AppName is failed."
 fi

里面执行的路径记得要换成自己的鸭!

第二种:私人仓库(服务器信息在config.yml上配置)

# 部署配置文件,服务器的信息
 server:
   host: 'xxxxxxxxxxx'
   username: 'xxxx'
   password: 'xxxxxx'
   remote_path: '/data/111/111/GitHub_Action'  # 目标路径
# Workflow 名称
 name: Deploy bj-hospital
 
 # 定义触发工作流的事件
 on:
   # 当推送到 main 分支时触发
   push:
     branches: [ main ]
 
   # 允许从 Actions 标签页手动运行此工作流
   workflow_dispatch:
 
 # 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
 jobs:
   develop_build:
     # 定义运行的环境
     runs-on: ubuntu-latest
 
     # 定义作业的步骤
     steps:
       # 第一步:拉取最新提交的代码到虚拟机中
       - name: Pull code
         uses: actions/checkout@v3
 
       # 第二步:设置 JDK 环境
       - name: Set jdk
         uses: actions/setup-java@v3
         with:
           distribution: 'temurin' # 指定使用 temurin jdk
           java-version: '8' # 指定 Java 版本
           cache: 'maven' # 缓存 Maven 依赖项
 
       # 第三步:打包项目,跳过测试
       - name: Package
         run: mvn -B package -Dmaven.test.skip=true
 
       # 列出目标目录内容以检查生成的文件
       - name: List target directory
         run: ls -la maple-admin-rest/target
 
       # 加载 config.yml 文件内容
       - name: Load config
         id: config
         run: |
           sudo apt-get update
           sudo apt-get install -y curl
           sudo curl -L -o /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
           sudo chmod +x /usr/local/bin/yq
           echo "HOST=$(yq e .server.host .github/workflows/config.yml)" >> $GITHUB_ENV
           echo "USERNAME=$(yq e .server.username .github/workflows/config.yml)" >> $GITHUB_ENV
           echo "PASSWORD=$(yq e .server.password .github/workflows/config.yml)" >> $GITHUB_ENV
           echo "REMOTE_PATH=$(yq e .server.remote_path .github/workflows/config.yml)" >> $GITHUB_ENV
 
       # 第四步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
       - name: Remove Jar
         run: sshpass -p ${{ env.PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ env.USERNAME }}@${{ env.HOST }} "cd ${{ env.REMOTE_PATH }} && rm -rf ./*"
 
       # 第五步:通过 SCP 将本地生成的 JAR 包和启动脚本上传到远程服务器的指定目录
       - name: Upload
         run: sshpass -p ${{ env.PASSWORD }} scp -r -o StrictHostKeyChecking=no maple-admin-rest/target/xxxx.jar ./run.sh ${{ env.USERNAME }}@${{ env.HOST }}:${{ env.REMOTE_PATH }}
 
       # 第六步:通过 SSH 连接到远程服务器,赋予启动脚本执行权限并运行该脚本来部署项目
       - name: Deploy
         run: sshpass -p ${{ env.PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ env.USERNAME }}@${{ env.HOST }} "cd ${{ env.REMOTE_PATH }} && chmod +x run.sh && ./run.sh"

前端:(同理)

第一种:公共仓库,在里面配置服务器信息

# Workflow 的名称
 name: Deploy bj_hospital_web
 
 # 定义触发事件,push 推送到 master 分支或手动触发
 on:
   # 当推送到 master 分支时触发工作流
   push:
     branches: [ master ]
 
   # 允许从 Actions 标签页手动运行此工作流
   workflow_dispatch:
 
 # 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
 jobs:
   develop_build:
     # 定义运行的环境,这里使用最新版的 Ubuntu
     runs-on: ubuntu-latest
     steps: 
       # 第一步:拉取最新提交的代码到虚拟机中
       - name: Pull code 
         uses: actions/checkout@v3
 
       # 第二步:设置 Node.js 环境
       - name: use Node.js
         # 使用 actions/setup-node 安装 Node.js
         uses: actions/setup-node@v1
         with:
           node-version: 16.x # 指定 Node.js 版本为 16.x
 
       # 第三步:配置国内源以加快依赖项安装速度
       - name: config
         run: yarn config set registry https://registry.npmmirror.com/
 
       # 第四步:安装项目依赖
       - name: dependency
         run: yarn
 
       # 第五步:打包项目
       - name: build
         run: yarn run build
 
       # 第六步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
       - name: Remove Dist 
         run: sshpass -p ${{secrets.REMOTE_PWD}} ssh -o StrictHostKeyChecking=no root@${{secrets.REMOTE_IP}} "cd /data/xxx/nginx/html && rm -rf ./*"
 
       # 第七步:通过 SCP 将本地生成的打包文件上传到远程服务器的指定目录
       - name: Upload 
         run: sshpass -p ${{secrets.REMOTE_PWD}} scp -r -o StrictHostKeyChecking=no ./dist/* root@${{secrets.REMOTE_IP}}:/data/co-school/nginx/html/

第二种:需要添加一个解析config.yml的步骤

# workflow 的名称
 name: Deploy bj_hospital_web
 
 # 定义触发事件,push 推送到 master 分支或手动触发
 on:
   # 当推送到 master 分支时触发工作流
   push:
     branches: [ master ]
 
   # 允许从 Actions 标签页手动运行此工作流
   workflow_dispatch:
 
 # 工作流由一个或多个作业组成,这些作业可以顺序或并行运行
 jobs:
   develop_build:
     # 定义运行的环境,这里使用最新版的 Ubuntu
     runs-on: ubuntu-latest
     steps:
       # 第一步:拉取最新提交的代码到虚拟机中
       - name: Pull code
         uses: actions/checkout@v3
 
       # 加载 config.yml 文件内容
       - name: Load config
         id: config
         run: |
           sudo apt-get update
           sudo apt-get install -y curl
           sudo curl -L -o /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
           sudo chmod +x /usr/local/bin/yq
           echo "HOST=$(yq e .server.host .github/workflows/config.yml)" >> $GITHUB_ENV
           echo "USERNAME=$(yq e .server.username .github/workflows/config.yml)" >> $GITHUB_ENV
           echo "PASSWORD=$(yq e .server.password .github/workflows/config.yml)" >> $GITHUB_ENV
           echo "REMOTE_PATH=$(yq e .server.remote_path .github/workflows/config.yml)" >> $GITHUB_ENV
 
       # 第二步:设置 Node.js 环境
       - name: use Node.js
         # 使用 actions/setup-node 安装 Node.js
         uses: actions/setup-node@v1
         with:
           node-version: 16.x # 指定 Node.js 版本为 16.x
 
       # 第三步:配置国内源以加快依赖项安装速度
       - name: config
         run: yarn config set registry https://registry.npmmirror.com/
 
       # 第四步:安装项目依赖
       - name: dependency
         run: yarn
 
       # 第五步:打包项目
       - name: build
         run: yarn run build
 
       # 第六步:通过 SSH 连接到远程服务器并删除指定目录中的所有文件
       - name: Remove Dist
         run: sshpass -p ${{ env.PASSWORD }} ssh -o StrictHostKeyChecking=no ${{ env.USERNAME }}@${{ env.HOST }} "cd ${{ env.REMOTE_PATH }} && rm -rf ./*"
 
       # 第七步:通过 SCP 将本地生成的打包文件上传到远程服务器的指定目录
       - name: Upload
         run: sshpass -p ${{ env.PASSWORD }} scp -r -o StrictHostKeyChecking=no ./dist/* ${{ env.USERNAME }}@${{ env.HOST }}:${{ env.REMOTE_PATH }}

最最最最最重要!

修改完代码Maven要重新clean重新打包,不然上传的一直是原来的jar包,我这个小傻汁改完忘记重新打包,又多找了5h的bug(哽咽。

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值