前陣子,我看到有人在吐槽自己寫博客很麻煩——寫麻煩、託管麻煩,推完 GitHub 之後還得去服務器上手動拉代碼部署。雖然我以前在做類似的東西,但他這麼一提讓我想起這件事,我就想着,不如把自己一直隨便用的小玩意整理一下,順便分享給大家。
於是就有了這個小項目:一個輕量級的 GitHub Webhook Listener,用 Go 寫的,可以幫你在推送代碼後自動觸發部署。
什麼是 Webhook
Webhook 本質上就是 GitHub 在某些操作發生時,向你指定的地址發送一個網絡通知。最常見的事件包括 push、pull_request、release 等。收到通知之後,你就可以根據事件類型做一些操作,比如自動部署代碼、觸發測試、更新文檔等等。
設置 Webhook 其實也很簡單:在 GitHub 倉庫裏找到 Settings → Webhooks → Add webhook,填入你服務器的地址和一個 Secret,選中你想監聽的事件,然後 GitHub 就會在這些事件發生時發送 POST 請求到你的服務器。只要你的服務端能接收請求、校驗 Secret,再執行對應操作,就完成了。
我以前一直隨便把 Webhook 放在某個在跑的服務裏處理,所以一直沒有好好整理過。Webhook 的核心其實不復雜,它需要的只是一個接口去接收請求,這也是之前一直隨手搞的原因。
為什麼選 Go
Go 寫這種小工具特別合適:
- 編譯後就是一個二進制文件,直接丟到服務器上運行就行,不依賴其他環境。
- 運行開銷小,啓動快,非常適合長期駐留監聽請求。
- 寫起來簡單,核心邏輯就是解析 HTTP 請求、驗證簽名、匹配事件和分支,然後執行命令。
所以我就決定用 Go,把這個小工具整理出來。你只需要放一個簡單的配置文件,二進制程序就能運行起來。
配置示例
配置文件大概長這樣:
repos:
'zxc7563598/astro-theme-pure': # 倉庫名稱
secret: 'xxxxxx' # GitHub Webhook Secret
rules:
- event: 'push'
branches: ['main']
actions:
- type: 'shell'
command: 'sh ./shell/astro-theme-pure.sh'
程序啓動後會在指定端口監聽請求,收到事件就去匹配分支和事件類型,如果匹配,就執行你配置好的 shell 腳本。
就好像上面的配置,當 zxc7563598/astro-theme-pure 倉庫的 main 分支觸發了 push 時,腳本就會去執行 sh ./shell/astro-theme-pure.sh。
這樣一來,你只管寫代碼,部署流程就自動完成了。
我的部署腳本
我博客的部署腳本大概是這樣:
#!/bin/bash
set -e
PROJECT_DIR="/opt/astro-blog"
GIT="/usr/bin/git"
BUN="/usr/bin/bun"
PM2="/usr/bin/pm2"
export HOME="/root"
export PM2_HOME="/root/.pm2"
log() {
echo "[deploy] $1"
}
log "========================================"
log "開始部署 Astro Blog"
log "時間: $(date)"
log "========================================"
cd "$PROJECT_DIR" || { log "無法進入項目目錄"; exit 1; }
log "拉取最新代碼..."
$GIT fetch origin
$GIT reset --hard origin/main
log "安裝依賴(Bun)..."
$BUN install
log "構建 Astro 項目..."
$BUN run build
log "重啓 PM2 進程..."
$PM2 restart "$PROJECT_DIR/ecosystem.config.cjs"
log "PM2 狀態:"
$PM2 list || true
log "部署完成"
log "時間: $(date)"
log "========================================"
有了這個流程,我寫博客只管寫代碼,編輯器裏寫完 push,一切自動完成。服務器自己去拉取、構建、重啓,我幾乎不用管。
如果你也想試試
這個小項目我整理在 GitHub 上了:github-webhook-listener。它輕量、靈活,上手也很快。如果你也想搞個自動部署,可以直接拿去試試,不用在意具體實現或代碼,看看 README,或者直接在 releases 裏下載就能用。