通过gitlab的webhook进行项目自动部署的作用,本地提交代码后自动同步到服务器。避免每次重复登录服务器pull代码
1、php运行环境修改
修改php.ini 中disable_functions 将exec,system删掉。或者将disable_functions注释掉
2、建立钩子php文件
新建文件gitlab_webhook.php
<?php
/* security */
$access_token = 'MmNmMGWERQeowTerEnljoERmMGIRTRYiEy=';
//ip地址为gitlab服务器请求地址
$access_ip = array({server});
/* get user token and ip address */
$client_token = $_REQUEST['token'];
$client_ip = $_SERVER['REMOTE_ADDR'];
//查询服务器运行的php-fpm用户和文件所属权限是否一致
//print_r($_SERVER);
//文件记录日志
/* create open log */
$fs = fopen('./webhook.log', 'a');
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);
/* test token */
if ($client_token !== $access_token)
{
echo "error 403";
fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);
exit(0);
}
/* test ip*/
if ( ! in_array($client_ip, $access_ip))
{
echo "error 503";
fwrite($fs, "Invalid ip [{$client_ip}]".PHP_EOL);
exit(0);
}
//git push 时触发的json数据,可参考gitlab中web_hooks介绍
/* get json data */
$json = file_get_contents('php://input');
$data = json_decode($json, true);
/* get branch */
$branch = $data["ref"];
fwrite($fs, '======================================================================='.PHP_EOL);
/* if you need get full json input */
//fwrite($fs, 'DATA: '.print_r($data, true).PHP_EOL);
/* branch filter */
if ($branch === 'refs/heads/master')
{
/* if master branch*/
fwrite($fs, 'BRANCH: '.print_r($branch, true).PHP_EOL);
fwrite($fs, '======================================================================='.PHP_EOL);
$fs and fclose($fs);
/* then pull master */
system("cd {projects} && git checkout master");
system("git pull");
} else {
/* if devel branch */
fwrite($fs, 'BRANCH: '.print_r($branch, true).PHP_EOL);
fwrite($fs, '======================================================================='.PHP_EOL);
$fs and fclose($fs);
/* pull devel branch */
system("cd {projects} && git checkout develop");
system("git pull origin develop:develop");
}
?>
3、gitlab中设置webhook
在gitlab的Webhooks内设置url链接。追加token参数与程序校验时使用,其他参数可以自己选择,点击“AddWebhook”后
可以点击“test hook”
通过ssh查看服务器,可以看到项目目录下webhook.log文件。证明Webhook配置成功,如果代码更新成功Ok,否,继续4、权限调试
4、权限调式
1、首先确认执行php程序的用户,可以用
ps aux | gerp php-fpm 查看
可以
var_dump($_SERVER)
;
可以
通过phpinfo()查看
最终确保,php、nginx、项目目录输入同一用户。
5、配置deploy key
# sudo -u www ssh-keygen -t rsa
...
#cat /home/www/.ssh/id_rsa.pub
将此公钥拷贝到gitlab中的Deploy Keys中保存
测试能否成功即可,权限问题最容易出问题
参考文档:
GitLab-webhook-PHP 详解 GitLab Webhooks 自动部署应用服务器