Hexo 部落格自動部署到 GitHub Pages 的最佳實踐

F48VJ發表於2017-06-04

這兩天重新搗鼓了一下 Hexo 部落格, 用 Travis CI 做了自動部署。

做的過程中檢視了很多資料,基本上都是用在 CI 中用 Git、Hexo deploy 做的部署,還要加密 ssh-key 什麼的。我基於這做了一遍,對於 Travis CI 的檔案加密等等,有了更深的理解。這中間的配置,我覺得相當的麻煩。但是當我重新翻閱 Travis CI 的文件的時候,我發現其實 Travis CI 可以自動靜態檔案部署到 GitHub Pages。只需要非常簡單的配置,就可以了。

deploy:
  provider: pages
  skip_cleanup: true
  github_token: $GITHUB_TOKEN # travis-ci.org 控制皮膚上設定
  on:
    branch: master複製程式碼

這是最基本的配置。

skip_cleanup 的值必須為 true 不然會把你在構建時生成的檔案給刪除掉。

on: branch: master的意思是當 master 分支有變化時,才執行這個部署。更多條件設定請參考 Deployment

GITHUB_TOKEN 的生成請參考 Creating a personal access token for the command line。 如果你的倉庫是公開的,那麼在給許可權的時候只需要給 public_repo, 如果你的倉庫是私有的那就要給 repo 許可權,儘量給更少的許可權。然後在控制檯設定環境變數 GITHUB_TOKEN 值為剛才生成的 token。在新增環境變數的時候有個開關 Display value in build log 千萬不要開啟,不然別人就可以在 CI 的 log 裡面看到你的 token 了,就可以對你的公開倉庫進行任意修改。

接下來我們就要對這個基本配置做個修改,新增更多的設定來符合我們的需求。

local_dir 指的是是將要推送到 GitHub Pages 的目錄,預設的值為當前目錄。我們都知道 hexo generate 生成的目錄是 public ,所以我們要將 local_dir 的值設定為 public

repo 指的是 GitHub Pages 所在的程式碼倉庫,預設值為當前倉庫。

target_branch 指的是 GitHub Pages 所使用的分支,預設為 gh-pages

這裡有個問題,就是 Travis CI 使用 git push --force 來進行推送的,所以會清空歷史,所以一定要保證你的 repotarget_branch 設定的正確。原本我是做了保留歷史的配置的,改成這樣用 Travis CI deploy 來做的話,就沒有辦法保留歷史了。但是轉念一想,我只要保留 blog 倉庫的歷史就好啦,這些只是生成的程式碼,所以我認為使用 Travis CI 這樣的設定是合理的。

一般來說新增這三個配置就可以了。更多配置請參考 GitHub Pages Deployment

下面是我的配置資訊

language: node_js #指定環境為 Node.js

node_js:
- '7' #指定 Node.js 的版本為 7

before_install:
- export TZ='Asia/Shanghai' #設定時區 非必須

script:
- hexo generate #生成部落格

deploy:
  provider: pages
  skip_cleanup: true
  github_token: $GITHUB_TOKEN
  local_dir: public
  repo: zhangweijie-cn/zhangweijie-cn.github.io
  target_branch: master
  on:
    branch: master複製程式碼

Travis CI 會自動幫我們安裝依賴,所以這些我們都不需要考慮。

當我們給 blog 所在倉庫 master 分支推送文章以後,GitHub Pages 就會自動構建和部署了。

相關文章