当前位置:首页 > 群晖专栏 > 运维部署 > 正文内容

新手入门 Github Webhooks 完美自动化部署教程

admin5年前 (2020-01-04)运维部署98

前言

之前使用GitHub Actions可以在提交代码后自动上传到腾讯云COS存储桶,实现静态网站完美自动化部署.那么非静态的网站或者项目需要自动化部署到VPS服务器上就可以使用GitHub Webhooks来实现.作为纯属新手来说,网上查阅了十几篇相关教程,都没法部署成功,最后总算找到了问题关键点,决定整理成文章分享出来,希望能帮助到新手用户.


Webhook支持php,js等多种方式,可以实现简单的部署,也可以实现复杂的自动化构建等功能,本文介绍适合新手用户的php方式,来自动化部署网站.



Webhook简单原理

对于入门新手来说,Webhook可以理解为当你在本地完成代码工作后,Push提交到GitHub,GitHub检测到Push后,使用Webhook发送一条命令到你的VPS服务器上的Webhook.php文件,服务器检测到命令后根据webhook.php中的配置在服务器上执行Pull命令,同步GitHub上的代码到服务器.实现了简单的自动化部署工作.节省了你再次上传至服务器的多余操作.

部署流程

启用shell_exec

编辑php.ini

vi /usr/local/php/etc/php.ini

查找shell_exec,在disable_functions中删除shell_exec字段.

重启php.ini保存设置

/etc/init.d/php-fpm restart

配置站点目录权限

由于Webhook的推送请求是通过http/https方式发送至服务器,根据webhook.php中的命令执行git pull的实为运行php的用户,根据以下命令可以查执行php用户为www.

ps aux | grep php

确保仓库所在的站点目录所有者为www

chown -R www:www /home/wwwroot

切换为www账户

以root账户登陆服务器,修改www的登录权限.

vi /etc/passwd

找到

www:x:1003:1003::/home/www:/sbin/nologin

修为改

www:x:1003:1003::/home/www:/bin/bash

为www创建ssh公钥

切换为www登陆

su www

创建ssh公钥

ssh-keygen -t rsa


获取你的公钥id_rsa.pub

cat /home/www/.ssh/id_rsa.pub

登陆GitHub配置ssh公钥

登陆GitHub - 进入仓库 - Settings - Deploy keys - Add Deploy keys
粘贴刚才创建的公钥

首次git clone仓库

验证ssh公钥配置成功

ssh -T git@github.com


首次clone仓库成功

git clone git@github.com:xxxxxx/xxxxxxx.git

配置webhook.php

在项目网站根目录创建webhook.php获得外网链接为https://yourdoamin.com/webhook.php
粘贴以下代码,只需要更改keySecretwwwRoot即可.

<?php

// 自行创建一个验证密码
$keySecret = 'xxxxxx';

// 修改为你自己的仓库绝对路径
$wwwRoot = [
    '/home/wwwroot/xxxx',
];

// 保存运行脚本的日志
$logFile = 'log/webhook.log';

// 执行git命令
$gitCommand = 'git pull';

// 判断是否开启秘钥认证(已实现gitee和github)
if (isset($keySecret) && !empty($keySecret)) {
    list($headers, $gitType) = [[], null];
    foreach ($_SERVER as $key => $value) {
        'HTTP_' == substr($key, 0, 5) && $headers[str_replace('_', '-', substr($key, 5))] = $value;
        if (empty($gitType) && strpos($key, 'GITEE') !== false) {
            $gitType = 'GITEE';
        }
        if (empty($gitType) && strpos($key, 'GITHUB') !== false) {
            $gitType = 'GITHUB';
        }
    }
    if ($gitType == 'GITEE') {
        if (!isset($headers['X-GITEE-TOKEN']) || $headers['X-GITEE-TOKEN'] != $keySecret) {
            die('GITEE - 请求失败,秘钥有误');
        }
    } elseif ($gitType == 'GITHUB') {
        $json_content = file_get_contents('php://input');
        $signature = "sha1=" . hash_hmac('sha1', $json_content, $keySecret);
        if ($signature != $headers['X-HUB-SIGNATURE']) {
            die('GITHUB - 请求失败,秘钥有误');
        }
    } else {
        die('请求错误,未知git类型');
    }
}

!is_array($wwwRoot) && $wwwRoot = [$wwwRoot];
foreach ($wwwRoot as $vo) {
    $shell = sprintf("cd %s && git pull 2>&1", $vo);
    $output = shell_exec($shell);
    $log = sprintf("[%s] %s \n", date('Y-m-d H:i:s', time()) . ' - ' . $vo, $output);
    echo $log;
    file_put_contents($logFile, $log, FILE_APPEND);
}

