amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

博客更新文章後自動通知 Google 更新站點地圖

博客上一篇文章已經是 2020 年 12 月 29 日的了。從發布到今天,我每天都嘗試在 Google 搜一下它,卻發現一直沒有收錄。

暴露了自己是一個高強度自搜人的事實 XD

手動到 Google Search Consoles 頁面去查看了一下,顯示站點地圖上次更新還停留在 12 月 19 日... 由此引出了今天的問題:如何讓 Google 自動更新站點地圖。

探索過程#

首先需要找到 Google 更新站點地圖的方法,通過查閱文檔可以得知:

使用 “ping” 功能請求我們抓取站點地圖。發送如下所示的 HTTP GET 請求:
http://www.google.com/ping?sitemap={complete_url_of_sitemap}
例如:
http://www.google.com/ping?sitemap=https://example.com/sitemap.xml

所以思路十分清晰,只需要在博客部署完成後手動 GET 這個地址即可。

解決方法#

Github Actions#

對於使用 Github Action 來部署博客的用戶,操作流程十分簡單,只需要在 yml 文件部署命令的後面填上一行 curl http://www.google.com/ping?sitemap=<your sitemap> 便可以解決。

Vercel#

因為 Github Pages 訪問速度較慢,我使用的是 Vercel ,而它並沒有提供一個類似於 After Deployment Command 的功能。這使我沒有辦法精確 Hook 它的部署過程。

於是,我去請教了 NEU LUG 群的群友,而群友也給出了一個簡單粗暴的解決方法:管它 Hook 不 Hook ,定時更新一次就完了!

圖 1

本來我也確實打算這樣幹了,但考慮到我博客的更新頻率,以及 Google 文檔中寫出的:

請僅在新建或更新站點地圖時向 Google 發送站點地圖相關提醒。如果站點地圖無任何變更,請勿多次向我們提交或 ping 站點地圖。

為了避免搞出事情,我還是捨棄了這種方法。但這給了我一個思路,即:不需要盲目追求 Hook ,只要達到效果就可。

思考後,我想到了這樣的方法:

在更新博客(倉庫 master 分支 Push )時,Vercel 構建和 Github actions 同時觸發。Github actions 檢測 commit message 的內容,如果包含 “更新博文” 這四個字便觸發流程:

  1. 等待 3min(我博客在 Vercel 的構建要 1min~2min ,為了增加容錯率寫成 3min )
  2. 發送 GET 請求通知 Google 更新站點地圖。

具體 yml 流程文件如下:

name: ping-google
on:
  push:
    branches:
      - master
jobs:
  ping-google:
    if: "contains(github.event.head_commit.message, '更新博文')"
    runs-on: ubuntu-latest
    steps:
      - name: wait for build
        run: sleep 3m
      - name: ping google to update sitemap.xml
        run: curl http://www.google.com/ping?sitemap=https://blog.allwens.work/sitemap.xml

經測試,工作良好。

這樣處理缺點也是存在的:Github actions 對免費用戶有著每月 3000 分鐘的使用限額。雖然我們使用 sleep 命令休眠三分鐘時什麼都沒幹,但這段時間仍然會被計入你的 Github actions 使用時間中。(不過反正這些時間也用不完,我博客更新頻率又很低,代價是可以接受的 233)

參考資料#

  1. Github Actions 檢測 commit message :

    Support [skip ci] out of box with github actions

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。