天天看點

使用碼雲git的webhook實作生産環境代碼的自動pull

普通公司小項目,傳統更新線上代碼是每次ftp/sftp上傳,或送出到svn/git後再ssh到線上環境中去手動拉取代碼,十分麻煩,雖然用上了版本控制,逼格還是不夠高啊!

現在的線上倉庫都支援hook技術,可以很友善的實作代碼的自動化管理。比如我現在使用gitee.com倉庫的webhook功能,監聽master分支有push動作時,可以自動通過設定的hook通知生産環境中的腳本執行git pull拉取代碼,自動更新,非常友善。

1. 設定并使用公鑰實作免密碼

目标環境中使用

ssh-keygen -t rsa -C "[email protected]"

#cat ~/.ssh/id_rsa.pub 檢視公鑰資訊

一路回車生成公鑰,在碼雲項目管理-部署公鑰管理中,送出這個公鑰串。

修改項目.git/config檔案的url為如下格式

[remote "origin"]

url = [email protected]:xxxxx/xxx.git

git pull 測試

2. 根目錄或其它位置放一個php文作用webhook的通知接口,内容如下:

// 本地倉庫路徑 項目目錄

$local = '/home/wwwroot/your_project';

// 密碼 gitee項目管理webhook中設定

$password = '654321';

//如果請求體内容為空,傳回錯誤

$payload = file_get_contents('php://input');

if (!$payload) {

    header('HTTP/1.1 400 Bad Request');

    die('HTTP HEADER or POST is missing.');

}

// 如果啟用驗證,并且驗證​​​​失敗,傳回錯誤

// gitee預設傳回json,解析json後驗證密碼

$data = json_decode($payload, true);

if(empty($data) || $data['password'] != $password) {

    header('HTTP/1.1 403 Permission Denied');

    die('Permission denied.');

// 如果倉庫目錄不存在,傳回錯誤

if (!is_dir($local)) {

    header('HTTP/1.1 500 Internal Server Error');

    die('Local directory is missing')}

//輸出執行結果 包括錯誤資訊,在gitee webhook中可以檢視和測試

echo shell_exec("cd {$local} && git pull 2>&1");

die("done " . date('Y-m-d H:i:s', time()));

3. 碼雲項目管理中,webhooks管理,添加,配置這個php的位址和對應的明文密碼。儲存測試,頁面下方會顯示最後一次的腳本執行資訊。

4. 執行出錯的話,很多時候是權限問題。php腳本一般是由www或www-data等帳戶權限來執行,是以整個項目目錄對此帳戶要有權限讀寫,比如全局chown -R www:www .。