本文借助 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 详解
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-latest
,windows-latest
,macos-latest
等。
步骤级别的关键字:
steps
: 一个job中可以包含多个步骤,每个步骤可以具有自己的name
来标识。
uses
: 指定使用的动作。这可以是GitHub的官方动作,也可以是任何公开的第三方动作,或者存储在相同存储库中的动作。
with
: 用于向步骤传递参数,例如环境变量,工作目录等。
run
: 指定步骤中要执行的命令或脚本。这些命令在runs-on
指定的环境中执行。
env
: 定义环境变量。在此定义的环境变量将在当前步骤的运行环境中可用。