首页 > 开源中国Git PUSH钩子部署PHP程序

开源中国Git PUSH钩子部署PHP程序

我的代码托管在开源中国得Git库里,想使用Git钩子来实现程序的部署,写了一个程序接受钩子的post的数据,但是不能实现程序的部署。。代码如下:

public function index(){
        $logger = new KLogger(LOG_PATH.'KLogger');

        $web_root_dir = APP_PATH;  // /var/www/site

        if(IS_POST){
            $payload = $_POST;
            $payload = json_decode($payload['hook']);
            $logger->info('data from git post...', $payload); 

            // if (!empty($payload['password'])){
                $command = "cd {$web_root_dir} && git pull";
                $logger->info('enter if .....');
                $result = exec($command);
                $logger->info('command execute result...'.$result); 

            // }
        }

    }

在程序里记录了日志,能接收到post数据,但是命令执行不成功,下面是log的内容:

[2015-05-05 2:07:34.114928] [INFO] data from git post...
    password: '123456'
    push_data: stdClass::__set_state(array(
         'before' => '7a563d4498371a8572a88ff22fb726ac7f8dd467',
         'after' => 'f24b208ddb520b1349fca6a5a0295db516b3982b',
         'ref' => 'refs/heads/master',
         'user_id' => 120469,
         'user_name' => '',
         'repository' => stdClass::__set_state(array(
             'name' => '',
             'url' => '',
             'description' => '',
             'homepage' => '',
        )),
         'commits' => array(
            0 => stdClass::__set_state(array(
                 'id' => 'f24b208ddb520b1349fca6a5a0295db516b3982b',
                 'message' => 'a',
                 'timestamp' => '2015-05-05T02:07:35+08:00',
                 'url' => 'http://git.oschina.net/commit/f24b208ddb520b1349fca6a5a0295db516b3982b',
                 'author' => stdClass::__set_state(array(
                     'name' => '',
                     'email' => '',
                )),
            )),
        ),
         'total_commits_count' => 1,
    ))
[2015-05-05 2:07:34.115142] [INFO] enter if .....
[2015-05-05 2:07:35.482580] [INFO] command execute result...

http://blog.skyx.in/archives/158/

可能是权限问题


我一般不用钩子,麻烦还维护,需要部署的地方执行这个脚本

#! /bin/bash
while true
do
    git pull
    sleep 5
done

当然,如果你的程序还需要针对代码更新做一些其他操作,这个就不好用了.


贴自己写的一个简单的小脚本,配置一些信息既可以实现题主功能,能够简单的记录信息到log。

<?php
/**
 * Class Main
 * @url https://git.oschina.net/edvard_hua2/PHP-WebHook-Script.git
 * @author Edward
 * @time 2015.08.23 08:13
 */

/**
 * format var_dump
 * @param void $varVal 
 * @param str $varName 
 * @param bool $isExit 
 */
function dump($varVal, $isExit = FALSE){
    ob_start();
    var_dump($varVal);
    $varVal = ob_get_clean();
    $varVal = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $varVal);
    echo '<pre>'.$varVal.'</pre>';
    $isExit && exit();
}

/**
 * @param str $msg
 */
function writeLog($msg){
    date_default_timezone_set("Asia/Shanghai");
    file_put_contents('log.txt',"\r\n".date("h:i:sa").': '.$msg,FILE_APPEND|LOCK_EX);
}

/**
 * @see http://php.net/manual/en/function.proc-open.php
 */
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);

$postData = json_decode($_POST['hook'],true);
if($postData['password'] !== '##You Password##'){
    writeLog('un-authorization request:'.$_SERVER['HTTP_HOST']);
    die;
}

$username = '##You Username##';
$password = '##You Password##';

$cwd = '####';  //The initial working dir for the command. This must be an absolute directory path
$projectSuffix = '##owner##/##project_name##.git';
$branch = '##Branch Name##';

$updateUrl = 'https://'.$username.':'.$password.'@git.oschina.net/'.$projectSuffix;
$process = proc_open('git pull '.$updateUrl.' '.$branch,$descriptorspec,$pipes,$cwd,NULL);
if(is_resource($process)){
    $output = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
}
$return_value = proc_close($process);

if($return_value == 0){
    writeLog('Command success: '.$postData['push_data']['after'].'\r\n'.$output);
}else
    writeLog('Command faild.');

?>
【热门文章】
【热门文章】