完全通过 Github Actions 实现项目的自动化部署

前段时间写了一个通过 Github Actions 配合 Webhooks 实现项目自动化部署,但是服务器上由于并没有后端服务,所以实现的方式不太优雅。今天我将完全抛弃 Webhook,完全通过 Github Actions 来实现项目的自动化部署。

改进

如果还没看过上一篇的,可以移步这里看一下Github Actions + Webhooks 实现项目自动化部署

这次的主要改进就是移除了 Webhooks 的依赖,不需要在服务器上进行监听。

其实很简单,就是通过 Github Actions 主动登录服务器,执行自定义脚本,完成 git pull 操作。

Gihub Actions 脚本

完整脚本

大致内容和之前是一样的,优化了两个地方。

增加缓存

增加了对node_modules目录的缓存,从而在大部分时间里加速安装依赖的时间。由于 yarn 的机制,在没有更新 yarn.lock 文件时,安装依赖几乎可以说是直接跳过的,从而大大缩短了每次部署的时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎️
uses: actions/checkout@v2
- name: Restore cached ./node_modules
uses: actions/cache@v2
with:
path: ./node_modules
key: ${{ runner.os }}-yarn-lock-${{ hashFiles('./yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-lock-

可以看到这边采用了官方的actions/cache@v2脚本,根据 yarn.lock 的 hash 值来缓存 node_modules 目录,可以不用担心没法升级依赖。

登录服务器

这边为了安全因素,建议将登录参数储存到项目的 Secrets 中,这样就能通过环境变量在 Github Actions 中调用,不用担心泄露的问题。

Secrets

点击项目的Settings-Secrets-New repository secret即可创建。Secret 名称就是环境变量名,内容则是具体的值。

接着调用appleboy/ssh-action@master脚本,将登录参数指定为对应的环境变量,然后配置一组需要执行的脚本,这边可以根据个人的实际情况进行配置,自由度很高了。既然都能登陆服务器,那自然是想做什么都可以了。

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
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎️
uses: actions/checkout@v2
- name: Restore cached ./node_modules
uses: actions/cache@v2
with:
path: ./node_modules
key: ${{ runner.os }}-yarn-lock-${{ hashFiles('./yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-lock-
- name: Install hexo
run: npm install hexo-cli -g
- name: Install dependencies 🔧
run: yarn install --frozen-lockfile
- name: Build app 🔧
run: hexo g
- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@4.1.0
with:
branch: gh-pages
folder: public
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
port: ${{ secrets.PORT }}
key: ${{ secrets.KEY }}
script: |
cd /your/path
git pull --rebase
ls -al

使用体验

这次的体验很好,基本上不用浪费自己服务器的性能,也可以通过自定义的脚本将服务器上自己关心的内容输出到日志中。我暂时认为这就是现阶段通过 Github Actions 完成自动化部署的最佳方案了。希望对大家有所帮助。