github设置webhook完成自动化部署
这个功能工作中其实一直都在使用,但是自己的一些个人服务因为更新不是很频繁(主要是自己懒)所以就这个需求就不是很大,最近在要做一点小东西,push比较频繁,每次都ssh 到服务器上面 git pull 比较麻烦。所以还是配置一下,这里整理下配置的过程mark一下
1:确认服务器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 2:用当前用户clone 项目到服务器目录 这里就不细说了 3:编写钩子脚本接口,这里是用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就是上报日志函数,这个自行看吧,我是习惯所有的都搞个日志
4:在github配置webhook
详情参看官方文档:https://developer.github.com/webhooks/
我应该是内网网络不太好,所以好几次都超时了这个要优化下。