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。
如果成功了,请点个赞,谢谢~