github设置webhook完成自动化部署
这个功能工作中其实一直都在使用,但是自己的一些个人服务因为更新不是很频繁(主要是自己懒)所以就这个需求就不是很大,最近在要做一点小东西,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 "[email protected]"
一路回车下一步 生成的密钥默认在
/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://cloud.tencent.com/developer/article/1614531