GitHub Webhooks配置

登陆GitHub - 进入仓库 - Settings - Webhooks - Add webhook
Payload URL 输入刚才获取的webhook.php的外网链接.
Content type 保持默认
Secret 输入刚才配置webhook.php创建的验证密码
Add webhook 完成创建

恢复关闭www登陆

exit退出www登陆切回root,在次关闭www登陆.

vi /etc/passwd

恢复为

www:x:1003:1003::/home/www:/sbin/nologin

自动化部署成功

本地push代码到GitHub后,可以看到返回信息提示服务器pull成功.

关键点和相关错误

权限

网上很多教程都没有提到权限问题,所以对于新手小白来说,就会不知道为什么不成功.而少数提到权限的教程,也没有非常详细指导用户如何配置.所以如果部署有问题,请检查权限问题,新手用户可以严格按照本教程先部署成功,在来自行修改你需要的配置.

webhook.php

webhook.php的代码网上也有很多种,有些能用有些无法使用,本文提供的是经过测试可用的,大家也可以自行搜索或者编辑.

Service Timeout

当遇到push大量代码时,服务器pull需要更长的时间,所以webhook返回给GitHub的信息如下图会出现Service Timeout超时错误,但实际上服务器也成功执行了pull,你可以登陆服务器检查来确认,同时也可以根据你的项目实际情况自行修改webhook.php执行配置.

证书错误

有可能会出现下图中的证书错误提示,请更换证书,测试时使用的Let's Encrypt的泛域名证书就会报错,博主更换为腾讯云申请的单域名证书就可以了.


结语

特别感谢以下两篇文章给予了关于www权限webhook.php两个关键点的帮助:

本站提供免费和付费的技术支持.你可以通过留言,邮件,QQ的方式来进行技术交流和免费咨询.同时也可以付费支持的方式获得相关的技术支持,项目部署配置等服务.具体相关详情请点击查看 技术支持页面

扫描二维码推送至手机访问。

版权声明:本文由梦魁网络资源站发布,如需转载请注明出处。

本文链接:https://family.monkui.com:39/?id=206

标签: 运维部署
分享给朋友:

相关文章

免费申请Let's Encrypt泛域名SSL证书教程

免费申请Let's Encrypt泛域名SSL证书教程

前言本站介绍过如何申请阿里云和腾讯云免费SSL证书教程,但该SSL证书为单域名证书,只为ioiox.com和www.ioiox.com生成证书,如果我们有例如typecho.ioiox.com,wordpress.ioiox.com等多个二...

服务器一键安装LNMP和LAMP环境教程

服务器一键安装LNMP和LAMP环境教程

前言本文将详解如何在Linux服务器上通过国内流行的军哥LNMP一键安装包来快速安装配置LNMP或LAMP环境.LNMP和LAMP是服务器建站环境的简称,LNMP即Linux/Nginx/MySQL/PHP,而LAMP即Linux/Apac...

Nginx设置301重定向到www和强制跳转https教程

Nginx设置301重定向到www和强制跳转https教程

前言本文将详解如何配置Nginx的conf文件来使域名跳转到www和强制跳转到https首先在建站之前,需要确认今后网站是使用类似ioiox.com一级域名,还是www.ioiox.com二级域名,根据域名长度,使用场景,域名视觉美观来决定...

一键安装脚本为CentOS 7 添加Swap交换分区

一键安装脚本为CentOS 7 添加Swap交换分区

前言由于阿里云,腾讯云等云服务器默认系统镜像不带Swap分区,本文将介绍使用简单的一键安装脚本为CentOS7添加Swap交换分区.配置流程一、检查Swap分区登录服务器输入free -mSwap分区为0则表示无Swap分区二、下...

支持本地,腾讯,阿里,七牛,又拍云对象存储的Lsky Pro图床安装教程

支持本地,腾讯,阿里,七牛,又拍云对象存储的Lsky Pro图床安装教程

前言一直在寻找一款外观颜值高,部署简单,功能强大的图床程序.经过多达10款图床程序的测试,最终选择了Lsky Pro来作为正式环境的图床站点程序.Lsky Pro项目地址Lsky Pro的部署相对很多图床来说,环境需求简单,整个部署时间加上...

CentOS 7 从Python2.7.5升级到Python2.7.16版本教程

CentOS 7 从Python2.7.5升级到Python2.7.16版本教程

前言最近一直忙于工作,游戏,摄影,摄像,vlog等等.几乎没有时间来维护博客.今天特意抽出一点时间来整理和维护一下阿里云的几个服务,顺便更新了云服务器的一些漏洞,其中大部分的漏洞通过yum update来更新一下版本即可修复,唯独RHSA-...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。