最近接触到gogs比较多,项目是php的,每次更新代码需要推送到git上,还需要到服务器上再git pull 下来比较麻烦,所以就想着怎么能自动的更新代码就方便多了,然后就了解到了 git 钩子 和web 钩子,测试了很多次git钩子,都不成功或者是不理想,主要是git钩子相当于执行的是脚本,脚本和服务器一般必须同处同一服务器,文件权限也得统一,否则就要想办法解决文件权限的问题了,不是专业搞服务器的弄起来也很头疼,所以就剩下webhooks的,果然webhooks不负众望,很好的让我用自己的专业解决问题。
看上面的截图,第一个是gogs的webhooks的设置界面的,推送地址填上能访问到的地址,例如我上面的 http://test.git.com/web_hook.php,事件的话,就一般就选择推送,如果想处理其他的事件,也可以勾选上,下面是git_hook.php的内容,是用php写的,把执行的过程写到日志中,其中要注意的是php要有exec的函数执行,如果执行失败的话,需要检查下php的禁用函数 disable_functions 里面是否有exec,有的话,需要解禁了,当然,可以自己考虑怎么处理这个安全问题。
还需要注意下exec的第二个参数 $output,这个参数类型是数组,执行结果和命令行的相同,不过是每行都是数组中的一个元素,需要单独处理下。
<?php
$fs = fopen('./git_hook.log', 'a');
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").']'.PHP_EOL);
$json = file_get_contents('php://input');
$data = json_decode($json, true);
fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);
fwrite($fs, 'git out start======================================================================='.PHP_EOL);
$res = exec('cd /www/wwwroot/test.git.com && git pull origin master',$output);
foreach($output as $row){
fwrite($fs, $row.PHP_EOL);
}
fwrite($fs, 'git out end======================================================================='.PHP_EOL);
// var_dump($output);
if($res) {
echo 'success';
} else {
echo 'error';
}
把上面的php脚本放到可以执行的位置,脚本中的cd路径也配置正确,脚本的路径访问也没有问题,加上gogs中的webhooks配置也正确的话,你就能看到git推送内容后,就能自动更新代码了,是不是很方便哈。
注意:如果还不成功,最好吧被更新项目下的 .git/config的 url 选项改成账号密码的形式 http://git:git_pass@git.test.com/test.git.com.git