碼雲gitee利用PHP腳本拉取實現自動部署

前提:本地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自動部署。
 



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章