利用阿里CODE或码云的Webhooks功能,实现开发者push代码后服务器自动pull代码

运维手动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服务

重要操作

目前nginxphp都是用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);

?>

如文章对您有帮助,请打开支付宝扫码领取红包,就当做对作者的支持,谢谢
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Benson_xuhb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值