快轉到主要內容
  1. Posts/

GitHub Webhook 自動化程式碼部署教學

DevOps GitHub Python Flask GitHub Webhook 自動化 部署 Python Flask Git SSH
目錄

這篇文章將介紹如何設置 GitHub 的 webhook,使得每當有 push 事件發生時,系統能自動拉取最新的代碼並部署到指定的伺服器上。以下是實作流程。

基本流程
#

  1. 在 GitHub 上設定 repository 的 webhook。
  2. 在伺服器上建立一個 main.py 並啟動它。
  3. 當發生 push 事件時,伺服器會接收到 webhook 並自動拉取最新代碼。
  4. 代碼部署完成,應用就更新好了。

本項目位置
#

https://github.com/a607ernie/git_auto_pull

測試環境
#

  • 測試環境 : 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,也可以直接用自己的。

  1. 將這個 repo fork 到自己的帳戶。
  2. 接著把這個 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
#

  1. 進入 GitHub 的 repository 設定頁面,找到 webhook 設定區。
  2. 在 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 設定成功了。

測試
#

現在可以測試是否真的能夠自動更新代碼了。操作步驟如下:

  1. 打開 GitHub 上的 redis repo,進行 README.md 檔案的編輯。
  2. 隨便新增一些內容並提交。

這時,你會看到 Flask 接收到新的 push 事件,並且伺服器上的 your_repo 目錄也會自動更新。打開 README.md,你會發現剛剛新增的內容已經顯示在上面了。

Ernie
作者
Ernie

相關文章

Flask應用程式中的Celery與Flower:高效處理異步任務
Python Flask Celery Flask Celery Flower Redis Python
學習如何在Flask應用程式中使用Celery處理異步任務,並使用Flower監控任務狀態。
使用 Supervisor 管理 Linux 服務
Linux Python Supervisor Flask Gunicorn Linux Python
學習如何在Linux環境下使用Supervisor管理Flask+Gunicorn應用程式。
GitLab SSH Key 設定教學:安全又快速的 Git 操作
Git GitLab GitLab SSH 版本控制 Git
此文章提供 GitLab SSH Key 的檢查、建立與新增教學,讓你的 Git 操作更安全、順暢。