利用github webhook和Fastapi自動更新網站
我的的小破站放在國外機房的一個乞丐主機上面,代碼託管在 github 私有倉庫,push 代碼的時候希望自動更新網站,github 有 action,可以自己編寫相關邏輯在 github 的 runner 上面實現代碼更新,最簡單的是 ssh 到服務器上面,執行相關操作,但是這樣要填寫 Actions secrets,老實說有點不太放心,想自己編寫個簡單服務更新代碼,畢竟自己全部掌控,真理在手,天下我有,減少依賴,供應鏈安全^_^
編寫供 github webhook 使用的接口
- 如下所示,利用 Fastapi 的 Background Tasks 功能,向/api/update/mephistocc 提交 post 請求的時候, 執行更新網站的腳本
1def update_site(script_name=""):
2 subprocess.run(["/bin/bash", script_name])
3
4
5@app.post("/api/update/mephistocc")
6async def update_mephisto_cc(background_tasks: BackgroundTasks):
7 background_tasks.add_task(update_site, script_name="update_mephisto.cc.sh")
8 return {"message": "update site in the background"}
- 超級簡單的更新腳本, pull main 倉庫即可
1(.venv) ➜ stock.mephisto.cc git:(main) cat update_mephisto.cc.sh
2#!/bin/sh
3echo '開始執行webhook鉤子'
4
5HOME_DIR=/data/mephisto.cc #此目錄爲服務器頁面展示目錄
6cd $HOME_DIR
7
8echo '清除git緩存'
9git clean -df
10
11echo '拉取遠程代碼'
12git pull origin main
13
14echo 'Job Done!'%
- 服務跑在 gunicorn 上面
1root@tokyo:/data/mephisto.cc# systemctl status gunicorn
2● gunicorn.service - gunicorn daemon
3 Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
4 Active: active (running) since xxxxx CST; 15min ago
5Main PID: 2467813 (gunicorn)
6 Status: "Gunicorn arbiter booted"
7 Tasks: 5 (limit: 1036)
8 Memory: 91.2M
9 CGroup: /system.slice/gunicorn.service
10 ├─2467813 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
11 ├─2467814 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
12 ├─2467815 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
13 ├─2467816 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
14 └─2467817 /usr/bin/python3 /usr/local/bin/gunicorn -c api/gunicorn.py api.main:app
-
在 github 倉庫的配置 Payload URL,如下圖所示
-
push 觸發下 webhook,再去後臺查看結果,看下圖觸發成功,返回了代碼定義的結果
當然, 網站的更新方式千千萬,你直接遠古 scp ssh ftp rsync 更新都可以,我是因爲登錄外國服務器卡,也不想老是登錄,這樣夠用也夠靈活,同時只依賴 github 的 webhook,github 掛了,gitlab 類的也有 webhook,不用去學 action 的語法,個人覺得簡單易用可控, 複雜的動態站點更新,可以自己定義格外的邏輯
最後修改於: Friday, December 8, 2023
版權申明:
- 未標註來源的內容皆為原創,未經授權請勿轉載(因轉載後排版往往錯亂、內容不可控、無法持續更新等);
- 非營利為目的,演繹本博客任何內容,請以'原文出處'或者'參考鏈接'等方式給出本站相關網頁地址(方便讀者)。