PHP项目在coding使用WebHook自动部署时,git pull出现了下面的问题
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
一开始在网上查了,基本都是说删除~/.ssh/known_hosts
文件,
然而并没有用,因为我删除的并不是执行git pull用户的known_hosts文件
搞了我两天,原来是用户的问题,下面是我的解决方法:
由于对linux不太熟悉,我都快给搞炸了,会linux的应该都是小意思。
1.查看执行git pull命令的用户
//PHP代码
exec("cd ~ && cd - && cd -", $output);//跳到用户目录,再回刚刚的目录,然后跳到用户目录
print_r($output);//输出
//cd -命令是返回刚刚目录并输出
//不要使用who命令,因为并不一定是它执行git pull的
//反正我就是给它搞晕了,看用户目录就可以知道是哪个用户执行的了
//我的who命令是root用户,而cd -命令的用户目录是www用户
输出的信息是:
Array ( [0] => /home/wwwroot/apche/web,
[1]=> /home/www )
//[0]是我自己的项目路径
//[1]是我自己的用户目录,所以执行git pull的是www用户
2.切换到www用户su www
切换成功请跳过这步
如果出现错误,那应该是禁止shell登陆了(如果你是远程连接服务器的话)
//linux命令
vi /etc/passwd
//进入编辑后,找到下面这行,把最后面的改为/bin/bash
例:www:x:1001:1001:,,,:/home/www:/xxx/xxx
www:x:1001:1001:,,,:/home/www:/bin/bash
//然后就可以切换用户su www了
/*
结束后,建议把最后面的改为/usr/bin/git-shell
禁止shell登陆,但是可以执行git命令
*/
3.重新添加ssh公钥
剩下的步骤就是创建公钥,然后coding绑定公钥的一些基本步骤了
//linux命令
cd ~
rm -rf .ssh
ssh-keygen -t rsa -C "xxx@xx.com"
//然后就是设置密码了,不设置就一直回车
//上面的命令分别是 1.进入用户目录。2.删除.ssh目录。3.创建公钥
//接着继续
cat .ssh/id_rsa.pub
//会输出你的公钥,复制到coding绑定公钥即可,然后就可以去测试你的了
绑定好之后,到要自动部署的目录
git init
git remote add 别名 项目地址
git pull 别名 分支
//第一次连接会要你输入yes
然后就可以了。
下面的自动部署是我复制别人代码,忘记哪里复制的了。。。
class Git
{
public function push()
{
// 项目仓库文件夹路径
$dir = '/home/wwwroot/app';
// Coding新版本的webhook若是设置了token,Coding则对每个请求进行了哈希签名
// 这个签名会放在请求头 X-Coding-Signature,在服务器端我们需要进行签名解析才能拿到真正数据
// token验证令牌,与Coding webhook上设置的一致,用于与Coding进行身份验证,防止恶意提交代码
$token = '';
// 从请求头中获取签名
$signature = $_SERVER['HTTP_X_CODING_SIGNATURE'];
// 接收Coding post传递的参数
$json_post = file_get_contents('php://input');
// 进行签名解析
$sha1 = hash_hmac("sha1",$json_post,$token);
$calculate_signature = 'sha1='. $sha1;
// 进行身份验证
if ($calculate_signature !== $signature) {
exit(json_encode(['error'=>'error request']));
}
// shell_exec()即PHP用于执行系统命令的函数
// cd $dir:进入上面设置的项目仓库文件夹中
// git checkout -f 撤销本地的修改
// git pull origin master 从Coding的项目仓库dev分支拉取最新代码,注意origin为远程仓库的别名,要与 git remote add 远程仓库
// 别名 仓库地址 中的远程仓库别名保持一致
exec("cd $dir && git checkout -f && git pull news dev 2>&1", $output);
// exec("cd ~ && cd - && cd -", $output);
exit(json_encode($output));
}
}
网友评论