前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >github设置webhook完成自动化部署

github设置webhook完成自动化部署

原创
作者头像
pooky
发布2020-04-15 15:32:05
2.6K1
发布2020-04-15 15:32:05
举报
文章被收录于专栏:开发随笔开发随笔

这个功能工作中其实一直都在使用,但是自己的一些个人服务因为更新不是很频繁(主要是自己懒)所以就这个需求就不是很大,最近在要做一点小东西,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框架来提供这个钩子,要注意这一点 可能会有问题 核心代码其实就一行:

代码语言:javascript
复制
chdir($dir);
exec("git pull 2>&1", $out);

调用exec文件到对应的目录执行git pull 命令就可以了。git的webhook有超时时间,如果脚本要做的事情很多,或者其他情况可以异步去搞。这是另开的一说

还有就是github密钥设置,为了安全不能是任何请求钩子都会执行这里上一个简单的代码示例,还有很多可以完善,但是可用了

代码语言:javascript
复制
<?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查看历史记录

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一步:
  • 第二步:
  • 第三步:
  • 第四步:
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档