用gitlab的webhooks更新网站

sunny Linux1 14,2875字数 2252阅读7分30秒阅读模式

git有hooks钩子,但不太喜欢用ftp或者http方式同步更新其他服务器的网站。所以选择了gitlab,因为gitlab有webhooks。github也有webhooks,不过github太高富帅了,还是自己搭一个gitlab,安全又放心,关键是免费。

操作过程如下:文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

我的是php文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

要放在服务器上的目录: /home/wwwroot/mysite文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

在项目跟目录下面新建一个hooks.php,输入以下代码文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

//网站目录
  
$www_file='/home/wwwroot/mysite/';
  
//打开网站目录下的hooks.log文件 需要在服务器上创建 并给写权限
  
$fs = fopen($www_file.'hooks.log', 'a');
  
fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);
  
//自定义字串掩码 用于验证
  
$access_token = 's7kjjhh8767laq29KLJK9089883hjjkgfdrrpipoinmw';
  
//接受的ip数组,也就是允许哪些IP访问这个文件 这里是gitlab服务器IP
$access_ip = array('8.8.8.8');
  
//获取请求端的ip和token
  
$client_token = $_GET['token'];
$client_ip = $_SERVER['REMOTE_ADDR'];
  
//把请求的IP和时间写进log
  
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);
  
//验证token 有错就写进日志并退出
if ($client_token !== $access_token)
{
echo "error 403";
fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL);
exit(0);
}
  
//验证ip
if ( !in_array($client_ip, $access_ip))
{
echo "error 503";
fwrite($fs, "Invalid ip [{$client_ip}]".PHP_EOL);
exit(0);
}
  
//获取请求端发送来的信息,具体格式参见gitlab的文档
  
$json = file_get_contents('php://input');
$data = json_decode($json, true);
  
//如果有需要 可以打开下面,把传送过来的信息写进log
//fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL);
  
//执行shell命令并把返回信息写进日志
  
$output=shell_exec("cd $www_file && git checkout master && git pull origin master 2>&1");
fwrite($fs, 'Info:'. $output.PHP_EOL);
  
fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);
  
$fs and fclose($fs);

做完这些后,就可以push到gitlab端了文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

有个问题说明一下,对于MVC来说,gitlab的请求并不会走路由,所以不要用路由方式来加这个文件文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

接着登陆网站服务器文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

$ vi /etc/passwd

查看这个文件,然后查看www的根目录文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

我这里是 /home/www文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

运行which git 我这里得到 /usr/local/bin/git文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

记住这两个目录文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

接着把gitlab中项目的ssh key对应的秘匙id_rsa放入/home/www/.ssh里文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

.ssh需要700的权限文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

$ chmod -R 700 .ssh

接着给网站目录www权限文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

$ chown -R www:www /home/wwwroot/mysite

进入网站目录文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

cd /home/wwwroot/mysite

初始化git 并设置权限文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

$ git init
$ chmod -R g+s .git
$ chown -R www:www .git

接着配置git文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

$ git remote add origin

完成上面的操作后就可以手动自行第一次pull操作了 从远程获取文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

sudo -u www /usr/local/bin/git pull origin master

最后进入gitlab中项目settings设置 在web hooks里文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

URL写文章源自运维生存时间-https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/

http://www.mysite.com/hooks.php?token=s7kjjhh8767laq29KLJK9089883hjjkgfdrrpipoinmw
这里的token要和你在hooks.php的token一致

做完这些以后就可以pull了,做一次提交,看是不是同时自动更新了网站

最后:如果web hooks不能正常工作的话,可以看下hooks.log看下执行的信息

补充两个问题:

1.在手动创建/home/www/.ssh 文件夹后,不能忘了改变这个文件夹的所有者,不然会出现无法写入know_hosts的问题

$chown -R www:www /home/www/.ssh

2.因为代码中使用到了shell_exec这个函数,一般配置php的时候都禁止了,需要打开shell_exec

在php.ini的disable_functions 的列表里删除shell_exec

再重新启动php-fpm服务就可以了

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
sunny
  • 本文由 发表于 25/10/2015 01:38:35
  • 转载请务必保留本文链接:https://www.ttlsa.com/linux/using-gitlab-webhooks-update-website/
评论  1  访客  1
    • 到此一游
      到此一游 9

      git pull origin master 这句话主要作用是什么?对于git不甚了解,请指点一下

    评论已关闭!