github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks

简介: github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks

gitee.com/kotlindev/P…

www.bilibili.com/video/av456…

01ebd755782e4c909dad0843d3544acf.jpeg

01ebd755782e4c909dad0843d3544acf.jpeg

配置这个网址

http://415.759.288.189:8123/webhook/hook.php

<?php
// 允许请求IP gitee请求的时候会打印
$allowIpArr = [
    'gitee的ip'
];
// 请求密码 你的密码
$password = 'tsdsdaf_asdf_fsd1234123sdf';
// 检测IP
if (!in_array($_SERVER['REMOTE_ADDR'], $allowIpArr)) {
    echo '非法IP:' . $_SERVER['REMOTE_ADDR'];
    exit(0);
}
// 获取请求参数
$headers = getallheaders();
$body = json_decode(file_get_contents("php://input"), true);
// 验证提交分支是否为master
if (!isset($body['ref']) || $body['ref'] !== 'refs/heads/master') {
    echo '非主分支' . $body;
    exit(0);
}
// 验证提交密码是否正确
if (!isset($body['password']) || $body['password'] !== $password) {
    echo '密码错误';
    exit(0);
}
// 验证成功,拉取代码
$path = $body['project']['path'];
$command = 'cd /usr/www/' . $path . ' && git pull 2>&1';
$res = shell_exec($command);
//$body['sender']['email'],// 将邮件发送给发送者
//$body['repository']['owner']['email']// 将邮件发送给仓库所有者
//$message = $body['head_commit']['message'];// 提交信息
//$datetime = date('Y-m-d H:i:s', $body['timestamp'] / 1000);// 时间
//$pusher = $body['pusher']['name'];// 提交人
//$name = $body['project']['name'];// 项目名
//$path = $body['project']['path'];// 路径
// 返回结果
echo 'git pull执行结果:' . $res;

//另外一种方法:签名秘钥

<?php
//本地路径
$local = '/www/wwwroot/otc';
//签名验证
$headers = getallheaders();
$gitee_token = $headers["X-Gitee-Token"];
$gitee_timestamp =$headers["X-Gitee-Timestamp"];
echo "gitee_token: $gitee_token <br />\n";
echo "gitee_timestamp: $gitee_timestamp <br />\n";
$sign_key = "LEreKhDjwoN8aZ8L";
$sec_str = "$gitee_timestamp\n$sign_key";
$compute_token =  base64_encode(hash_hmac('sha256', $sec_str,$sign_key,true));
echo "computetoken: $compute_token <br />\n";
if($compute_token!=$gitee_token){
    die('sign is not right');
}
shell_exec("cd {$local} && sudo git pull 2>&1");
die('done ' . date('Y-m-d H:i:s', time()));

//第3种签名秘钥 指定分支

<?php
/**
 * 自动更新钩子
 * 修改密钥及项目路径即可使用
 **/
//以流的方式读取
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
    die('send fail');
}
//file_put_contents('./requestBody.log', $requestBody);
$requestBody = json_decode($requestBody,true);
//加密字符串
$secret_post = $requestBody['sign'];
//时间戳参数,单位毫秒级
$time_stamp = $requestBody['timestamp'];
//在WebHooks签名密钥一栏填写的密钥信息
$access_token = 'abcdefg';
//加密文档
//https://gitee.com/help/articles/4290
$secret_join = $time_stamp . "\n" . $access_token;
//file_put_contents('./join.log', $secret_join);
$base64 = base64_encode(hash_hmac('sha256', $secret_join, $access_token, true));
//file_put_contents('./base64.log' , $base64);
//看推送的是哪个分支就构建哪个分支
//如有需要可以更改规则,比如屏蔽某些分支不构建
$branch = str_replace('refs/heads/', '', $requestBody['ref']);
$requestBody = null;
// 打开网站目录下的hooks.log文件 需要在服务器上创建 并给写权限
$fs = fopen('/tmp/deploy_webhooks_pull.log', 'a');
fwrite($fs, date('Y-m-d H:i:s') . ' ================ Update Start ===============' . PHP_EOL);// 请求ip
$client_ip = $_SERVER['REMOTE_ADDR'];
// 把请求的IP和时间写进log
fwrite($fs, date('Y-m-d H:i:s') . ' Request on [' . date("Y-m-d H:i:s") . '] from [' . $client_ip . ']' . PHP_EOL);
// 验证token 有错就写进日志并退出
if ($base64 !== $secret_post) {
    fwrite($fs, date('Y-m-d H:i:s') . " Invalid token [{$client_token}]" . PHP_EOL);
    $fs and fclose($fs);
    header("HTTP/1.1 404 Not Found");
    header("Status: 404 Not Found");
    exit;
}
// 如果有需要 可以打开下面,把传送过来的信息写进log 可用于调试,测试成功后注释即可
// fwrite($fs, 'Data: ' . print_r($data, true) . PHP_EOL);
// 执行shell命令并把返回信息写进日志
if($branch == 'master') {
}else {
  $branch = 'master';
}
//www/wwwroot/garfield 项目目录
$output = shell_exec('cd /www/wwwroot/garfield/; git pull origin ' . $branch . ' 2<&1; chown -R www:www /www/wwwroot/garfield/*;');
fwrite($fs, date('Y-m-d H:i:s') . 'Info:' . print_r($output, true) . PHP_EOL);
fwrite($fs, date('Y-m-d H:i:s') .  '================ Update End ===============' . PHP_EOL . PHP_EOL);
$fs and fclose($fs);
// 调试时打开
 echo json_encode($output);


目录
相关文章
|
4天前
github克隆代码加速
github克隆代码加速
7 2
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败
Request请求转发和重定向的资源路径问题,目录到底加不加,取决于浏览器用,还是服务器用,规避项目目录发生修改,导致重定向失败
|
6天前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
13 3
|
5天前
|
Java Maven
springboot项目打jar包后,如何部署到服务器
springboot项目打jar包后,如何部署到服务器
18 1
|
3天前
|
Shell 开发工具 git
如何使用git上传代码github仓库
如何使用git上传代码github仓库
|
4天前
|
安全 关系型数据库 MySQL
本地项目无法连接阿里云服务器MYSQL---轻量应用服务器篇
本地项目无法连接阿里云服务器MYSQL---轻量应用服务器篇
14 0
|
5天前
|
弹性计算 缓存 监控
云效将项目代码部署到云服务器ECS
云效支持一键和手动部署,一键部署因其高效、一致性和可重复性而受青睐,但也存在灵活性不足和初期设置复杂的挑战。优化方向包括简化脚本、提供选项、完善文档、集成监控和回滚机制。一键部署步骤概括为:准备云效项目和ECS,配置项目和环境,编写部署脚本,设置一键部署,测试脚本,审核发布,监控结果,及后续维护。实际操作应参照云效最新文档。
15 0
|
9天前
|
安全 Java Linux
从零开始搭建服务器之更加优雅地部署项目(2)
从零开始搭建服务器之更加优雅地部署项目
|
9天前
|
应用服务中间件 Linux nginx
从零开始搭建服务器之更加优雅地部署项目(1)
从零开始搭建服务器之更加优雅地部署项目
|
9天前
|
弹性计算 关系型数据库 MySQL
阿里云ECS如何部署并运行一个JavaWeb项目
阿里云ECS如何部署并运行一个JavaWeb项目
36 0