一、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/setup-node@v1.0 # 指向一個標簽
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 "yourmail@xxx.com"
將生成的 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/hexo-action@v1.0.0
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/hexo-action@v1.0.0
改為 uses: deppwang/hexo-aciton@v1.0.1
,@v1.0.1
在 entrypoint.sh
中 hexo g -d
前添加了命令 npm install hexo --save
五、總結
關於 Action 具體如何執行,可結合運行日志理解。