服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - 服务器知识 - 用gitlab的webhooks更新网站

用gitlab的webhooks更新网站

2023-08-06 10:48小编 服务器知识

git有hooks钩子,但不太喜欢用ftp或者http方式同步更新其他服务器的网站。所以选择了gitlab,因为gitlab有webhooks。github也有webhooks,不过github太高富帅了,还是自己搭一个gitlab,安全又放心,关键是免费。 操作过程如下: 我的是php 要放在服务器上的目录: /home/wwwroot/mysite 在项目跟目录下面新建一个hooks.php,

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

操作过程如下:

我的是php

要放在服务器上的目录: /home/wwwroot/mysite

在项目跟目录下面新建一个hooks.php,输入以下代码

//网站目录
  
$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端了

有个问题说明一下,对于MVC来说,gitlab的请求并不会走路由,所以不要用路由方式来加这个文件

接着登陆网站服务器

$ vi /etc/passwd

查看这个文件,然后查看www的根目录

我这里是 /home/www

运行which git 我这里得到 /usr/local/bin/git

记住这两个目录

接着把gitlab中项目的ssh key对应的秘匙id_rsa放入/home/www/.ssh里

.ssh需要700的权限

$ chmod -R 700 .ssh

接着给网站目录www权限

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

进入网站目录

cd /home/wwwroot/mysite

初始化git 并设置权限

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

接着配置git

$ git remote add origin

完成上面的操作后就可以手动自行第一次pull操作了 从远程获取

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

最后进入gitlab中项目settings设置 在web hooks里

URL写

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服务就可以了

延伸 · 阅读

精彩推荐