標籤:

使用webhook結合python腳本實現自動化部署

一. 分析需求

1. 需求說明

在項目開發過程中,我們有時會頻繁的更新代碼, 流程大概為:

(1) 本地 git push 提交代碼至git託管平台

(2) 登陸到部署有網站源碼的線上伺服器

(3) cd到項目根目錄, 執行 git pull 指令拉取最新代碼

整個流程純手動更新,每次耗時在1分鐘左右, 這樣一天下來,浪費了很多時間在這些瑣碎的事情上.

現在的需求是,在每次本地提交代碼後,線上伺服器自動拉取最新代碼,完成部署更新.即所謂的自動化部署.

2. 方案

現在一些主流代碼託管平台如 github、 gitlabgit@osc 等均已提供webhook功能,在用戶push了代碼後,會自動回調一個您設定的http地址。 用戶可以自己根據不同的需求,來編寫自己的腳本程序(比如發郵件,自動部署等);目前,webhook支持多種觸發方式,如Push、 Tag Push、 Issue、評論、合併請求

附webhook的簡介:nWebhook就是用戶通過自定義回調函數(callback)的方式來改變Web應用的一種行為,這些回調函數可以由不是該Web應用官方的第三方用戶或者開發人員來維護,修改。通過Webhook,你可以自定義一些行為通知到指定的URL去。Webhook的「自定義回調函數」通常是由一些事件觸發的,比如推送代碼到代碼庫或者博客下新增一個評論,源站點會為Webhook進行HTTP請求的URI配置。用戶通過配置,就可以使一個網站上的事件調用在另一個網站上表現出來,這些事件調用可以是任何事件,但通常應用的是系統集成和消息通知。n

3. 分析如何實現

(1) 編寫一個web介面,以便於接收由webhook發出的數據請求

(2) 在該web介面, 接收到的post消息中含有多個參數,包括分支信息,commit信息

(3) 根據分支信息和commit信息判斷是否需要更新,如果無需更新,結束

(4) 需要更新,開始切換用戶,獲取更新許可權,寫入參數到文本文件中,避免因切換參數導致參數丟失

(5) 從文本文件中讀取參數,傳遞分支參數,調用含有git pull等指令的自動部署腳本,開始執行部署操作

(6) 將包含這個介面的web服務放在你網站源碼所在的伺服器上,開啟後台運行(使用nohup指令或supervisor守護進程)

(7) 將這個介面的url路由地址配置在代碼託管平台的webhook功能中

(8) 測試更新代碼,接收到webhook推送的消息數據, 執行自動化更新,完畢

二. 代碼實現

特殊說明n(1) 本篇文章使用python腳本 + tornado框架搭建web伺服器,用於接收git代碼託管平台的webhook消息推送.n(2) git代碼託管平台以Git@OSC為例,其他託管平台與之類似.n(3) 本篇文章中執行自動化部署指令的前提是已經配置了sshn(4) 以下代碼僅測試的是更新主分支,其他操作與之類似.n

下圖是這個腳本的整體目錄

備註: 紅色標記的才是關鍵代碼,其他文件是一些日誌和虛擬環境等無關緊要的文件

1. 編寫一個web介面,以便於接收由webhook發出的數據請求

2. 編寫一個配置文件config.json,用於存放git@osc所需的驗證密碼參數、需要部署的項目根目錄、需要執行的git指令

3. 編寫接收到webhook消息時需要執行的腳本

4. 掛載到我們部署的網站伺服器上,開啟後台運行 (本篇文章以守護進程方式啟動)

5. 將這個介面的url路由地址配置在代碼託管平台的webhook功能中

6. 測試更新代碼,接收到webhook推送的消息數據, 執行自動化更新,完畢

下圖是webhook推送的json消息內容


推薦閱讀:

python 類中__new__ 和 __init__方法區別
樹莓派Raspberry區域網視頻小車教程

TAG:Python | Git |