博客 / 詳情

返回

寫博客寫代碼都適用:推完就自動部署的 GitHub Webhook 工具

前陣子,我看到有人在吐槽自己寫博客很麻煩——寫麻煩、託管麻煩,推完 GitHub 之後還得去服務器上手動拉代碼部署。雖然我以前在做類似的東西,但他這麼一提讓我想起這件事,我就想着,不如把自己一直隨便用的小玩意整理一下,順便分享給大家。

於是就有了這個小項目:一個輕量級的 GitHub Webhook Listener,用 Go 寫的,可以幫你在推送代碼後自動觸發部署。


什麼是 Webhook

Webhook 本質上就是 GitHub 在某些操作發生時,向你指定的地址發送一個網絡通知。最常見的事件包括 pushpull_requestrelease 等。收到通知之後,你就可以根據事件類型做一些操作,比如自動部署代碼、觸發測試、更新文檔等等。

設置 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 裏下載就能用。

user avatar ailim 頭像 zuckjet 頭像 dingxi 頭像 meng_nn 頭像 2dian718 頭像
5 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.