用 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 cleanhexo 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 参考文献