网站首页 » PHP » gitee 使用webhook PHP 做代码自动部署

gitee 使用webhook PHP 做代码自动部署

April 27, 2022 PHP

1、设置相关

1.1、仓库使用ssh模式clone到本地

1.2、仓库添加部署公钥

2、服务器配置

2.1、切换到PHP-FPM运行账户,无法切换时修改 /etc/passwd

2.2、使用PHP-FPM运行账户生成gitee指定的公钥

ssh-keygen -t ed25519 -C "[email protected]" 

2.3、将公钥部署到gitee项目的公钥配置中

2.4、测试公钥是否成功

ssh -T [email protected]

3、PHP代码

<?php 
/**
 * 自动更新钩子
 * 修改密钥及项目路径即可使用
 **/
//以流的方式读取
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
    die('send fail');
}
$requestBody = json_decode($requestBody,true);
//加密字符串
$secret_post = $requestBody['sign'];
//时间戳参数,单位毫秒级
$time_stamp = $requestBody['timestamp'];
//在WebHooks签名密钥一栏填写的密钥信息
$access_token = 'key';
//加密文档
//https://gitee.com/help/articles/4290
$secret_join = $time_stamp . "\n" . $access_token;
$base64 = base64_encode(hash_hmac('sha256', $secret_join, $access_token, true));
//看推送的是哪个分支就构建哪个分支
//如有需要可以更改规则,比如屏蔽某些分支不构建
$branch = str_replace('refs/heads/', '', $requestBody['ref']);
$requestBody = null;
// 打开网站目录下的hooks.log文件 需要在服务器上创建 并给写权限
$fs = fopen('/log_dir/logs/hook/'.date('Ymd').'.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 [{$base64}]" . 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 == 'dev_2022_login') {
//这里防止本地修改后更新失败,添加git重置本地修改
    exec('cd /dir/ && git reset --hard HEAD && git pull 2<&1;',$output);
    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);
}