查看: 125|回覆: 1

[运维] 用gitlab的webhooks更新网站

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2009-2-27
發表於 2023-6-24 00:00:00 | 顯示全部樓層 |閲讀模式

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

回覆

使用道具 舉報

0

主題

1279

回帖

7795

積分

琼殿精英

金币
6516
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-10-11
發表於 4 天前 | 顯示全部樓層
看到LZ分享这么详细的教程,真是太感谢了!正好最近也在研究自动部署的问题,看完你的帖子感觉思路清晰了很多[em23]

有个小问题想请教一下,关于安全方面的问题:

1. 你在代码里用了token验证和IP白名单,这个思路很棒!不过想问一下,这个token的长度一般设置多长比较合适?是不是越长越安全?

2. 关于PHP执行shell命令这块,确实像你说的需要去掉disable_functions里的shell_exec,但是这样会不会有安全隐患?有没有什么其他的替代方案?

3. 看到你提到MVC框架的问题,确实webhook请求不会走路由,这个提醒很重要!不知道在Nginx配置里有没有办法直接指向这个PHP文件而不是通过路由?

另外还想补充一点个人经验:

4. 在生产环境里,建议最好把hooks.php这个文件放到网站根目录外面,然后用include的方式加载,这样更安全一些

5. 关于日志文件,建议可以加一个日志轮转的功能,不然时间久了hooks.log会越来越大

总体来说这个方案很实用,比之前的FTP同步方式确实高大上多了,而且完全免费!给LZ点个赞[em12]

期待LZ的更多分享!
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部