用Github Actions 和 GIS 來自動部署Hexo和建立網站索引

在用Hexo建立部落格之後,第一件重要的事情就是要減少除了寫文章以外的事情例如部屬等等,也會希望Google可以將自己的部落格建立索引 (index) 。這篇文章會介紹如何使用Hexo + Google Indexing Script + Github Actions來達成這個目標。

建立 Github Actions Workflow 來自動部署

Githuab Actions是一個可以自動化執行一些任務的工具,例如測試、部署等等。開發者可以自由設定任務的觸發條件,例如push到master branch後、每天定時執行等等。在這個例子裡面,我們會使用Github Actions來自動化執行部署和建立索引的任務。首先我們先專注在hexo部署的部分。

在我的例子裡面,我使用了Github Pages來部署我的部落格,也就是存放hexo產生後的靜態檔案的repo,是一個會叫做username.github.io的repo。我的Hexo Source Code則是存在另外一個private的repo,Github Actions就是要在這個repo裡面建立和執行的。在我每次 hexo new post 後並把文章寫好後,我會push到這個private repo,然後Github Actions就會自動執行部署的任務,產生靜態檔案,並且deploy到Github Pages的repo裡面。

要進行下面的步驟之前,請先確定你的hexo部署是正常的,也就是當你直接在local執行 hexo deploy 後,你的部落格是可以正常在Github Pages上面顯示的。

1. 取得 Deploy Key

首先在你的local端產生一個新的ssh key,並且將這個key加入到你的Github Pages repo的deploy key裡面。輸入以下指令:

1
ssh-keygen -t ed25519 -C "<email>" -f ga-deploy

你可以改變這個key的名稱,這個key是用來讓Github Actions可以push到你的Github Pages repo的。

你應該會獲得兩個檔案,一個是id_ed25ga-deploy519,一個是ga-deploy.pubga-deploy是private key,ga-deploy.pub是public key。接著你可以將ga-deploy.pub的內容加入到你的Github Pages repo的deploy key裡面。這樣Github Actions就可以使用這個key來push到你的Github Pages repo。

2. 將Public Key加入到Github Pages repo的Deploy Key裡面

輸入cat /path/to/ga-deploy.pub,然後複製這個public key的內容。接著到你的Github Pages repo的deploy key頁面,新增一個deploy key,並且將這個public key的內容貼上去。

3. 將Private Key加入到Source Code Repo 的 Github Actions 的 Secrets裡面

進入 Hexo Source Code的repo,然後點選Settings -> Secrets and variables -> Actions,然後新增一個名為DEPLOY_KEY的secret,並且將private key ga-deploy 的內容貼上去。

1
cat /path/to/ga-deploy

4. 在 Source Code Repo 建立一個新的 Github Actions workflow 檔案

首先在我的Github Repository裡面建立一個新的workflow檔案,檔案名稱為.github/workflows/google-indexing.yml
裡面要自動化的步驟如下:

  1. 取得source code (actions/checkout)
  2. 安裝node.js (actions/setup-node)
  3. 設定環境 (Configuration environment)
    • 這裡會將 DEPLOY_KEY 的secret取出來,並且設定到 HEXO_DEPLOY_PRI 的環境變數裡面。
    • 同時設定git的使用者名稱和email等等。
  4. 還原檔案的修改時間 (Restore file modification time)
    • 這是為了讓hexo deploy後的檔案的修改時間是正確的。否則checkout後的檔案的修改時間會是現在的時間。部落格的文章會根據修改時間來顯示和排序,所以很重要。
  5. 安裝hexo的相依套件 (Install dependencies)
  6. 部署hexo (Deploy hexo)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
name: HEXO CI

on: [push]

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [21.x]

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.DEPLOY_KEY}}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name "lytt925 (via GitHub Actions)"
git config --global user.email "ytli.tw@gmail.com"

- name: Restore file modification time
run: |
find source -name '*.md' | while read file; do
new_time=$(git log -1 --format="%ct" "$file") # Remove the extra @
touch -d "@$new_time" "$file" # Correct usage of @ for touch command
echo "Updated $file to $(date -d @$new_time)" # Correct usage of @ for date command
done

- name: Install dependencies
run: |
npm i -g hexo-cli
npm i

- name: Deploy hexo
run: |
hexo generate
hexo deploy

5. Push到Github Source Code Repo

到這裡,將這個workflow檔案push到你的Github Source Code Repo裡面,然後Github Actions就會自動執行這個workflow。
你可以在Actions頁面看到這個workflow的執行狀況。你可以隨便改一個文章來測試這個workflow是否正常執行。

加入 Google Indexing Script

我們開始寫部落格之後,也會希望Google可以將自己的部落格建立索引 (index) ,這樣別人搜尋的時候就可以找到你的部落格。這裡我們會使用Google Indexing Script來達成這個目標。

1. 先去Google Search Console 驗證你的部落格

