PHP使用WebHook自动更新Git仓库部署

其名 -
PHP使用WebHook自动更新Git仓库部署

最近在使用免费git仓库,每次 push 了代码之后还要去手动 pull,很麻烦就准备配置下webhook。
我们的开发语言是 PHP,所以就使用PHP 的 shell_exec 来执行 shell 脚本,下面就简单说下配置流程。

修改 www 用户执行权限

因为 nginx + php 都是 www 用户来执行的,而且 www 一般都配置为不允许 ssh 登录的。那么就需要更改下 www 的执行权限了,这个配置是在 /etc/sudoers 配置文件中设置,找到 root ALL=(ALL) ALL,在这个下面添加如下配置,对于这个权限的设置如果不明白就要咨询下运维的童鞋了,我这里只是简单的演示配置:

root    ALL=(ALL)     ALL
www    ALL=(ALL)     NOPASSWD:ALL
编写 webhook.php

webhook 这个可以根据使用的不同的 git 仓库(Gitee、Github、coding、阿里云code...)配置,大致内容就是校验IP、校验签名、校验hook事件类型等,我这里只配置了推送事件才会触发 hook,所以就没有对事件进行校验

<?php
//打开网站目录下的hooks.log文件,需要在服务器上创建,并给写权限
$fs = fopen(__DIR__.'/hooks.log', 'a');
fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);

//自定义字串掩码 用于验证,这个可能是sign、access_toke、password
$sign= '123456';
//接受的ip数组,也就是允许哪些IP访问这个文件
$access_ip = array('127.0.0.1');
//获取请求端的IP
$client_ip = $_SERVER['REMOTE_ADDR'];
//把请求的IP和时间写进log
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);

//验证ip
if ( !in_array($client_ip, $access_ip))
{
    fwrite($fs, "client_ip error 503,Invalid ip [{$client_ip}]".PHP_EOL);
    exit(0);
}

//获取请求端发送来的信息,具体请求方式和数据格式要查看对应的文档
$json = file_get_contents('php://input');
$data = json_decode($json, true);

if (strcmp($data['sign'], $sign) !== 0) {
    fwrite($fs, "sign error 503,Invalid ip [{$client_ip}]".PHP_EOL);
    exit(0);
}

//如果有需要 可以打开下面,把传送过来的信息写进log
fwrite($fs, 'Data: '.var_export($data, true).PHP_EOL);
// 执行 shell 进行更新,也可以手动更新或者定时器更新,其实为了安全,建议定时器更新
$output = shell_exec('/usr/bin/bash /home/www/webhook.sh');
fwrite($fs, 'Info:'. var_export($output,true).PHP_EOL);

fwrite($fs,PHP_EOL. '================ Update End============='.PHP_EOL.PHP_EOL);
$fs and fclose($fs);
编写 webhook.sh
#!/bin/bash
 
WEB_PATH='/www/gitproject'
WEB_USER='www'
WEB_USERGROUP='www'
echo "Start ..."
cd $WEB_PATH
echo "pulling source code..."
sudo /usr/bin/git fetch --all
sudo /usr/bin/git reset --hard origin/master
sudo /usr/bin/git clean -f
sudo /usr/bin/git pull
echo "changing permissions..."
sudo chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
sudo chmod -R 0755 $WEB_PATH
echo "Finished."

刚在在 /etc/sudoers 中配置了 www,所以这里使用 sudo

上面设置完毕就可以去测试下了,我测试的是成功的,如果你没有成功就使用定时器的方式吧
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

php介绍

PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。

Tags 标签

phpgitwebhooks

扩展阅读

加个好友,技术交流

1628738909466805.jpg