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 "mengyilingjian@outlook.com" 

5.执行命令 sudo -Hu www ssh-keygen -t rsa ,生成deploy-key。和第三步一样,将生成的id_rsa.pub文件内容,添加到项目中的webhooks选项 deploy keys中。

6.将服务器上的代码删除,使用命令 sudo -Hu www git clone git@github.com: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 = "
 -------------------------".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。

如果成功了,请点个赞,谢谢~

 

原文地址:https://www.cnblogs.com/mengyilingjian/p/11699836.html