vlambda博客
学习文章列表

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设置webhook完成自动化部署

可以在github查看历史记录

我应该是内网网络不太好,所以好几次都超时了这个要优化下。

来源:

https://cloud.tencent.com/developer/article/1614531



☆ END ☆