在項目開發中,都會遇到兩個過程,一個是版本控制,另外一個是代碼發佈。php
版本控制目前有兩種途徑,一個是git,另外一個是svn。我用的是git,在這裏就不介紹git和svn的差別了。vue
而代碼發佈,在最初的時候,用的都是ftp直接將代碼拉倒服務器上(由於這是我本身的項目),這樣子不只費事,還容易出事。nginx
下面就引入GitHub和WebHooks達到自動部署。git
在咱們完成開發並測試經過以後,將代碼提交到git上,git就自動調用hook將代碼pull到服務器上。github
在當git訪問服務器上的webhook腳本時,主要任務就是執行git pull將代碼更新到服務器上,這時是以nginx的運行用戶(ps -ef | grep nginx 可查看)去執行這個命令的,因此運行nginx的用戶要擁有對項目讀寫的權限。web
上面提到的用戶,須要給它配置ssh-key,配置ssh-key是爲了可以方便在拉取代碼pull的時候,能夠不用輸入賬號密碼,在當webHooks腳本執行的時候,用的是nginx的用戶,因此應該要以nginx的運行用戶去建立一個ssh-key。 能夠本身建立一個新的用戶,用這個用戶去運行nginx(下面介紹),而後將項目的分給這個用戶(下面介紹)。shell
這一步是爲了在項目push到master版本的時候,由webHooks完成自動部署。json
在gitHub上爲須要自動部署的項目新建一個WebHools瀏覽器
Setting -> WehHooks -> Add web 服務器
在建立的時候須要輸入密碼。
填寫webhook基本信息
webhook請求的接口
前面有說過了,這個接口其實是執行git pull將代碼更新到服務器項目中,下面是php版本代碼。
<?php
// 本地倉庫路徑 既項目路徑
$local = '/data/web/testWebHooks';
// 若是倉庫目錄不存在,返回錯誤
if (!is_dir($local)) {
header('HTTP/1.1 500 Internal Server Error');
die('Local directory is missing');
}
//若是請求體內容爲空,返回錯誤
if (!isset($_POST['payload'])) {
header('HTTP/1.1 400 Bad Request');
die('HTTP HEADER or POST is missing.');
}
// 上圖中第2步的Content Type是application/x-www-form-urlencoded,所應用post接受
$payload = json_decode($_POST['payload'], true);
// 簽名
if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE']) || !$_SERVER['HTTP_X_HUB_SIGNATURE']) {
header('HTTP/1.1 403 Bad Request');
die('Permission denied.' . json_encode($_SERVER));
}
$signature = $_SERVER['X-Hub-Signature'];
list($algo, $hash) = explode('=', $signature, 2);
//計算簽名
$secret = '******'; // 上圖中第三部填寫的密碼
$payloadHash = hash_hmac($algo, $payload, $secret);
if ($hash !== $payloadHash){
header('HTTP/1.1 403 Bad Request');
die($signature . ' ' . $_SERVER['X-Hub-Signature']);
}
複製代碼
這是一個php腳本,主要有兩個功能,一個是校驗,另外一個是更新代碼。校驗是爲了防止你的腳本被別人一直請求,第二個就是從git上拉取代碼並更新。
若是你的項目是vue或者是其餘須要編譯的項目,能夠在更新代碼以後執行編譯過程。
在git上填寫信息以後,會自動去請求這個接口進行測試,http返回200表示成功。具體的請求記錄在提交信息下方的Recent Deliveries
注意
1.確保PHP正常執行系統命令。寫一個PHP文件,內容:
<?php shell_exec('ls -la')
複製代碼
在經過瀏覽器訪問這個文件,可以輸出目錄結構說明PHP能夠運行系統命令。
當咱們經過git push提交代碼以後,能夠在github的webhook頁面最下面看到webhook的執行記錄。若是提示成功了,能夠去刷新頁面查看是否有更新成功。