Skip to content

GitHub Webhook 自动化部署

前期准备

启用 shell_exec

编辑 php.ini

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

查找删除 shell_exec 并保存

shell
/etc/init.d/php-fpm restart

配置站点及权限

查询 php 用户为 www

shell
ps aux | grep php

修改站点目录即仓库目录所有者

shell
chown -R www:www /home/wwwroot/xxxxxxx

确保站点目录内为空,如遇到由 LNMP 创建站点时生成的.user.ini无法删除,执行以下命令后再次删除.

shell
chattr -i .user.ini

配置流程

切换 www 用户

root 账户登陆,修改 www 登录权限.

shell
vi /etc/passwd

找到

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

修为改

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

为 www 创建 ssh 公钥

切换为 www 登陆

shell
su www

创建 ssh 公钥

shell
ssh-keygen -t rsa

获取 ssh 公钥

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

首次 git clone 仓库

登陆 GitHub 仓库 - Setting - Deploy keys - Add deploy key

?> 新增 deploy key 粘贴上文获取的 ssh 公钥

验证 ssh 公钥

shell
ssh -T git@github.com

首次 clone 仓库

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

创建 webhook.php

创建 php ,自定义命名,为保证安全可设置为随机名.同时修改keySecretwwwRoot即可.

php
<?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 仓库 - Setting - Webhooks - Add Webhook

  • Payload URL 输入 webhook.php 外网链接地址
  • Content type 保持默认
  • Secret 输入刚才配置webhook.php创建的验证密码

恢复关闭 www 登陆权限

exit 退出 www 登陆,再次关闭 www 登陆权限.

shell
vi /etc/passwd

恢复为

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