前提:本地git初始化 已完成
服務器環境
*PHP 5.4
*Nginx 1.8.0
*GIT version 2.9.4(#git --version)
一、添加 Web Hooks
我的碼雲 -> 點擊相應項目A -> 管理-> WebHooks 設置 -> 添加;具體填寫內容如下圖所示
WebHooks 設置
二、準備PHP腳本(必須保證瀏覽器可訪問)
不多說,直接帖碼。修改好自定義選項,上傳服務器後到gitee後臺點擊測試驗證是否通過。
<?php
/**
* 自動更新鉤子
* 修改驗證碼及項目路徑即可使用,
* 修改項如下:
* 1、您的自定義密碼
* 2、/home/wwwroot/app您的項目A路徑
* [衝浪蝸牛](https://www.jianshu.com/u/4913fc14f7fb)
**/
// 接收碼雲POST過來的信息
$json = $GLOBALS['HTTP_RAW_POST_DATA'];
$data = json_decode($json, true);
// 打開網站目錄下的hooks.log文件 需要在服務器上創建 並給寫權限
$fs = fopen('./../../logs/webhooks_pull.log', 'a');
fwrite($fs, '================ Update Start ===============' . PHP_EOL . PHP_EOL);
// 自定義密碼 用於驗證 與碼雲後臺設置保持一致
$access_token = '您的自定義密碼';
$client_token = $data['password'];
// 請求ip
$client_ip = $_SERVER['REMOTE_ADDR'];
// 把請求的IP和時間寫進log
fwrite($fs, 'Request on [' . date("Y-m-d H:i:s") . '] from [' . $client_ip . ']' . PHP_EOL);
// 驗證token 有錯就寫進日誌並退出
if ($client_token !== $access_token) {
echo "error 403";
fwrite($fs, "Invalid token [{$client_token}]" . PHP_EOL);
$fs and fclose($fs);
exit(0);
}
// 如果有需要 可以打開下面,把傳送過來的信息寫進log 可用於調試,測試成功後註釋即可
// fwrite($fs, 'Data: ' . print_r($data, true) . PHP_EOL);
// 執行shell命令並把返回信息寫進日誌
exec('cd /home/wwwroot/app; git pull 2<&1; chown -R www:www /home/wwwroot/app/*;', $output);
fwrite($fs, 'Info:' . print_r($output, true) . PHP_EOL);
fwrite($fs, PHP_EOL . '================ Update End ===============' . PHP_EOL . PHP_EOL);
$fs and fclose($fs);
// 調試時打開
// echo json_encode($output);
pull遇到錯誤:error: Your local changes to the following files would be overwritten by merge:
執行:git reset --hard 即可
三、服務器的設置 (重要)
如果沒有給777權限,pull時會報各種權限錯誤(除非你對用戶及用戶組權限設置的很到位並可以解決站點www用戶組權限的衝突)
,當然也可以將項目A中的.git目錄權限都設置爲777,如下命令是我當前使用的具體操作。
// 爲了相對安全,我這裏針對需要777權限的目錄進行設置
cd 項目A/.git
# cd .git
chmod -R 777 FETCH_HEAD
chmod -R 777 ./objects
chmod -R 777 ./refs
chmod -R 777 ./logs
注意: 是.git
目錄
因爲PHP腳本涉及到shell命令執行所有需要php開啓exec命令權限
php.ini:
開啓exec權限,刪除紅框中的內容保存後重啓php服務即可
四、可以認真寫代碼了
執行push的會觸發WebHooks,同時推送消息給項目A中WebHooks 設置的請求地址,最後完成服務器的git pull。
git status
# git pull
git push
至此完成碼雲gitee自動部署。