你可以在右邊打上你github pages的網址,然後點選驗證,然後選擇一個方法來驗證。

驗證成功後,你就可以在Google Search Console裡面看到你的部落格的資訊。

2. Google Indexing Script

在Google Search Console有個網址審查的功能,你可以將你的部落格url或是某篇文章的url進行審查,那麼過不久就可以在google search搜尋到,你可以在搜尋引擎打上site:your-blog-url來看看你的部落格有沒有被建立索引。但因為文章很多的話,這樣一篇一篇點會很麻煩,所以我們使用Google Indexing Script 來自動化這個過程。他是利用Google Search Console的API來達成這個目標(應該),你可以看他的github頁面來了解更多。

使用這個script有幾個先決條件:

  1. 你的網站需要在google search console驗證過
  2. 你的網站需要有一個Sitemap
  3. 你需要在Google Cloud Platform建立一個新的Project並且取得一個Service Account的 API Key
  4. 你需要在google search console裡面加入這個API Key,並且給予他網站擁有者的權限

2.1. 取得網站的Sitemap

Site map是一個xml檔案,裡面包含了你部落格的所有文章的url和相關資訊,這樣google就可以從這個檔案裡面找到你的文章。

可以參考這篇

懶人包:

  1. npm install hexo-generator-sitemap
  2. _config.yml裡面加入
    1
    2
    sitemap:
    path: sitemap.xml
  3. 你可以在your-blog-url/sitemap.xml看到你的sitemap
  4. 在google search console裡面加入sitemap

2.2. 在Google Cloud Platform建立一個新的Project

https://console.cloud.google.com/ 建立一個新的Project,然後在這個Project裡面建立一個Service Account,並且取得一個API Key。

  • 直接按左上角的Project欄位來新增一個新的Project

2.3. 建立服務帳戶 service account 並且取得API Key

  1. 點選左邊的IAM & Admin -> 服務帳戶 Service Accounts -> 建立服務帳戶 Create Service Account

    • 輸入名稱後直接點選Save就好
  2. 點選剛剛建立的服務帳戶,然後點選金鑰 Keys -> 新增金鑰 Create Key -> JSON

    • 這樣你就會下載到一個json檔案,這個檔案就是你的API Key
    • 把這個json檔案放到你的Github Source Code Repo的Secrets裡面,並且取名叫做service_account.json

2.4. 在 Google Search Console 加入 API Key

打開你的service_account.json,把裡面的client_email複製下來,然後到Google Search Console裡面,點選左邊的設定 -> 使用者與權限 -> 新增使用者,然後把剛剛複製下來的client_email貼上去,並且選擇擁有者的權限。

2.5. 在 Github Action 加入 Google Indexing Script

按照一樣的方式,將service_account.json的內容加入到你的Github Source Code Repo的Secrets裡面,並且取名叫做SERVICE_ACCOUNT_JSON。然後新增一個流程到剛剛的workflow裡面。

gis 後面要加入你的部落格網址,再指定--path參數為你的service_account.json的路徑。

1
2
3
4
5
6
7
- name: Google Indexing Script
env:
SERVICE_ACCOUNT_JSON: ${{secrets.SERVICE_ACCOUNT_JSON}}
run: |
npm i -g google-indexing-script
echo "$SERVICE_ACCOUNT_JSON" > ./service_account.json
gis blog.ytli.tw --path ./service_account.json

完整的workflow檔案如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
name: HEXO CI

on: [push]

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [21.x]

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.DEPLOY_KEY}}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name "lytt925 (via GitHub Actions)"
git config --global user.email "ytli.tw@gmail.com"

- name: Restore file modification time
run: |
find source -name '*.md' | while read file; do
new_time=$(git log -1 --format="%ct" "$file") # Remove the extra @
touch -d "@$new_time" "$file" # Correct usage of @ for touch command
echo "Updated $file to $(date -d @$new_time)" # Correct usage of @ for date command
done

- name: Install dependencies
run: |
npm i -g hexo-cli
npm i

- name: Deploy hexo
run: |
hexo generate
touch public/CNAME
echo "blog.ytli.tw" > public/CNAME
hexo deploy

- name: Google Indexing Script
env:
SERVICE_ACCOUNT_JSON: ${{secrets.SERVICE_ACCOUNT_JSON}}
run: |
npm i -g google-indexing-script
echo "$SERVICE_ACCOUNT_JSON" > ./service_account.json
gis blog.ytli.tw --path ./service_account.json

結果

到這裡,你的部落格就會在每次部署後自動建立索引了。你可以在Actions頁面看到這個workflow的執行狀況。

用Github Actions 和 GIS 來自動部署Hexo和建立網站索引

https://blog.ytli.tw/2024/03/12/hexo-google-indexing-script-github-actions/

作者

Yen-Ting Li

發表於

2024-03-12

更新於

2024-04-25

許可協議

評論