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

以下操作均在Centos7上进行

为Apache或Nginx配置用户和组

这里以Apache为例,已经配置了的请绕道。
[scode type="lblue"]合理的配置用户权限,才能规避一系列的权限问题,也能保证服务器的安全。[/scode]
首先是创建用户和组,在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输出(因为结果为多行时,用数组保存)

布置好脚本后访问一下

访问.jpg

成功啦!然后就设置项目仓库的webhook
github上打开项目仓库,Setting - Webhooks - Add webhook

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

使用Secret让脚本更安全

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

secret.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一下,服务端成功修改则证明脚本正常。

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