github hooks 配置教程 鉤子搭建(實測通過,手把手教程)

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。

如果成功了,請點個贊,謝謝~

 

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