前段时间写了一个通过 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 中调用,不用担心泄露的问题。
点击项目的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 完成自动化部署的最佳方案了。希望对大家有所帮助。