这个功能工作中其实一直都在使用, 但是自己的一些个人服务因为更新不是很频繁 (主要是自己懒) 所以就这个需求就不是很大, 最近在要做一点小东西, push 比较频繁, 每次都 SSH 到服务器上面 Git pull 比较麻烦. 所以还是配置一下, 这里整理下配置的过程 mark 一下
第一步:
确认服务器 server 的执行用户, 有些是 nobody 或者 www 用户, 首先为此用户生成 SSH keys 用来拉取 Git 的资源, 我们以 www 用户举例
切换到 www 用户
su www
具体的可以参考官方
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 密钥设置, 为了安全不能是任何请求钩子都会执行这里上一个简单的代码示例, 还有很多可以完善, 但是可用了
- <?PHP
- date_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 查看历史记录
我应该是内网网络不太好, 所以好几次都超时了这个要优化下.
来源: https://www.qcloud.com/developer/article/1614531