如果我们有个小型的项目,运行在自己的服务器上,一般开发流程是本地开发,推送到github,然后自己手动登录服务器,拉取最新的代码并打包,然后把打出的包上线。

我们希望当我们在github上 push 代码的时候,github 能够自动通知服务器拉取最新的代码并打包,然后把打出的包上线。此时我们不用专门去搭建一套CI/CD系统(比如jenkins、gitlab ci)。

最简单的方式可以怎么做呢?我们可以使用GitHub Actions来实现这个需求,具体方案如下。

步骤 1:配置 GitHub Secrets

在 GitHub 仓库 设置:

  1. Settings → Secrets and variables → Actions → New repository secret
  2. 添加:
    • SSH_HOST = your-server-ip # 服务器IP
    • SSH_USER = your-username # 服务器用户名
    • SSH_KEY = 你的 SSH 私钥(用 cat ~/.ssh/id_rsa 复制粘贴) # 你的开发机SSH私钥

在 github 的actions 里面 有 两个tab: secrets 和 variables

  • Secrets(机密信息) 👉 存放 敏感数据(如 SSH Key)
  • Variables(变量) 👉 存放 普通变量(如路径、环境变量等)

:::tip
SSH_KEY 是你的开发机SSH私钥,而不是服务器的SSH私钥。还有是私钥不是公钥。
:::

如果你不会生成SSH私钥,可以参考这篇文章

步骤 2:创建 GitHub Actions 工作流

在仓库根目录创建 .github/workflows/deploy.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
name: Deploy to Server

on:
push:
branches:
- main

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

- name: Deploy via SSH
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
# 进入项目目录
cd /var/www/your-project-name

# 拉取最新代码
git pull origin main

# 安装依赖
pnpm install

# 执行构建
pnpm run build

# 获取目标目录和备份目录
TARGET_DIR="${{ vars.TARGET_DIR }}"
BACKUP_DIR="${{ vars.BACKUP_DIR }}"
SOURCE_DIR="${{ vars.SOURCE_DIR }}"
# 备份旧目录
if [ -d "$TARGET_DIR" ]; then
echo "检测到 $TARGET_DIR 存在,备份到 $BACKUP_DIR"
mv "$TARGET_DIR" "$BACKUP_DIR"
fi

# 复制新构建的 build 目录
cp -r "$SOURCE_DIR" "$TARGET_DIR"

echo "部署完成 🎉"

步骤 3(可选):添加环境变量

上面代码里面,我们用到了 3 个环境变量:

  • PROJECT_DIR = /var/www/your-project-name # 你的项目目录
  • DEPLOY_DIR = /var/www/public/your-project-name # 部署到服务器的目录
  • SOURCE_DIR = /var/www/your-project-name/dist # 构建产物目录

如果你有 不敏感的环境变量,可以添加到 Variables(变量):

进入 Settings → Secrets and variables → Actions → Variables

点击 New repository variable

添加如下内容(可选):

  • PROJECT_DIR = /var/www/your-project-name # 你的项目目录
  • DEPLOY_DIR = /var/www/public/your-project-name # 部署到服务器的目录
  • SOURCE_DIR = /var/www/your-project-name/dist # 构建产物目录

:::tip
PROJECT_DIR 是你的项目目录,DEPLOY_DIR 是你的部署目录。SOURCE_DIR 是你的构建产物目录。

这些都是针对服务器的目录。 不是你的本地目录。
:::

步骤 4:查看 GitHub Actions 运行状态

  1. 进入 GitHub 仓库
  2. 点击 “Actions” 标签
  3. 你会看到 Deploy to Server 的运行记录
  4. 如果部署失败,点击进日志查看具体错误信息

总结

通过以上步骤,你就可以实现 GitHub Actions 自动化部署到服务器了。