1 准备工作

好的 不废话直接入题 首先我们要使用一款支持webhook的托管平台(如Github、coding、码云等),要先熟悉git代码操作,当然能想看如何自动部署的 应该都对git有一定了解了。我们还要清楚服务器上是哪个用户要使用git,这个很重要 不然你会因为配置 代码都一样 可是一直失败的尴尬情况 哈哈哈。

2 仓库搭建 代码准备

线上仓库搭建就略过了 都懂的哈。现在是以我的个人网站 及 coding 为例 建议都使用SSH 我比较喜欢这种一次配置终身享用 关键是稳好吧。
然后关键代码来了 在本地将下面代码编写PHP文件(以hook.php为例)放入项目根目录一起 push 到coding仓库

<?php
error_reporting(1);
//本地仓库路径
$local = '服务器端仓库的绝对路径';
$json = file_get_contents('php://input');
if (!$json) {
   header('HTTP/1.1 400 Bad Request');
   die('HTTP HEADER or POST is missing.');
}
$token = '567eXXXXXXXXXXXXXXXXb98dd'; //coding配置的token
// 从请求头中获取签名
$signature = $_SERVER['HTTP_X_CODING_SIGNATURE'];
// 进行签名解析
$sha1 = hash_hmac("sha1",$json,$token);
$calculate_signature = 'sha1='.$sha1;

// 如果启用验证,并且验证失败,返回错误
if ($calculate_signature !== $signature) {
   header('HTTP/1.1 403 Permission Denied');
   die('Permission denied.');
}
// 如果仓库目录不存在,返回错误
if (!is_dir($local)) {
  header('HTTP/1.1 500 Internal Server Error');
  die('Local directory is missing');
}

echo shell_exec("cd {$local} && git pull 2>&1"); 
die("done " . date('Y-m-d H:i:s', time()));

3 服务器端操作

首先要确认的是服务器端要谁操作 当然你也可以指定用户 这边最快的是使用whoami 使用下面代码 web端访问应用 查看是要谁操作

<?php
   $output = shell_exec('whoami');  //记得要开启shell_exec函数
   echo "<pre>$output</pre>";die;

然后知道了是要谁(以www为例)操作就好办了 若www无法登录 需要先配置可登录

[root@izwz9gchhrqf6m8bcs57c4z ~]# vim /etc/passwd

找到www用户 将/sbin/nologin 改为 /bin/bash 再进入要访问的路径下(这边以/www/wwwroot/为例)
请输入图片描述

[root@izwz9gchhrqf6m8bcs57c4z wwwroot]# mkdir craon.cn

请输入图片描述
创建空文件夹 并且所有者给www用户 切换到 www 用户 这步很重要 如果没有配置公钥的 切换到www用户后要先配置好公钥 并且在coding上也填写。

[root@izwz9gchhrqf6m8bcs57c4z wwwroot]# su www
bash-4.2$ git clone ssh:仓库  craon.cn

最后在coding端再填写 webhook 将地址填写为对应的能访问到 hook.php 配置的token要与上面配置的一同。最后ping一下通了的话 再尝试本地提交 若本地提交coding 对应的线上版本有pull 就大功告成了。

4 总结

记得要切换到 www 用户 要先在 www 用户登录下生成git公钥
放置项目的文件夹得有所有权 记得记得记得先开启shell_exec函数