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);


目录
相关文章
|
8天前
|
自然语言处理 编译器 应用服务中间件
PHP在服务器上的运行过程
PHP在服务器上的运行过程
27 7
|
6天前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
23 3
|
21天前
|
PHP 开发者
PHP作为一门流行的服务器端脚本语言,深入理解PHP的命名空间
【10月更文挑战第22天】PHP作为一门流行的服务器端脚本语言,自1995年诞生以来,已经发展了二十多年。在这二十多年的时间里,PHP经历了多次重大版本的更新,不断增加新特性和改进。其中,命名空间(Namespace)是PHP 5.3.0引入的一个重要特性,它为PHP的代码组织和重用提供了一种新的方式。本文将从三个部分深入理解PHP的命名空间:一是命名空间的基本概念和作用;二是PHP命名空间的使用方法;三是通过实例讲解命名空间的应用。
25 4
|
23天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
195 2
|
2月前
|
域名解析 关系型数据库 MySQL
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
该文章指导如何使用PHPEnv搭建本地PHP开发环境,并通过一个简单的"Hello World"程序演示从安装到运行的全过程。
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
43 3
|
1月前
|
前端开发 Java Shell
后端项目打包上传服务器部署运行记录
后端项目打包上传服务器部署运行记录
31 0
|
1月前
|
Java Linux Maven
服务器部署之项目打包及命令行输出
服务器部署之项目打包及命令行输出
24 0
|
2月前
|
JavaScript Linux 开发工具
如何将nodejs项目程序部署到阿里云服务器上
该文章详细描述了将Node.js项目部署到阿里云服务器的步骤,包括服务器环境配置、项目上传及使用PM2进行服务管理的过程。
|
关系型数据库 应用服务中间件 PHP