Github Actions Hexo 自動部署

imba久期發表於2022-11-26

最近重灌了電腦,近幾年內每次重灌也好,裝備新電腦也好,越來越覺得我的部落格是令我比較頭疼的事

因為前幾年從 WordPress 遷移到了 Hexo,雖然變成了純靜態,訪問速度上提高了。但本地檔案的維護、文章的釋出就變得很繁瑣

比如

  • 重灌必須備份
  • 多臺電腦必須同步最新的
  • 釋出文章需要在本地跑三條命令

多臺電腦同步的問題,我在家裡樹莓派上建了個 git 倉庫,專門同步文章。不過大部分時間都會忘記,並且配置檔案、主題的配置檔案都不在文章目錄,所以沒法同步

最近一次重灌我依然是手動備份,重灌後看著這個備份,覺得這樣下去不行,得趕緊拿出個更完美(懶)的方案

想起之前在一個瀏覽器外掛的倉庫看到了自動釋出指令碼,我有個瀏覽器外掛每次釋出都很繁瑣,因此早就想研究一下自動化

所以這次第一個念頭也是自動化:Github Actions

按照之前手動擋的流程是這樣的

  1. 清除快取 hexo clean
  2. 生成靜態檔案 hexo g
  3. 部署 hexo d(執行一次 git 推送)
  4. 遠端倉庫 hooks 被觸發,自動去網站根目錄,git pull

最後網站根目錄拉取到文章,部署成功

其中 3 之前你需要在本地手動執行的,而且重灌或者換電腦意味著需要在遠端伺服器配置新的公鑰

新的半自動擋解決了 1-3,你只需要進行一次 git 提交

其他的事情交給 Github Actions

整個流程是

  • 建立金鑰,用於連線部落格伺服器
  • 安裝 hexo
  • 安裝 hexo 外掛
  • 拉取主題
  • 安裝主題依賴包
  • 檢查主題目錄
  • 配置 git
  • 生成靜態檔案
  • 部署!
name: publish
on:
  push:
    branches:
      - master
jobs:
  publish-blog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 14
          registry-url: https://registry.npmjs.org/
      - name: create keys
        run: |
          mkdir -p ~/.ssh
          echo '${{secrets.PRIVATE_KEY}}' > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts
          ls -l -a ~/.ssh
      - name: install hexo-cli
        if: steps.cache.outputs.cache-hit != 'true'
        run: npm i -g hexo-cli
      - name: install hexo dependencies
        run: npm i
        working-directory: hexo
      - name: pull themes
        run: |
          mkdir -p hexo/themes
          git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git hexo/themes/butterfly
          echo 'themes config'
          cp hexo/themes_butterfly_config.yml hexo/themes/butterfly/_config.yml
          echo 'background image'
          cp hexo/images/bg.png hexo/themes/butterfly/source/img/bg.png
      - name: install themes package
        run: npm i
        working-directory: hexo/themes/butterfly
      - name: check themes package
        run: ls -l
        working-directory: hexo/themes/butterfly
      - name: git config
        run: |
          git config --global user.name imba97
          git config --global user.email mail@imba97.cn
          git config --global init.defaultBranch master
        working-directory: hexo
      - name: hexo generate
        run: |
          hexo clean
          hexo g
        working-directory: hexo
      - name: deploy!
        run: |
          git init
          git add .
          git commit -m "deploy!"
          git remote add origin root@1.2.3.4:/git/blog.git
          git push --force origin master
        working-directory: hexo/public

經過了大概 40 次左右的測試,最後終於是成功部署

主要問題

期間主要解決 git push 不成功,私鑰問題

問題的關鍵是,你不但需要在 ~/.ssh/ 下建立私鑰,還需要建立一個 known_hosts,記錄已知的伺服器 IP

私鑰建立流程,我是在我本地建立了一對金鑰,把私鑰複製出來放到倉庫配置中

工作流使用的時候就把它寫入到檔案

echo '${{secrets.PRIVATE_KEY}}' > ~/.ssh/id_rsa

記錄已知的伺服器 IP 也就是工作流的這一步

ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts

其他小問題

主要是主題,主題自定義的配置檔案和圖片,解決方案是直接放在倉庫,複製過去

所以如果你打算用以上工作流,還得根據自己的主題去改改

至此,我本地將不在管理部落格的任何東西,甚至寫部落格都可以隨時開啟 Github 來寫,比如現在

而且依然也可以在本地寫,如果換主題肯定還是要本地跑一下測一下的

總之,爽到了

為啥說是半自動擋呢,因為我感覺伺服器部分也需要繼續最佳化,不能透過 git hooks 的方式部署,這樣的話遷移到另一臺伺服器還得配置一遍,也是很麻煩的

之後考慮在工作流中用 sftp 直接上傳的方式部署,需要解決的問題是生成靜態檔案數量非常多,目前考慮可以先壓縮,再上傳,再給部落格伺服器傳送解壓命令

等不懶了搞一搞,再水一篇文章 ( ´_ゝ`)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章