本文章爲原創內容,只發佈於本博客和我的私人博客,轉載請註明,謝謝
使用 Hexo 靜態博客網站發表文章,需要
- 本地以Markdown的形式寫好文章
- 藉助 Hexo 生成靜態頁面
- 部署到雲主機或者通過 git 到託管平臺
既然要本地藉助 Hexo 生成靜態頁面,那就需要設置 Node.js 環境和博客源碼,雖然環境設置簡單,源碼從Github、coding、gitee、gitlab等地方下載方便,但是在換電腦之後,又要重複相同的事情,還是比較麻煩,前一陣我用 docker 將我的博客源碼打包成鏡像留存下來,也是面臨同樣的問題,就是換電腦後還要安裝 docker
和 docker-compose
,也是麻煩。
當我遇見了 Github Actions 和 yuque-hexo 後,一切都發生了變化
簡單來說就是
由 Hexo + 語雀 + yuque-hexo + Github Actions + web hook + severless 打造的持續集成個人博客
至於託管平臺,Github Pages or Coding Pages or VPS or Other,自行選擇。
- Github 保存博客源碼,私有庫已經免費,還在用
Travis CI
?非開源的私有項目想在Travis CI
上構建價格還是非常感人的! - Github Actions 是 Github 推出的一款持續集成工具,完全免費
- 語雀 是阿里人都在用的筆記與文檔知識庫,專業的雲端知識庫,支持
web hook
- yuque-hexo 是 Github 上開源的一款語雀知識庫同步工具
- severless 是雲函數,當前 騰訊雲函數 和 阿里雲函數都可以免費提供,對於博客,免費額度足夠了,可以對比一下費用自行選擇
關於 Hexo
Hexo 是一款基於 Node.js 的靜態博客框架,其快速、簡潔且高效。沒有數據庫和後臺的概念。
- 超快速度,
Node.js
所帶來的超快生成速度,讓上百個頁面在幾秒內瞬間完成渲染。 Hexo
支持GitHub
Flavored
Markdown
的所有功能,甚至可以整合Octopress
的大多數插件。- 一鍵部署,只需一條指令即可部署到 GitHub Pages, Heroku 或其他平臺。
- 插件和可擴展性,強大的 API 帶來無限的可能,與數種模板引擎(EJS,Pug,Nunjucks)和工具(Babel,PostCSS,Less/Sass)輕易集成
關於 Github Actions
不妨先去了解一下
我的博客 持續集成和交付 專欄 有實例可以去參考一下,後續還會繼續更新。
或者 我的 CSDN 博客
repository_dispatch
之所以有了這篇文章是因爲我看到了Github Actions
中的外部事件repository_dispatch
- Github Help 關於 repository_dispatch
- RepositoryDispatchEvent
- Create a repository dispatch event
- Triggering GitHub Actions across different repositories
- How to run GitHub Actions manually
- Setting up Webhooks for Github Actions
GitHub Actions支持的外部事件repository_dispatch
必須具有以下請求頭:
curl -X POST https://api.github.com/repos/:owner/:repo/dispatches \
-H 'Accept: application/vnd.github.everest-preview+json' \
-H "Authorization: token GITHUB_PERSONAL_ACCESS_TOKEN" \
-d '{"event_type":"start"}'
如果返回的Response是Status: 204 No Content,那就是成功了,去Github中看一看,事件已經被觸發,這個可以使用postman測試一下
注意,Accept 具有application/vnd.github.everest-preview+json
自定義媒體類型值。
語雀中的Web Hook
是不能添加請求頭的,所有我們就需要一箇中間件把他們連接起來,這個就是serverless雲函數
具體流程
- Hexo 博客搭建好,將源碼上傳到Github,私有還是公有庫都可以
- 在Github中開啓Github Actions服務,配置yaml格式的deploy腳本
- 註冊語雀,創建知識庫併發布一篇文章,必須發佈過文章,因爲yuque-hexo會刪除_posts文件夾
- 編寫serverless函數,測試可以觸發Github Actions,獲取觸發地址
- 配置語雀的webhook,使其可調用serverless函數
- 觸發Github Actions實現Hexo的自動部署,生成靜態文件併發布
下面以Github Actions將Hexo生成的靜態頁面推送到Github Pages舉例
創建 Github Pages
- 登錄github
- 創建項目,項目名字
username.github.io
,必須爲公開庫 - 要求項目爲空,不要創建 READNME.md
創建 Hexo 博客並配置
可參考:
配置完成,本地預覽達到自己滿意,編寫文章發佈一切搞定後就能繼續了。
創建 Github 源碼倉庫
在github上創建存放Hexo源碼的倉庫,並將源碼push到此倉庫
配置 Github Actions 腳本
兩種方法配置,內容一樣
- 在Hexo源碼倉庫的頁面選擇Actions–>Set up a workflow yourself,進行網頁編寫
- 在本地環境根目錄創建
.github/workflows
文件夾,裏面放寫好的yaml腳本
腳本我以一種舉例,其他方法同樣可以實現,請查看我的博客
首次使用,請將腳本中的所有git checkout master
替換爲git checkout -b master
,第二次及以後都是git checkout master
,就不需要改動了
- git checkout master 切換到主分支
- git checkout -b 新建並切換到新建的分支上
# workflow name
name: Deploy To Github And Coding
# 當有push到倉庫和外部觸發的時候就運行
on: [push, repository_dispatch]
# YUQUE_TOKEN
# Github_API_Token
# Coding_API_Token
# Coding_API_Username
jobs:
deploy:
name: Deploy Hexo Public To Pages
runs-on: ubuntu-latest
env:
TZ: Asia/Shanghai
steps:
# check it to your workflow can access it
# from: https://github.com/actions/checkout
- name: Checkout Repository master branch
uses: actions/checkout@master
# from: https://github.com/actions/setup-node
- name: Setup Node.js 10.x
uses: actions/setup-node@master
with:
node-version: "10.x"
- name: Setup Git Infomation
run: |
git config --global user.name 'hongweifuture'
git config --global user.email '[email protected]'
- name: Get Latest Commit Message
run: |
git log --pretty=format:"%s from Github Actions at `date +"%Y-%m-%d %H:%M:%S"`" --date=short -n 1 > commit-message.log
- name: Setup Hexo Dependencies and Generate public files
env:
YUQUE_TOKEN: ${{ secrets.YUQUE_TOKEN }}
run: |
npm install hexo-cli -g
npm install yuque-hexo -g
npm install
npm run start
- name: Deploy To Github Pages
env:
Github_Pages: github.com/hongweifuture/hongweifuture.github.io
Github_Token: ${{ secrets.Github_API_Token }}
run: |
git clone https://${Github_Pages} .github_pages
cd .github_pages
git checkout -b master
cd ../
mv .github_pages/.git/ ./public/
mv ./README.md ./public/
cd ./public/
git add .
git commit -F ../commit-message.log
git push --force --quiet "https://${Github_Token}@${Github_Pages}" master:master
- name: Deploy To Coding Pages
env:
Coding_Pages: e.coding.net/hongweifuture/hongweifuture.coding.me.git
Coding_Token: ${{ secrets.Coding_API_Token }}
Coding_Username: ${{ secrets.Coding_API_Username }}
run: |
git clone https://${Coding_Username}:${Coding_Token}@${Coding_Pages} .coding_pages
cd .coding_pages
git checkout -b master
cd ../
rm -r ./public/.git/
mv .coding_pages/.git/ ./public/
cd ./public/
git add .
git commit -F ../commit-message.log
git push --force --quiet "https://${Coding_Username}:${Coding_Token}@${Coding_Pages}" master:master
這個腳本實現了發佈Hexo的Public到Pages,這只是一種方法,你也可以使用ssh進行hexo d或者Aciton的包發佈
但是現在你還不能運行,因爲裏面的隱藏參數還沒有設置
參數 | 說明 |
---|---|
YUQUE_TOKEN | 從語雀獲取的TOKEN,語雀上點擊個人頭像 --> 設置 --> Token 即可獲取,要在Hexo源倉庫的Settings–>Secrets中進行添加,對重要信息進行保密 |
Github_API_Token | 從Github獲取的personal access token,需要Secrets中進行添加 |
Coding_API_Token | 從Coding獲取的personal access token,需要Secrets中進行添加 |
Coding_API_Username | 從Coding獲取的username,2020年新升級Coding用戶名有變化,需要Secrets中進行添加 |
這裏要注意一個coding,我這裏的寫法是針對2020年最新版本的coding,前一陣進行了升級,與以前的URL還有格式不同
配置騰訊雲函數
- 登錄騰訊雲,搜索雲函數,創建
- 選擇python,2.7和3.6都行,空白函數
- 運行角色,SCF_QcsRole即可
- 注意執行方法,有強制要求
這裏我使用的是python 2.7
# -*- coding: utf8 -*-
import requests
def main_handler(event, context):
r = requests.post("https://api.github.com/repos/用戶名/倉庫名/dispatches",
json = {"event_type": "start"},
headers = {"User-Agent":'curl/7.52.1',
'Content-Type': 'application/json',
'Accept': 'application/vnd.github.everest-preview+json',
'Authorization': 'token Github訪問Token'})
if r.status_code == 204:
return "This's OK!"
else:
return r.status_code
在函數代碼中測試一下,如果Actions正常觸發,大功告成
5. 配置觸發方式,保存,獲取到訪問路徑
- 觸發方式:API網關觸發器
- API服務類型:新建API服務
- API服務:SCF_API_SERVICE
- 請求方法:ANY
- 發佈環境:發佈
- 鑑權方法:免鑑權
- 啓動集成響應:未啓用
配置語雀
語雀上
- 註冊,登錄
- 創建知識庫–>文檔知識庫–>可見範圍爲互聯網可見
- 工作臺–>知識庫–>找到新創建的知識庫,管理–>設置–>路徑進行自定義,後面有用
- 工作臺–>知識庫–>找到新創建的知識庫,管理–>設置–>開發者–>名稱任意。URL爲雲函數的地址,即上面獲取到的訪問路徑
權限建議選擇
- 僅主動推送更新觸發(強烈建議)
- 發佈文檔
- 更新文檔
- 刪除文檔
hexo源碼上
可本地更新後push或者直接github網頁修改
先安裝yuque-hexo
npm install yuque-hexo --save
編輯package.json文件,添加以下內容
Npm Scripts “start” 和 yuqueConfig,將操作命令合併爲一個腳本,只需要執行npm run start
即可完成語雀的同步和Hexo的清理和靜態文件生成
{
...
"scripts": {
"start": "yuque-hexo clean && yuque-hexo sync && hexo clean && hexo generate",
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"server": "hexo server"
},
...
"yuqueConfig": {
"baseUrl": "https://www.yuque.com/api/v2",
"login": "語雀個人路徑",
"repo": "知識庫名稱",
"mdNameFormat": "title",
"postPath": "source/_posts",
"onlyPublished": false
}
}
Come on 發佈文章
無論是發佈新文章還是更新刪除等等操作,只要選擇“文檔有較大更新,推送給關注知識庫的人”即可自動觸發
下面推薦了一下我的博客主題,算是廣告吧~!!
關於 halo
本人目前使用的主題是 hexo-theme-halo ,這是一個採用 Material Design 和響應式設計的 Hexo 博客主題。 是博主基於 hexo-theme-matery 主題修改而來。
特性
- 簡單漂亮,文章內容美觀易讀
- Material Design 設計
- 博客名字動態顯示,文章信息統計統頁面展示
- 響應式設計,博客在桌面端、平板、手機等設備上均能很好的展現
- 首頁輪播文章及每天動態切換
Banner
圖片,首頁輪播圖設置爲70%頁面高度 - 首頁
subtitle
替換打字效果,添加動態詩詞自動切換, - 瀑布流式的博客文章列表(文章無特色圖片時會有
24
張漂亮的圖片代替) - 時間軸式的歸檔頁,
增加簡約風歸檔頁面
- 分類頁、標籤頁和
標籤雲
同一頁面顯示,集中展示 - 豐富的關於我頁面(包括關於我、文章統計圖、我的項目、我的技能、相冊等可自定義)
- 可自定義的數據的友情鏈接頁面
- 支持文章置頂和文章打賞
- 類似於Python Django中
SLUG
用法的urlname - 支持
MathJax
TOC
目錄- 可設置複製文章內容時追加版權信息
- 可設置閱讀文章時做密碼驗證
- Gitalk、Gitment、Valine 和 Disqus 評論模塊(推薦使用
Gitalk
) - 集成了不蒜子統計、谷歌分析(
Google Analytics
)和文章字數統計等功能 - 支持在首頁的音樂播放和視頻播放功能
- 支持
emoji
表情,用markdown emoji
語法書寫直接生成對應的能跳躍的表情。 - 支持 DaoVoice、Tidio 在線聊天功能。
下載
當你看到這裏的時候,應該已經有一個自己的 Hexo 博客了。如果還沒有的話,不妨使用 Hexo
和 Markdown 來寫博客和文章。
點擊 這裏 下載 master
分支的最新穩定版的代碼,解壓縮後,將 hexo-theme-halo
的文件夾複製到你 Hexo 的 themes
文件夾中,並修改主題配置項即可。
當然你也可以在你的 themes
文件夾下使用 git clone
命令來下載:
git clone https://github.com/hongweifuture/hexo-theme-halo.git themes/halo
配置
詳情請參照 hexo-theme-halo