Featured image of post Github Action 实现项目全自动部署

Github Action 实现项目全自动部署

本文借助 T-Manager 项目(一个 SpringBoot + Vue 的前后端分离项目) 来讲解如何借助Github Action进行项目的自动化部署。

Github Actions 可以用来自动化前后端项目的打包和分发流程。这是一个应用CI/CD(Continuous Integration and Continuous Delivery)原则的流程。每次push更改后,Github Actions可以利用CI/CD流程自动部署到服务器上。我在仓库中的.github/workflows 目录下添加了两个文件:backend-deploy.yaml 和 frontend-deploy.yaml。这两个文件会被 GitHub 识别并自动应用于 GitHub Actions。

在利用Github Actions自动部署之前,你需要手动设置一些Github Action Secrets。

填写 Secrets

在repository → Settings → Secrets and variables → Actions中填入以下几个变量

FRONTEND_DIR = tm-frontend #前端目录,不推荐改因为它要和Nginx联动
SSH_HOST = [your server host]
SSH_PRIVATE_KEY = [yor ssh private key]
SSH_USER = [your server user]
WORK_DIR = T-Manager #后端目录 不推荐改

文件介绍

backend-deploy.yaml
name: Deploy to server

on:
  push:
    branches:
      - master # 与GitHub上的目标分支一致

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Setup Java environment
        uses: actions/setup-java@v2
        with:
          java-version: '8'
          distribution: 'adopt'

      - name: Build with Maven
        run: |
          cd T-Manager # 由于我们的项目是前后端放一起的,这里需要手动上它进入后端目录
          mvn clean package

      - name: Deploy over SSH
        uses: easingthemes/ssh-deploy@v2.1.5
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: "-rltgoDzvO --delete"
          SOURCE: "T-Manager/target/"
          REMOTE_HOST: ${{ secrets.SSH_HOST }}
          REMOTE_USER: ${{ secrets.SSH_USER }}
          TARGET: "${{ secrets.WORK_DIR }}"
frontend-deploy.yaml
name: Build and Deploy Frontend
on:
  push:
    branches:
      - master
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout 🛎️
        uses: actions/checkout@v2.3.1
        with:
          persist-credentials: false

      - name: Install and Build 🔧
        run: |
          cd tm-frontend
          npm install
          npm run build

      - name: Copy 404 page
        run: cp tm-frontend/dist/index.html tm-frontend/dist/404.html

      - name: Deploy over SSH
        uses: easingthemes/ssh-deploy@v2.1.5
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: "-rltgoDzvO --delete"
          SOURCE: "tm-frontend/dist/"
          REMOTE_HOST: ${{ secrets.SSH_HOST }}
          REMOTE_USER: ${{ secrets.SSH_USER }}
          TARGET: "${{ secrets.FRONTEND_DIR }}"

workflow 详解

此处由chatgpt生成

on: 这是Workflow的触发事件,可以指定多种事件类型,例如push, pull_request等,当这些事件发生时,workflow将会被触发。

branches: 用于指定触发workflow的分支。比如,当设置为branches: master时,只有向master分支push时才会触发workflow。

任务级别关键字:

jobs: 表示workflow中的任务,一个workflow可以有多个job。每个job由一个任务名称和一系列步骤构成。例如,在文件frontend-deploy.yaml中,可能有这样的结构:jobs: build: xxx deploy: xxx

runs-on: 用于指定任务执行所需的运行环境。可以指定多种GitHub-hosted的虚拟环境,例如ubuntu-latestwindows-latestmacos-latest等。

步骤级别的关键字:

steps: 一个job中可以包含多个步骤,每个步骤可以具有自己的name来标识。

uses: 指定使用的动作。这可以是GitHub的官方动作,也可以是任何公开的第三方动作,或者存储在相同存储库中的动作。

with: 用于向步骤传递参数,例如环境变量,工作目录等。

run: 指定步骤中要执行的命令或脚本。这些命令在runs-on指定的环境中执行。

env: 定义环境变量。在此定义的环境变量将在当前步骤的运行环境中可用。