這篇文章將介紹如何設置 GitHub 的 webhook,使得每當有 push 事件發生時,系統能自動拉取最新的代碼並部署到指定的伺服器上。以下是實作流程。
基本流程#
- 在 GitHub 上設定 repository 的 webhook。
- 在伺服器上建立一個 main.py 並啟動它。
- 當發生 push 事件時,伺服器會接收到 webhook 並自動拉取最新代碼。
- 代碼部署完成,應用就更新好了。
本項目位置#
測試環境#
- 測試環境 : Ubuntu
前置條件#
- 伺服器需要在 GitHub 上新增 SSH key,且本地端也需擁有 SSH key。
- 安裝 Python 3(建議使用 Python 3.6 以上版本),並確保安裝了 Flask 套件。
pip install flask
步驟一:新增 Flask 應用#
首先,在伺服器的工作目錄中新增一個 main.py 檔案,內容如下:
# main.py
from flask import jsonify, request, Flask
import subprocess
from pathlib import Path
app = Flask(__name__)
@app.route('/')
def api_root():
return "Welcome to GitHub Auto Deploy!"
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
repository_name = data['repository']['name']
subprocess.run("cd %s && git pull" % repository_name, shell=True, cwd=Path(__file__).parent.absolute())
return ""
if __name__ == '__main__':
app.run('0.0.0.0', debug=True)
步驟二:Fork GitHub Repo#
為了驗證 Flask 和 webhook 的設定,可以使用我的 repository。如果已經有自己的 repo,也可以直接用自己的。
- 將這個 repo fork 到自己的帳戶。
- 接著把這個 repo clone 到伺服器上,放在 main.py 檔案的旁邊。此時,由於已經配置了 SSH key,clone 不需要輸入密碼。
project
│───main.py # flask app
│
└───your_repo
│ │───file011.txt
│ │
└───other_repo1
│ │───test.txt
│ │
└───other_repo2
│ │───test.txt
│
步驟三:設定 Webhook#
- 進入 GitHub 的 repository 設定頁面,找到 webhook 設定區。
- 在 URL 欄位中填入剛剛設定好的 Flask 路由 URL:
http://<你的 IP>:5000/webhook
然後選擇 Add webhook。
步驟四:啟動 Flask 應用#
啟動 Flask 應用:
python main.py
啟動後,你會看到 webhook 設定頁面上顯示一個新的 webhook 記錄,並且旁邊會有個 test 按鈕。點擊 push event,如果 console 顯示 status code 200 並且出現 Already up to date.,說明 webhook 設定成功了。
測試#
現在可以測試是否真的能夠自動更新代碼了。操作步驟如下:
- 打開 GitHub 上的 redis repo,進行 README.md 檔案的編輯。
- 隨便新增一些內容並提交。
這時,你會看到 Flask 接收到新的 push 事件,並且伺服器上的 your_repo 目錄也會自動更新。打開 README.md,你會發現剛剛新增的內容已經顯示在上面了。
