tips:如果本文對你有用,請愛心點個贊,提高排名,讓這篇文章幫助更多的人。謝謝大家!❤
本人hooks搭建成功,全程參考JellyBool老師的視頻教程,有不懂的可以先去看下這個視頻,跟着操作。本文主要是以文檔形式,教大家搭建git hooks.視頻地址:https://www.codecasts.com/series/use-git-in-your-own-way/episodes/215
hooks搭建成功後,很方便,可以在本地直接推送代碼到遠程服務器端。實現實時推送的功能。
如果解決不了,可以在文末進羣交流。
1.在github上創建倉庫,並把服務器的代碼推送到該倉庫。
2.在linux中使用命令 ps -ef | grep php,查看執行php程序的用戶。我的是nginx,執行用戶是www用戶。
3.使用命令:sudo ssh-kengen -t rsa -C "your_github_email"生成密鑰,如果你不是root用戶,會提示要求輸入執行命令的用戶密碼。直接輸入即可。我已經生成完畢,所以往下的我就不再截圖做演示。下面的步驟都是直接回車,成功後有生成sshkey的路徑,然後根據這個路徑找到id_rsa.pub文件,並將文件內的內容,配置到github的公鑰中。
4.分別執行以下兩條命令配置github:
git config --global user.name "eric-zhou"
git config --global user.email "[email protected]"
5.執行命令 sudo -Hu www ssh-keygen -t rsa ,生成deploy-key。和第三步一樣,將生成的id_rsa.pub文件內容,添加到項目中的webhooks選項 deploy keys中。
6.將服務器上的代碼刪除,使用命令 sudo -Hu www git clone [email protected]:eric-zhou/project.git ,重新克隆一份到服務器上。並在倉庫中創建一個deploy.php.代碼內容如下。這個php文件假設直接訪問路徑爲是 https://abc.vyuan8.cn/vyuan/deploy.php。
<?php class Deployment { public $serect = 'mengling@1234333'; //webhooks中配置的密鑰 public function deploy() { $requestBody = file_get_contents('php://input'); //每次推送的時候,會接收到post過來的數據。 $payload = json_decode($requestBody, true); //將數據轉成數組,方便取值。 if(empty($payload)){ //寫日誌 $this->write_log('send fail from github is empty');exit; }else{ //獲取github推送代碼時經過哈希加密密鑰的值 $signature = $_SERVER['HTTP_X_HUB_SIGNATURE']; } if (strlen($signature) > 8 && $this->isFromGithub($requestBody,$signature)) { //驗證密鑰是否正確,如果正確執行命令。 $res = shell_exec("cd /alidata/www/phpwind/project && git pull 2>&1"); $res_log = "\n -------------------------".PHP_EOL; $res_log .= '['.$payload['commits'][0]['author']['name'] . ']' . '向[' . $payload['repository']['name'] . ']項目的' . $payload['ref'] . '分支'.$_SERVER['X-GitHub-Event'].'了代碼。commit信息是:'.$payload['commits']['message'].'。詳細信息如下:' . PHP_EOL; $res_log .= $res.PHP_EOL; http_response_code(200); $this->write_log($res_log); }else{ $this->write_log('git 提交失敗!'); abort(403); } } public function isFromGithub($payload,$signature) { //$hash是github的密鑰。然後與本地的密鑰做對比。 list($algo, $hash) = explode("=", $signature, 2); return $hash === hash_hmac($algo, $payload, $this->serect); } public function write_log($data) { // 此處加載日誌類,用來記錄git push信息,可以自行寫。 } } $deploy = new Deployment(); if($_SERVER['REQUEST_METHOD'] == 'POST'){ //觸發此代碼的時候,git是以post方式觸發 $signature = $deploy->deploy(); }
7.配置webhooks。如下圖:
secret是用來校驗的一個密鑰。可以自行設置。設置成功後,這個密鑰要和deploy.php中的secret變量一樣。具體不懂的,可以參考jellybool老師的視頻,很詳細。
8.使用git clone命令,在本地將倉庫的代碼克隆下來。然後使用git bash直接開始使用git push文件,就可以同步到服務器上了。
9.基本流程說明: 就是在本地使用git推送到倉庫的時候,git會通過post的方式,請求設定的webhooks地址 https://abc.vyuan8.cn/vyuan/deploy.php。觸發這個地址後,便執行php中的代碼程序。
程序中先獲取post過來的body數據,這個數據是json格式,轉成數組後,可以拿到X-Hub-Signature這個值,然後用這個值和php中設定好的secret變量做哈希加密,進行對比。如果相等,則通過exce_shell函數執行git pull的動作。
post過來的數據,可以在git webhooks頁面中看到。
10.本人實測效果如下
push前
、
push後:
刷新網頁:
日誌記錄信息:
以上代碼本人親自測試,如果還是不會請先看視頻,然後再進羣提問。羣二維碼如果過期,可加我微信:mengyilingjian。
如果成功了,請點個贊,謝謝~