运维手动pull的状态图:
要实现服务器自动pull的状态图:
因业务需要服务器都在阿里云上,并且代码也存在阿里云代码库中,代码库提供了WebHooks功能,目前需要实现的是开发者在本地push
代码到阿里云代码库中,服务器能自动根据push
动作将最新的代码git pull
到服务器环境中
一、部署WebHooks
在前段web服务器的某个可访问的域名(这里以http://job.abc.com为例)根目录下新建webhooks.php文件,内容如下:
<?php
#将服务器网站目录赋值给变量www_file
$www_file='/var/www/apps';
#以可写权限打开git_new.log文件,用于记录git日志
$fs = fopen('/home/shell/git_new.log', 'a');
fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);
#获取请求端的IP
$client_ip = $_SERVER['REMOTE_ADDR'];
#将时间与请求端IP写入日志文件
fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);
#执行shell命令cd到网站根目录执行git pull操作并把返回信息赋值给变量output
$output=shell_exec("cd $www_file && git pull 2>&1");
#将日志信息写入日志文件中
fwrite($fs, 'Info:'. $output.PHP_EOL);
fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);
#关闭日志文件
$fs and fclose($fs);
?>
修改PHP配置
因为webhooks用到的php代码中使用了 shell_exec 函数,一般配置php会禁止这个函数,需要打开 shell_exec 函数;
修改前端web服务器上php.ini的 disable_functions 列表,去掉 shell_exec;
重启php-fpm服务
重要操作
目前nginx
与php
都是用www
用户运行,因此触发以上php脚本时会验证/home/www/.ssh
目录的的密钥,因此如果没有此目录或者目录中没有.ssh
,并且git
一直都是用root
用户去操作的,在这需要做多两步操作:
$ cp -rf /root/.ssh /home/www/
$ cp -rf /root/.gitconfig /home/www/
二、配置阿里云code
以上步骤都完成后即可在开发者的电脑上push
一段代码上阿里代码库,然后查看下服务器上有没有执行git pull
操作了,如有错误可在/home/shell/git_new.log
文件中查看相关报错日志
最后记录网上一篇较全的脚本:
<?php
//网站目录
$www_file='/home/www/test/';
//打开网站目录下的hooks.log文件,需要在服务器上创建,并给写权限
$fs = fopen('/home/www/test/hooks.log', 'a');
fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);
//自定义字串掩码 用于验证
$access_token = 'QhNO8YHqym5PHQQsexapF7041xOhzm62DRH';
//接受的ip数组,也就是允许哪些IP访问这个文件 这里是gitlab服务器IP
$access_ip = array('192.168.1.15','14.xxx.xxx.19');
//如果使用www.xxx.com/xxx.php?token=xxxxxxx 的方式来传送验证字符串,则用这个方法获取
# $client_token = $_GET['token'];
// 获取请求端的secret token
$client_token = $_SERVER["HTTP_X_GITLAB_TOKEN"];
//获取请求端的IP
$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 pull 2>&1");
fwrite($fs, 'Info:'. $output.PHP_EOL);
fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL);
$fs and fclose($fs);
?>
如文章对您有帮助,请打开支付宝扫码领取红包,就当做对作者的支持,谢谢