我参考了
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正常。
所以,到底应该怎么弄?