为了账号安全,请及时绑定邮箱和手机立即绑定

为什么github的webhooks实际没有执行?

为什么github的webhooks实际没有执行?

PHP
UYOU 2019-03-05 09:54:19
问题描述 我参考了 https://blog.kinggui.com/arch...https://www.jianshu.com/p/50e... 这两篇文章尝试将本地写的gitbook电子书通过github发布到阿里云 我的webhook.php文件: <?php //服务器本地仓库路径,填写仓库入口目录 $local = '/alidata1/www/web/www.example.me/'; //github远程仓库地址 $remote = 'https://github.com/example/example.git'; //密钥,github是密钥,验证方式跟gitee不一样 //请注意,这里设置的密钥稍后在github网站设置的时候需要用到 $secret = 'password'; //获取请求参数 $request = file_get_contents('php://input'); if (empty($request)) { die('request is empty'); } //获取http 头 $headers = getHeaders(); //github发送过来的签名 $hubSignature = $headers['X-Hub-Signature']; list($algo, $hash) = explode('=', $hubSignature, 2); // 计算签名 $payloadHash = hash_hmac($algo, $request, $secret); // 判断签名是否匹配 if ($hash != $payloadHash) { die('secret is error'); } // echo shell_exec("cd {$local} && /usr/bin/git pull {$remote} 2>&1"); // /root/github_synch.sh 是在服务器上面的一个拉取仓库文件的脚本。 echo shell_exec("/root/github_synch.sh"); die('done ' . date('Y-m-d H:i:s', time())); /** * @todo 获取头信息 */ function getHeaders() { $headers = array(); //Apache服务器才支持getallheaders函数 if (!function_exists('getallheaders')) { foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } } } else { $headers = getallheaders(); } return $headers; } 电子书在服务器上的仓库路径就是上面的/alidata1/www/web/www.example.me/。gitbook在编译出书的时候会在_book目录里面。于是我把钩子文件的URL就设定为了www.example.me/webhook.php当然,webhook.php这个文件已经放到了/alidata1/www/web/www.example.me/_book/里面,webhook.php的属组是www.www,权限是755。 github_synch.sh(root.root 755)这个文件的内容: #!/bin/bash cd /alidata1/www/web/www.example.com git pull origin master chown -R www.www /alidata1/www/web/www.example.com chmod +x /alidata1/www/web/www.example.com/_book/webhook.php 然后就是配置github网站上面的webhook。等全部配置完了看测试信息,发现是一对勾。感觉配置没什么问题,于是实际再测试一下,本地仓库加了一个临时文件,本地提交到github,在看webhook的信息,也都Ok,但是回到服务器上发现那个文件实际就没有创建。点开response:那个函数被禁用了,于是去php.ini,把这个禁用的函数剔除,并且重载了php-fpm.然后再次测试提交一个临时文件,又是同样的结果,实际文件没有在服务器上面创建,webhook倒是没有报错了:然后想,应该就是这个脚本没执行,还是权限问题,于是改 /etc/sudoers 加了这么一行 www ALL=(root) NOPASSWD:/usr/bin/git 通过which 确认git路径没错。测试结果依然是效果没实现。resopnse正常。所以,到底应该怎么弄?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 711 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信