WebHooks 实现远程项目的自动部署
环境说明
- Github 或 Gitee 维护的网站代码(支持 Webhooks);
由于 Github 访问速度受限,易出现超时问题,我使用 Gitee 部署代码 - Linux 公网服务器(阿里云、腾讯云、华为云等);
服务器操作环境为 CentOS 7.6 64bit - 远程服务器环境安装:
git@1.8.3.1
,Nginx@1.20.1
,PHP@5.6
前期准备
- 克隆项目代码文件夹,通过 Nginx 或宝塔面板建立可用的网站
- 远程服务器的 PHP 代码是由 www 用户运行的,所以一切操作建立在 www 用户之上
- 安装好 PHP 模块以后,还需要对 PHP 的
php.ini
进行更改,删除disable_functions
下的exec
、shell_exec
,这样才能在webhooks.php
文件中执行脚本命令

生成和配置公钥
开启 www 用户
命令:
vim /etc/passwd
配置:把
sbin/nologin
修改为bin/bash
生成公钥
因为我们已经开始了 www 登录权限,那么在生成公钥之前,需要切换到 www 账户下,命令:su www
- 切换用户:
su www
- 生成公钥:
ssh-keygen -t rsa -C "{email}"
- 默认回车即可 - 查看公钥:
cat ~/.ssh/id_rsa.pub
- 其他账户下不可见,只有切换到 www 可见

配置公钥(Gitee)
- 地址:https://gitee.com/profile/sshkeys
- 配置:把你通过
cat ~/.ssh/id_rsa.pub
查看到的公钥,配置到这里即可,如下:

- 有了这个公钥的配置,通过
webhooks.php
中的脚本指令就可以自动拉取代码了
配置 Webhooks
从 Gitee 克隆下来的代码文件中,有一个名为 webhooks.php
的文件,它是用于处理 Gitee 回调时拉取 Gitee 对应代码库的脚本文件。
对 webhooks.php
文件进行如下配置:
<?php
/**
* Git webhooks 自动部署脚本
* 地址:https://github.com/LiuPiPiPi/liupipipi.github.io/settings/hooks
*/
// 接收post参数
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
exit('data null!');
}
// Content type = application/json
$content = json_decode($requestBody, true);
// 验证 Webhooks 配置的 Secret,也可以不验证
/*if (empty($content['password']) || $content['password'] != '123456') {
exit('password error');
}*/
// 项目存放物理路径,也就是站点的访问地址
$path = "/home/www/Blog-Hexo/";
// 判断需要下拉的分支上是否有提交,我们这里的分支名称为 master
if ($content['ref'] == 'refs/heads/master') {
// 执行脚本 git pull,拉取分支最新代码
$res = shell_exec("cd {$path} && git pull origin master 2>&1"); // 当前为www用户
// 记录日志 ($content 返回的是一整个对象,可以按需获取里面的内容,写入日志)
$res_log = '------------------------->' . PHP_EOL;
$res_log .= '用户 ' . $content['pusher']['name'] . ' 于 ' . date('Y-m-d H:i:s') . ' 向项目【' . $content['repository']['name'] . '】分支【' . $content['ref'] . '】PUSH ' . $content['commits'][0]['message'] . PHP_EOL;
$res_log .= $res . PHP_EOL;
// 追加方式,写入日志文件
// file_put_contents("git_webhook_log.txt", $res_log, FILE_APPEND);
}
// shell_exec("cd {$path} && git pull origin master 2>&1");
echo 'webhooks connect done!';
添加 Webhooks
在网站代码的 Gitee 管理页面,进入设置 -> Webhooks 添加 Webhooks 请求,URL 填写 webhooks.php
文件的远程地址。

查看日志:

到这里 Webhooks 回调函数自动部署就成功实现。Webhooks 也可以通过宝塔面板自动配置,详细操作见下方链接。
宝塔面板自动配置 Webhooks 参考文章:php宝塔面板webhook使用
WebHooks 实现远程项目的自动部署
http://lpxz.work/posts/24049/