使用 GitHub Actions 實現 Hexo 博客自動部署


Image result for image Hexo

一、Hexo 相關知識點

靜態博客簡單,但是發布博文時稍顯麻煩,一般需要下面兩步:

hexo clean
hexo g -d // 相當於 hexo g + hexo d

如果考慮到同步源文件,還需要每次更改后,將源文件 push 到指定倉庫:

git push origin master

我們可以將 Hexo 文件分為兩類,一類是源文件,即下面這些文件:

.
├── _config.yml
├── package.json
├── scaffolds
├── source
|   ├── _drafts
|   └── _posts
└── themes

一類是 public 文件,即網站文件:

public
├── 2020
├── categories
├── tags
....

發布博文的這三個操作代表:

  • hexo clean:刪除網站(public)文件
  • hexo g:生成網站(public)文件
  • hexo d:將本地網站(public)文件同步到指定倉庫(如:yourname.github.io)中

我使用一個私有倉庫存放 Hexo 源文件,在 deppwang/deppwang.github.io 中存放網站文件。所以每次發布或者更新博文時,需要使用 push 操作更新源文件,再執行 hexo cleanhexo g -d 更新博客,比較麻煩。

所以我們希望能在 push 源文件后,由 CI/CD(持續集成/持續部署)工具為我們執行 hexo cleanhexo g -d 這兩個操作。

Image result for github action

二、GitHub Actions

CI/CD 工具前有 Travis CI,現有 GitHub Actions,這里使用 GitHub Actions。

GitHub Actions 的工作原理:我們提前設置好需要自動化執行的任務,GitHub Actions 監控當前倉庫的某一個操作(如:push),一旦有此操作,就自動化執行這些任務。

所以我們希望使用 GitHub Actions 后,只需要往源文件倉庫 push 更新源文件,GitHub Actions 監控到 push 操作時,就自動化執行 hexo cleanhexo g -d 操作,完成博文發布。

Action 存放在項目根目錄的 .github/workflows 下,后綴為 .yml。一個 Action 相當於一個工作流 workflow,一個工作流可以有多個任務 job,每個任務可以分為幾步 step。任務、步驟依次執行。

每個 Action 是一個獨立腳本,所以可以作為代碼倉庫。

  • actions/setup-node 就表示 github.com/actions/setup-node 這個 倉庫,代表安裝 node.js。Action 為 action.yml

可以通過下面這種格式來使用別人寫好的 action,@借用了指針的概念:

actions/setup-node@74bc508 # 指向一個 commit
actions/setup-node@v1.0    # 指向一個標簽
actions/setup-node@master  # 指向一個分支

關於 GitHub Actions 更多知識,請看 GitHub Actions 入門教程 - 阮一峰

現在需要實現一個 Action,使其能夠執行 hexo cleanhexo g -d 操作。

Image result for hexo action

三、Hexo Action

我是使用的 sma11black 已經開發好的 Hexo Action,這個 Action 針對的是存放 Hexo 源文件和網站文件分開存放的場景。請先看 教程,以下為教程的補充。

非第一次生成 SSH Key:

ssh-keygen -t rsa -f ~/.ssh/id_rsa_x -C "yourmail@xxx.com"

將生成的 private key 作為 Hexo 源文件倉庫 Settings > Secrets 的 一個名叫 DEPLOY_KEYSecret。注意:需要復制包括 -----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY----- 的整個內容。Secret 相當於一個變量,可以使私有變量不公開。

將生成的 public key 作為網站文件倉庫 Settings > Deploy Keys 的 Deploy Key。Deploy Keys 中的公鑰針對於當前倉庫。

為什么要用 SSH Key?

  • SSH Key,是一對密匙:公鑰+私鑰,用於加密本地倉庫和遠程倉庫的傳輸內容。是非對稱加密,可公鑰加密、私鑰解密;或私鑰加密、公鑰解密。
  • 使用 GitHub Actions 是借助 GitHub 提供的環境,跟本地環境一樣,也需要有私鑰。當 GitHub Action 執行 hexo g -d 時,用私鑰 DEPLOY_KEY 加密,GitHub 用網站文件倉庫的 Deploy Key 進行驗證。

下面是具體的 action.yml:

name: Deploy # workflow name

on:
  [push] # 觸發事件

jobs:
  build: # job1 id
    runs-on: ubuntu-latest # 運行環境為最新版 Ubuntu
    name: A job to deploy blog.
    steps:
    - name: Checkout # step1 獲取源碼
      uses: actions/checkout@v1 # 使用 actions/checkout@v1
      with: # 條件
        submodules: true # Checkout private submodules(themes or something else). 當有子模塊時切換分支?

    # Caching dependencies to speed up workflows. (GitHub will remove any cache entries that have not been accessed in over 7 days.) 緩存壓縮 node_modules,不用每次下載,使用時解壓,可以加快工作流的執行過程,超過 7 天沒有使用將刪除壓縮包。
    - name: Cache node modules # step2
      uses: actions/cache@v1
      id: cache
      with:
        path: node_modules
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    - name: Install Dependencies # step3 name
      if: steps.cache.outputs.cache-hit != 'true' # 如果變量 cache-hit 不等於 true
      run: npm install # 安裝 node modules 相關依賴

    # Deploy hexo blog website.
    - name: Deploy # step4
      id: deploy
      uses: sma11black/hexo-action@v1.0.0
      with:
        deploy_key: ${{ secrets.DEPLOY_KEY }}
        user_name: your github username
        user_email: your github useremail

Image result for error

四、可能出現的問題:Deploy 失敗

可能出現以下 3 三種情況:

1、

image-20200215220503185

Host key verification failed
fatal: Could not read from remote repository.

出現此問題請檢查 站點配置文件,看 deploy 是否存在出 GitHub 以外的倉庫,如 Coding 。

解決方式:去除 GitHub 以外的倉庫。

2、

image-20200215220635619

Load key "/root/ssh/id_rsa": invalid format
gitagithub.com: Permission denied (publickey)
fatal: Could not read from remote repository.

出現此問題請檢查 SSH Key,看 Private Key 是否正確且完整的復制

3、

image-20200216183926423

ERROR Local hexo not found in /github/workspace
ERROR Try running: 'npm install hexo --save'

解決方式:將 uses: sma11black/hexo-action@v1.0.0 改為 uses: deppwang/hexo-aciton@v1.0.1@v1.0.1entrypoint.shhexo g -d 前添加了命令 npm install hexo --save

五、總結

關於 Action 具體如何執行,可結合運行日志理解。

六、參考

個人公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM