<?php
/*
* Coding webhooks自动更新程序
* $log_dir 日志存放目录
* $name 站点标识字符,也是站点目录名称
* $token Coding新版本的webhook若是设置了token,Coding则对每个请求进行了哈希签名,
* 这个签名会放在请求头X-Coding-Signature,在服务器端进行签名解析才能拿到真正数据
* $p_dir 项目根目录
* author: 王小滔
* date: 2020-11-23
*/
$name = $_GET['app'];
$token = 'token2020';
$p_dir = '/www/wwwroot/' . $name;
$log_dir = '/www/wwwroot/webhook/logs/' . $name . '/';
is_dir($log_dir) or mkdir($log_dir, 0777, true);
// 接收Coding post传递的参数
$json = file_get_contents("php://input");
// 从请求头中获取签名
$signature = $_SERVER['HTTP_X_CODING_SIGNATURE'];
// 进行签名解析
$sha1 = hash_hmac("sha1", $json, $token);
$calculate_signature = 'sha1='. $sha1;
// 进行身份验证
if ($calculate_signature !== $signature) {
exit('error request');
}
// 写入更新日志
$data = json_decode($json, true);
if (isset($data['ref']) && isset($data['commits'])) {
if ($data['ref'] == 'refs/heads/master') {
$res = PHP_EOL . "pull start ---------------------------------------------" . PHP_EOL;
$res .= shell_exec("cd {$p_dir} && git checkout -f && git pull origin master 2>&1");
$res_log = '------------------------------------------------------------' . PHP_EOL;
$res_log .= '项目更新,目录:' . $p_dir . PHP_EOL;
$res_log .= $data['sender']['name'] . ' 在 ' . date('Y-m-d H:i:s'). ' 向 ' . $data['repository']['name'] . ' 项目的 ' . $data['ref'] . ' 分支push了 ' . $data['commits']['message'];
$res_log .= $res . PHP_EOL;
$res_log .= "pull end -----------------------------------------------------" . PHP_EOL;
file_put_contents($log_dir . $name . "_" . date('Ymd'). ".txt", $res_log, FILE_APPEND);
}
}