GitHub Actions是GitHub推出的持續整合服務。
我們可以把一個Action理解為一小段特定功能的指令碼,多個Action能夠組成一個Workflow,Workflow由各種GitHub的事件觸發。我們可以用GitHub Actions來做軟體的持續整合(CI)和持續部署(CD)。
在這篇文章裡,我向大家介紹我是如何用GitHub Actions來自動化釋出我的Hexo部落格的。
Hexo和GitHub Pages
我的個人部落格刀十一的DevOps小站是用Hexo生成的。想了解Hexo的朋友可以去Hexo官網 。
Hexo生成靜態檔案後,我會把這些檔案提交到GitHub Pages的程式碼倉庫。這樣就能利用GitHub Pages擁有一個免費的個人部落格了。
之前,我一直是在自己電腦上手動完成釋出部落格的操作,流程如下:
- 在
Hexo庫
裡寫部落格文章 (github.com/yuliji/blog) 。 - 用
hexo generate
生成靜態檔案。 - 把靜態檔案複製到
Pages庫
(github.com/yuliji/yuli…) 。 - 在
Pages庫
裡commit
並push
程式碼,釋出。
當看到Github Actions的介紹後,我就有了用Github Actions自動釋出部落格的想法。
用GitHub Actions自動釋出部落格
我的設計是這樣的,所有程式碼都在Hexo庫
裡。
Hexo庫
裡建立兩個Github Actions的workflow:Build Pages
和Publish Pages
。Build Pages
由master
分支的push
事件觸發。他的主要功能就是用hexo generate
生成靜態檔案,把這些靜態檔案打包、建立並上傳到一個新的Github Release裡。- 建立release的操作觸發
Publish Pages
,這個workflow會clone我的Pages庫
,下載最新的release裡的靜態檔案包,解壓到Pages庫
,commit & push。
具體的實現步驟如下:
- 建立
build.sh
指令碼。該指令碼負責生成靜態檔案、打包、上傳。這個指令碼在本地電腦也可以執行。 - 建立
gh_action_build.sh
指令碼。該指令碼在Github Action裡執行。主要是呼叫build.sh
,但是事先要安裝一些必要的npm庫。 - 在github.com/settings/to… 獲取一個Personal access token。因為我們的
build.sh
裡用到了Github CLI工具gh
。這個命令需要用到這個token來授權。 - 把這個Personal access token,新增到
Hexo庫
的secrets裡。 - 建立YAML檔案定義
Build Pages
,這邊主要功能就是注入上邊的那個token然後呼叫gh_action_build.sh
。完整程式碼在這裡。- name: Generate pages env: GITHUB_TOKEN: ${{ secrets.TOKEN }} # 注入token run: ${GITHUB_WORKSPACE}/bin/gh_action_build.sh # 呼叫指令碼 複製程式碼
- 建立
publish
指令碼。該指令碼下載最新的release中的靜態檔案包,解壓到Pages庫
,commit & push。 - 用
ssh-keygen
建立一對祕鑰。因為我們在Hexo庫
的actions裡操作Pages庫
,所以需要授權actions的git命令來修改Pages庫
。 - 把上邊生成的公鑰加到
Pages庫
的deploy key裡,並賦予寫許可權。 - 把上邊生成的私鑰加到
Hexo庫
的secrets裡。 - 建立YAML檔案定義
Publish Pages
。這個workflow裡需要clone兩個程式碼庫,然後呼叫publish
指令碼。其中Pages庫
的ssh key需要用上邊設定的私鑰。完整程式碼在這裡。- uses: actions/checkout@v2 with: repository: 'yuliji/yuliji.github.io' path: 'pages' ssh-key: ${{ secrets.PAGE_REPO_SSH_KEY }} # 用有寫許可權的key操作Pages庫 複製程式碼
完成
這樣,我只需要把最新的文章提交到Hexo庫的master分支,新文章就自動釋出到Github Pages了。