最近在应用收费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)     ALLwww    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和工夫写进logfwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);//验证ipif ( !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);}//如果有须要 能够关上上面,把传送过去的信息写进logfwrite($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_PATHecho "pulling source code..."sudo /usr/bin/git fetch --allsudo /usr/bin/git reset --hard origin/mastersudo /usr/bin/git clean -fsudo /usr/bin/git pullecho "changing permissions..."sudo chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATHsudo chmod -R 0755 $WEB_PATHecho "Finished."

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

下面设置结束就能够去测试下了,我测试的是胜利的,如果你没有胜利就应用定时器的形式吧