
这个功能工作中其实一直都在使用,但是自己的一些个人服务因为更新不是很频繁(主要是自己懒)所以就这个需求就不是很大,最近在要做一点小东西,push比较频繁,每次都ssh 到服务器上面 git pull 比较麻烦。所以还是配置一下,这里整理下配置的过程mark一下
第一步:
确认服务器server的执行用户,有些是nobody 或者www用户,首先为此用户生成 ssh keys 用来拉取git的资源,我们以www用户举例
# 切换到www用户$ su www具体的可以参考官方
https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"一路回车下一步 生成的密钥默认在/Users/you/.ssh/id_rsa把密钥存储到github https://github.com/settings/ssh/new第二步:
用当前用户clone 项目到服务器目录 这里就不细说了
第三步:
编写钩子脚本接口,这里是用php来做例子, hook接口需要通过http访问到,里面的功能可以自由编写, 这里要注意的点,我用的laravel的框架,本来在laravel框架中的controller写了更新脚本,但是报错“资源不存在 不是一个git目录”, 应该是环境变量的问题,用单独的php文件来执行就没问题,这里没有去研究为啥。如果你用的php框架来提供这个钩子,要注意这一点 可能会有问题 核心代码其实就一行:
chdir($dir);exec("git pull 2>&1", $out);调用exec文件到对应的目录执行git pull 命令就可以了。git的webhook有超时时间,如果脚本要做的事情很多,或者其他情况可以异步去搞。这是另开的一说
还有就是github密钥设置,为了安全不能是任何请求钩子都会执行这里上一个简单的代码示例,还有很多可以完善,但是可用了
<?phpdate_default_timezone_set('PRC');error_reporting(E_ERROR);//校验密钥
$secret = "";//Github项目中对应的Secret//获取GitHub发送的内容
$json = file_get_contents('php://input');
$githubContent = json_decode($json, true);//github发送过来的签名
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];if (!$signature) {doLog(-1, "HTTP_X_HUB_SIGNATURE empty");die(http_response_code(404));}list($algo, $hash) = explode('=', $signature, 2);//计算签名
$payloadHash = hash_hmac($algo, $json, $secret);if ($hash !== $payloadHash) {doLog(-1, "HTTP_X_HUB_SIGNATURE wrong");die(http_response_code(404));}//开始更新
$serverIp = gethostbyname($_SERVER['SERVER_NAME']);if ($serverIp == '111.111.111.111') { // server ip
$dir = "/server/dir";} else {
$dir = "/Users/dir";}chdir($dir);exec("git pull 2>&1", $out);doLog(0, ['github_content' => $githubContent, 'exec_content' => $out, 'signature' => $signature]);function doLog($code, $content){// 记录日志}doLog就是上报日志函数,这个自行看吧,我是习惯所有的都搞个日志
第四步:
在github配置webhook 详情参看官方文档:https://developer.github.com/webhooks/

可以在github查看历史记录

我应该是内网网络不太好,所以好几次都超时了这个要优化下。
☆ END ☆来源:
https://cloud.tencent.com/developer/article/1614531
