GitHub Webhook 自动化部署
前期准备
启用 shell_exec
编辑 php.ini
shell
vi /usr/local/php/etc/php.ini
查找删除 shell_exec 并保存
shell
/etc/init.d/php-fpm restart
配置站点及权限
查询 php 用户为 www
shell
ps aux | grep php
修改站点目录即仓库目录所有者
shell
chown -R www:www /home/wwwroot/xxxxxxx
确保站点目录内为空,如遇到由 LNMP 创建站点时生成的.user.ini
无法删除,执行以下命令后再次删除.
shell
chattr -i .user.ini
配置流程
切换 www 用户
root 账户登陆,修改 www 登录权限.
shell
vi /etc/passwd
找到
shell
www:x:1003:1003::/home/www:/sbin/nologin
修为改
shell
www:x:1003:1003::/home/www:/bin/bash
为 www 创建 ssh 公钥
切换为 www 登陆
shell
su www
创建 ssh 公钥
shell
ssh-keygen -t rsa
获取 ssh 公钥
shell
cat /home/www/.ssh/id_rsa.pub
首次 git clone 仓库
登陆 GitHub 仓库 - Setting - Deploy keys - Add deploy key
?> 新增 deploy key 粘贴上文获取的 ssh 公钥
验证 ssh 公钥
shell
ssh -T git@github.com
首次 clone 仓库
shell
git clone git@github.com:xxxxxx/xxxxxxx.git
创建 webhook.php
创建 php ,自定义命名,为保证安全可设置为随机名.同时修改keySecret
和wwwRoot
即可.
php
<?php
// 自行创建一个验证密码
$keySecret = 'xxxxxx';
// 修改为你自己的仓库绝对路径
$wwwRoot = [
'/home/wwwroot/xxxx',
];
// 保存运行脚本的日志
$logFile = 'log/webhook.log';
// 执行git命令
$gitCommand = 'git pull';
// 判断是否开启秘钥认证(已实现gitee和github)
if (isset($keySecret) && !empty($keySecret)) {
list($headers, $gitType) = [[], null];
foreach ($_SERVER as $key => $value) {
'HTTP_' == substr($key, 0, 5) && $headers[str_replace('_', '-', substr($key, 5))] = $value;
if (empty($gitType) && strpos($key, 'GITEE') !== false) {
$gitType = 'GITEE';
}
if (empty($gitType) && strpos($key, 'GITHUB') !== false) {
$gitType = 'GITHUB';
}
}
if ($gitType == 'GITEE') {
if (!isset($headers['X-GITEE-TOKEN']) || $headers['X-GITEE-TOKEN'] != $keySecret) {
die('GITEE - 请求失败,秘钥有误');
}
} elseif ($gitType == 'GITHUB') {
$json_content = file_get_contents('php://input');
$signature = "sha1=" . hash_hmac('sha1', $json_content, $keySecret);
if ($signature != $headers['X-HUB-SIGNATURE']) {
die('GITHUB - 请求失败,秘钥有误');
}
} else {
die('请求错误,未知git类型');
}
}
!is_array($wwwRoot) && $wwwRoot = [$wwwRoot];
foreach ($wwwRoot as $vo) {
$shell = sprintf("cd %s && git pull 2>&1", $vo);
$output = shell_exec($shell);
$log = sprintf("[%s] %s \n", date('Y-m-d H:i:s', time()) . ' - ' . $vo, $output);
echo $log;
file_put_contents($logFile, $log, FILE_APPEND);
}
配置 GitHub Webhooks
登陆 GitHub 仓库 - Setting - Webhooks - Add Webhook
- Payload URL 输入 webhook.php 外网链接地址
- Content type 保持默认
- Secret 输入刚才配置
webhook.php
创建的验证密码
恢复关闭 www 登陆权限
exit 退出 www 登陆,再次关闭 www 登陆权限.
shell
vi /etc/passwd
恢复为
shell
www:x:1003:1003::/home/www:/sbin/nologin