开源中国Git PUSH钩子部署PHP程序
阿神
阿神 2017-05-02 09:19:58
0
3
785

我的代码托管在开源中国得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...
阿神
阿神

闭关修行中......

répondre à tous(3)
漂亮男人

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

C'est peut-être un problème d'autorisations

漂亮男人

Je n'utilise généralement pas de hooks. C'est difficile à maintenir. J'exécute ce script partout où il doit être déployé

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

Bien sûr, si votre programme doit également effectuer d'autres opérations pour les mises à jour du code, cela ne sera pas utile.

左手右手慢动作

Publier un simple petit script que j'ai écrit, configurer certaines informations peut non seulement réaliser la fonction du sujet, mais peut également simplement enregistrer les informations dans le journal.

<?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.');

?>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!