Mark

使用PHP和Github Webhook实现自动部署
前言 一般情况下,我们每次在使用Github时,每次push完代码后,都要手动到服务器上git pull一次,如果...
扫描右侧二维码阅读全文
01
2019/08

使用PHP和Github Webhook实现自动部署

前言

一般情况下,我们每次在使用Github时,每次push完代码后,都要手动到服务器上git pull一次,如果是vue之类的项目还要npm inpm build。 当然我们可以写sh脚本来进行部署,但这仍免不了我们要上服务器操作。程序员就是为了懒而生的,我们可以通过Github的webhook功能来实现push完后直接部署的爽快。

以下操作均在Centos7上进行

为Apache或Nginx配置用户和组

这里以Apache为例,已经配置了的请绕道。

合理的配置用户权限,才能规避一系列的权限问题,也能保证服务器的安全。

首先是创建用户和组,在root用户下执行

useradd www

这样会添加www组和www用户,并把www用户放置在www组中。也可以分开创建,自行百度。
创建完用户后会在/home下创建用户主目录www,也可以在useradd后面加上参数-d指定主目录在其他地方。

找到Apache的配置文件,我的系统为Centos7,默认在/etc/httpd/conf/httpd.conf
打开后找到UserGroup,更改为www

User www
Group www

然后重启Apache systemctl restart httpd

修改网站目录拥有者和所属组

找到网站的根目录(不是指某一特定网站,是指整个Apache的网站根目录)。
例如我的目录在/var/www,在www文件夹下又有多个站点,我们要把www文件夹的拥有者改为www,所属组改为www。(确保Apache在执行时有权限)。

chown -R www.www /var/www

cd /var后,ls -l,就能看到www文件夹的拥有者和所属组改变了,然后我们修改一下www文件夹的权限。

chmod -R 750 /var/www

表示www用户拥有所有权限,同组其他成员不能编辑,其他用户不能访问。
最终结果如下

drwxr-x---  10 www  www  4096 Feb 26 14:06 www

配置ssh key

我们要为用户www也配置ssh key。
首先切换用户为www,然后执行ssh-keygen

su www
ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa): 

key就放在默认位置就行,密码随意,我没有要密码,因为写脚本会麻烦一丢丢。

这时/home/www/.ssh/会有id_rsaid_rsa.pub两个文件,我们还差一个known_hosts文件。
先配置github的ssh key

  • 首先cat id_rsa.pub,然后复制得到的文本(以ssh-开头)。
  • 再打开github,打开个人设置(setting),打开SSH and GPG keysNew SSH key
  • 将复制的文本粘贴进去,再给key取个名字(建议名字包含服务器和用户),Add SSH key。
    进入项目文件夹,手动git pull,这时应该会提示
Are you sure you want to continue connecting (yes/no)?

输入yes,之后就正常pull了,此时.ssh文件夹下就自动生成了known_hosts

编写php脚本

不用php当然也行,用java写个web程序都行,只要能保证能被外网访问到。

<?php
    echo "开始部署<br>";
    chdir("/var/www/blog/usr/themes/handsome");
    exec("git pull 2>&1", $out);
    foreach($out as $v)
    {
        echo iconv( 'GB2312','UTF-8', $v)."<br>";
    }
?>

脚本很简单

  • chdir切换目录
  • exec执行shell命令
  • 2>&1用于标准错误重定向到标准输出,也就是脚本执行错误时也能返回错误信息
  • $out得到命令执行结果并通过echo输出(因为结果为多行时,用数组保存)

布置好脚本后访问一下
QQ截图20190226165929.jpg
成功啦!然后就设置项目仓库的webhook
github上打开项目仓库,Setting - Webhooks - Add webhook

  • Payload URL就填写访问php脚本的地址
  • Secret为Github请求脚本时发送的密码信息,用于校验
    填写好后Add webhook就行了。

使用Secret让脚本更安全

脚本就这样放着肯定不行,如果被人知道了URL,那么谁都可以调用这个脚本了。所以Github提供了校验的方法。
先更改WebhookSecret为任意密码。
QQ截图20190226195130.jpg
然后修改PHP脚本

<?php
    //密钥
    $secret = "123456";//Github项目中对应的Secret
    //获取GitHub发送的内容
    $json = file_get_contents('php://input');
    $content = json_decode($json, true);

    //github发送过来的签名
    $signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
    if (!$signature) {
        return http_response_code(404);
    }

    list($algo, $hash) = explode('=', $signature, 2);
    //计算签名
    $payloadHash = hash_hmac($algo, $json, $secret);
    if ($hash !== $payloadHash){
        return http_response_code(404);
    }

    echo "开始部署<br>";
    chdir("/var/www/blog/usr/themes/handsome");
    exec("git pull 2>&1", $out);
    foreach($out as $v)
    {
        echo iconv( 'GB2312','UTF-8', $v)."<br>";
    }
?>

此时再访问脚本URL,已经报404错误了,随意修改点内容然后push一下,服务端成功修改则证明脚本正常。

看似简单但还是踩了不少坑,主要都是用户权限的问题,在做运维时一定要合理的规划好 用户权限,保证服务器安全

Last modification:October 22nd, 2019 at 06:59 pm
如本文“对您有用”,欢迎随意打赏我,让我坚持创作!

Leave a Comment

3 评论

  1. 阿里云优惠券   Windows 8.1 x64 Edition Windows 8.1 x64 Edition Google Chrome 63.0.3239.132 Google Chrome 63.0.3239.132

    朋友 交换链接吗


    1. Mark 博主   Windows 10 x64 Edition Windows 10 x64 Edition Google Chrome 75.0.3770.142 Google Chrome 75.0.3770.142
      @阿里云优惠券

      暂时不交换了 谢谢


      1. 阿里云优惠券   Windows 8.1 x64 Edition Windows 8.1 x64 Edition Google Chrome 63.0.3239.132 Google Chrome 63.0.3239.132
        @Mark

        ok