Coding项目webhook自动更新部署PHP源代码

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

 

上一篇:2021-03-22


下一篇:Git操作 两个平台