PHP获取git提交信意_gitlab实现提交后线上自动更新代码

环境要求:自建的gitlab,php.ini的disabled_functions 中取消shell_exec

实现原理:跟svn的钩子类似,特定的事件git会自动触发相应的脚本.目标脚本进行相关命令执行即可.

方法:

第一步:在gitlab的repo中设置相关参数.如果有多个分支可以设置多个webhook.

以develop分支为例,如果要添加其他分支处理脚本,只需要改动$site_dir即可.

develop.php的内容

ini_set('display_errors', 'on');

error_reporting(E_ALL);

//第一步:允许IP访问判断 这里是gitlab服务器IP

$access_ip = array('115.192.154.145');

//获取ip

$client_ip = $_SERVER['REMOTE_ADDR'];

//验证ip

if ( !in_array($client_ip, $access_ip))

{

exit('ip error');

}

$json = file_get_contents('php://input');

$data = json_decode($json, true);

//fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);//gitlab发送过来的全部数据

//die;

if (isset($data['ref']) && $data['ref']) {

$branch = substr($data['ref'], 11); //获取分支名称(如:refs/heads/develop)

if (!$branch) {

exit;

}

if ($branch == 'develop') {

$site_dir='/data/sites/autoupdate-develop';

//创建日志文件

$logfile = './logs/test_hooks_develop_'.date('Ymd').'.log';

$fs = fopen($logfile, 'a');

//把请求的IP和时间写进log

fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);

fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);

fwrite($fs, 'Branch: '.print_r($branch, true).PHP_EOL);

//执行shell命令并把返回信息写进日志

try{

$output=shell_exec("cd $site_dir && git checkout $branch && git pull origin $branch 2>&1");

fwrite($fs, 'Info:'. $output.PHP_EOL);

fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);

$fs and fclose($fs);

}catch(Exception $e){

fwrite($fs, 'Error:'. $e->getMessage() .PHP_EOL);

throw new Exception("Error Processing Request", 1);

}

}

}else{

exit('no data');

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值