Maison > Questions et réponses > le corps du texte
我的代码托管在开源中国得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...
漂亮男人2017-05-02 09:21:58
http://blog.skyx.in/archives/158/
C'est peut-être un problème d'autorisations
漂亮男人2017-05-02 09:21:58
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.
ringa_lee2017-05-02 09:21:58
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.');
?>