
一、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 clean、hexo g -d 更新博客,比較麻煩,
所以我們希望能在 push 源檔案后,由 CI/CD(持續集成/持續部署)工具為我們執行 hexo clean、hexo g -d 這兩個操作,

二、GitHub Actions
CI/CD 工具前有 Travis CI,現有 GitHub Actions,這里使用 GitHub Actions,
GitHub Actions 的作業原理:我們提前設定好需要自動化執行的任務,GitHub Actions 監控當前倉庫的某一個操作(如:push),一旦有此操作,就自動化執行這些任務,
所以我們希望使用 GitHub Actions 后,只需要往源檔案倉庫 push 更新源檔案,GitHub Actions 監控到 push 操作時,就自動化執行 hexo clean、hexo 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/[email protected] # 指向一個標簽
actions/setup-node@master # 指向一個分支
關于 GitHub Actions 更多知識,請看 GitHub Actions 入門教程 - 阮一峰,
現在需要實作一個 Action,使其能夠執行 hexo clean、hexo g -d 操作,

三、Hexo Action
我是使用的 sma11black 已經開發好的 Hexo Action,這個 Action 針對的是存放 Hexo 源檔案和網站檔案分開存放的場景,請先看 教程,以下為教程的補充,
非第一次生成 SSH Key:
ssh-keygen -t rsa -f ~/.ssh/id_rsa_x -C "[email protected]"
將生成的 private key 作為 Hexo 源檔案倉庫 Settings > Secrets 的 一個名叫 DEPLOY_KEY 的 Secret,注意:需要復制包括 -----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/[email protected]
with:
deploy_key: ${{ secrets.DEPLOY_KEY }}
user_name: your github username
user_email: your github useremail

四、可能出現的問題:Deploy 失敗
可能出現以下 3 三種情況:
1、

Host key verification failed
fatal: Could not read from remote repository.
出現此問題請檢查 站點組態檔,看 deploy 是否存在出 GitHub 以外的倉庫,如 Coding ,
解決方式:去除 GitHub 以外的倉庫,
2、

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、

ERROR Local hexo not found in /github/workspace
ERROR Try running: 'npm install hexo --save'
解決方式:將 uses: sma11black/[email protected] 改為 uses: deppwang/[email protected],@v1.0.1 在 entrypoint.sh 中 hexo g -d 前添加了命令 npm install hexo --save
五、總結
關于 Action 具體如何執行,可結合運行日志理解,
六、參考
- GitHub Actions 入門教程 - 阮一峰
- Hexo Action

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/21082.html
標籤:其他
上一篇:Bilibili手機端下載的Download檔案批量轉換為MP4軟體【Bilibili_DownVideoToMp4】原創發布
