普通公司小項目,傳統更新線上代碼是每次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 .。