用 GitHub Action 自动为远程主机磁盘瘦身
本文最后更新于:2022年4月8日 凌晨
1 问题的提出
谷月姐的博客(https://blog.kukmoon.com,以下简称 本博)是用 Hexo 搭建的,并且通过 Git 部署到采用了 cPanel 面板的虚拟主机[1]。
每次用 hexo d
部署博客时,Hexo 会将上一次提交作为对象文件,写入远程主机的 .git/objects
目录,这样,.git/objects
目录的体积以几何级数增长,很快就吞掉了大多数磁盘空间。
2 用 GitHub Actions 来解决
在上一篇文章[2]中,谷月姐用三个脚本解决了这个问题。这三个脚本分别是:
- 脚本 1:
rebuild_repo.sh
在远程主机上重建博客目录并初始化为 Git 仓库; - 脚本 2:
delete_obj.sh
在远程主机上删除博客目录中的.git/object/
子目录中的所有内容。 - 脚本 3:
deploy.sh
在本地执行,它先将rebuild_repo.sh
上传到远程主机并执行,再执行hexo clean
和hexo d -g
部署博客,最后将delete_obj.sh
上传到远程主机并执行。
上述解决方案适合在本地发布。但是 本博 是把源码放到 GitHub 的,在本地写完博文,推送到 GitHub,由 GitHub Action 在每次推送时完成部署工作。因此,谷月姐需要修改 GitHub Action workflow,让它在部署博客之前执行脚本 1,在部署博客之后执行脚本 2。
参照这篇文章[3],先把脚本 1 rebuild_repo.sh
和脚本 2 delete_obj.sh
复制到博客源文件所在目录的 .github/script/
子目录(如果没有,就新建一个),然后在博客源文件所在目录的 .github/workflows/deploy.yml
(即已有的负责自动部署博客的工作流脚本)中编写以下代码。
注意:把脚本中的 kukmoon
改成你的虚拟主机的登录用户名,把 999.999.999.999
改成你的虚拟主机的 IP 地址。
name: CI
# 只监听 master 分支的改动
on:
push:
branches:
- master
# 自定义环境变量
env:
GIT_USER: Kukmoon # 改成你自己的 GitHub 用户名
GIT_EMAIL: kukmoon97@gmail.com # 改成你自己的 GitHub 注册邮箱
jobs:
build:
name: Build on node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest]
node_version: [12.x] # 改成你本地的 Node.js 版本,可以用 `node --version` 命令查询
steps:
# 获取博客源码和主题,我的主题放在 `theme` 文件夹中,可随博客源码一起获取
- name: Checkout
uses: actions/checkout@v2
# 用 Node.js 渲染
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node_version }}
# 安装 Hexo-cli
- name: Install hexo with dependencies
run: |
npm install -g hexo-cli
# 安装依赖
- name: Install hexo with dependencies
run: |
npm install
# 配置环境
# ssh-kenscan github.com >> ~/.ssh/known_hosts # 从 GitHub 获取公钥并保存到 known_hosts 文件
# ssh-keyscan 999.999.999.999 >> ~/.ssh/known_hosts # 从我的虚拟主机(假设IP为999.999.999.999)获取公钥保存到 known_hosts 文件
- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
ssh-keyscan 999.999.999.999 >> ~/.ssh/known_hosts
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL
# 重建远程主机的仓库
- name: Rebuild remote repo
run: |
scp ${GITHUB_WORKSPACE}/.github/script/rebuild_repo.sh kukmoon@999.999.999.999:/tmp
ssh kukmoon@999.999.999.999 'chmod +x /tmp/rebuild_repo.sh;/bin/sh /tmp/rebuild_repo.sh;rm /tmp/rebuild_repo.sh'
# 生成并部署
- name: Deploy hexo
run: |
hexo clean
hexo g -d
# 部署后更新博客源码,用于添加 abbrlink,如果不用 abbrlink,需要删除
- name: Update Blog
run: |
sh "${GITHUB_WORKSPACE}/.github/script/blog-update.sh"
# 清理远程主机仓库的 .git/objects 目录
- name: Delete remote repo's objects
run: |
scp ${GITHUB_WORKSPACE}/.github/script/delete_obj.sh kukmoon@999.999.999.999:/tmp
ssh kukmoon@999.999.999.999 'chmod +x /tmp/delete_obj.sh;/bin/sh /tmp/delete_obj.sh;rm /tmp/delete_obj.sh'
3 搞定
推送到 GitHub,Actions 自动执行,结果如图所示。
4 参考文献
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!