Github Service Hooks:通过PHP接收后

时间:2013-02-19 17:37:46

标签: php git github nginx git-post-receive

我遇到了一些通过服务挂钩部署的问题,我认为这是权限问题,但我会先说明所有事实。

服务器: Nginx在Arch Linux上使用PHP-FPM

Nginx以用户http身份运行,并拥有要由脚本更新的目录的所有权。我还为HTTP创建了一个SSH密钥并将其安装在GitHub上。其他命令似乎通过shell_exec工作得很好,但我无法完成重置或拉动,并且没有输出任何输出。任何帮助,将不胜感激。谢谢!

钩子脚本(PHP):

if ( isset($_SERVER["REMOTE_ADDR"]) )    { 
    $requestIP = $_SERVER["REMOTE_ADDR"]; 
} else if ( isset($_SERVER["HTTP_X_FORWARDED_FOR"]) )    { 
    $requestIP = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
} else if ( isset($_SERVER["HTTP_CLIENT_IP"]) )    { 
    $requestIP = $_SERVER["HTTP_CLIENT_IP"]; 
}

// GitHub post-receive IPs
$validIPs = array(
    '207.97.227.253',
    '50.57.128.197',
    '180.171.174.178'.
    '50.57.231.61',
    '54.235.183.49',
    '54.235.183.23',
    '54.235.118.251',
    '54.235.120.57',
    '54.235.120.61',
    '54.235.120.62'
);

if(($payload = $_REQUEST['payload']) && in_array($validIps, $requestIP)) {
    $payload = json_decode($payload);
    $repository = $payload->repository->name;
    $docRoot = '/var/www/'.escapeshellcmd($repository);

    if(is_dir($docRoot)) {
        $command = 'cd '.$docRoot.' && git reset --hard HEAD && git pull';
        $output = shell_exec( $command );
        file_put_contents("hook.log", "$repository: $output\r\n", FILE_APPEND);     
    }
}

1 个答案:

答案 0 :(得分:2)

您应该检查命令运行的环境.Git可能不在环境使用的路径中。

如果是这种情况,你可以使用它的完整路径名运行git。