测试服务器下,我个人觉得每一次commit之后,都要去pull一下,确实是一件比较烦的事情。
于是为了更加便捷的同步服务代码,webhook无法就是你的最佳选择。
每次 push 代码后,都会给远程 HTTP URL 发送一个 POST 请求。
1、仓库地址使用ssh例如:[email protected]:xxxxx/project.git
2、在gitee或者github上的对应的项目添加你的部署公钥
3、在gitee或者github上的对应的项目添加WebHook对应的url和访问秘钥
//访问秘钥
$keySecret = '^!@KVzPZ^DaRNA7R53353%7aEAfsfdOptH7b%0i5';
//需要更新的项目目录
$wwwRoot = [
'/www/wwwroot/test1',
'/www/wwwroot/test2',
];
//保存运行脚本的日志
$logFile = 'log/layuimini-githook.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);
}
由于使用webhook出发回调访问的时候是,运行的是php-fpm
的执行用户,例如我的是www
,可使用ps -ef
,查看对应进程的执行用户。
修改项目目录权限chown -R www:www 项目路径
如果提示下方这两点,就是公钥问题
[2019-09-21 14:03:27] Could not create directory '/home/www/.ssh'.
Host key verification failed.
fatal: Could not read from remote repository.
[2019-09-21 14:11:00] Host key verification failed.
fatal: Could not read from remote repository.
1、使用php-fpm
执行用户www
进行登录
2、进入\home\www
目录下执行ssh-keygen -t rsa -C "[email protected]"
3、把id_rsa.pub
内的公钥信息拷贝出来,在gitee或者github上的对应的项目添加你的部署公钥
建议自动更新只使用在测试服务器上。