实现原理
1.本地push到码云
2.码云WebHook 通过http请求发送到我们自己的服务器
3.服务器收到请求,pull托管的代码
步骤一:在服务器生成www用户公钥,(www用户与nginx为同一用户,Nginx修改在此不描述)
需要用www的身份创建公钥,不然会在使用git时验证失败
cat /etc/passwd | grep www
发现它的shell是"/sbin /nologin" 需要将起改成"/bin/bash"才能切换www登录
vim /etc/passwd
修改完毕后, 保存
su www
cd ~/.ssh
rm -rf ./*
ssh-keygen -t rsa -C "kentrl@qq.com"
然后就是设置密码了,不设置就一直回车
生成完毕, 查看公钥
cat ~/.ssh/id_rsa.pub
将此id_rsa.pub公钥拷贝到码云进行绑定,再回到终端测试一下ssh -T git@gitee.com
还可以再简单配置一下:
git config --global user.name "kentrl"
git config --global user.email "kentrl@qq.com"
如果出现错误,就需要开启www用户登陆 (创建完公钥后记得把www修改回原来的权限,例如这里的/sbin/nologin)
修改www登录的方法:
vim /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin把最后面的/sbin/nologin改为/bin/bash
结果:
www:x:1000:1000::/home/www:/bin/bash即可实现用www登录,不用了再改回去
步骤二:在服务器克隆代码
进入项目目录 (用www用户身份)
git clone git@gitee.com:kentrl_admin/hy.git//这里你应该填写你自己的仓库
如果你想长期记住密码
git remote add origin http://您的账号:你的密码@gitee.com/您的项目地址.git
如果你想自定义记住的时间,可以这样:
git config credential.helper 'cache --timeout=3600'//这里记住的是1小时, 单位是秒
修改.git文件夹为www用户组
chown www:www -R .git
步骤三:git分支合并时忽略hook文件
在项目根目录下新建文件.gitattributes,写入需要忽略的(文件名 merge=ours)
hook.php merge=ours#忽略合并hook.php,一行一个(记得换行)
.gitignore merge=ours#忽略.gitignore
info.php merge=ours#忽略info.php
如果设置了没有起效,在根目录下运行命令行 git config merge.ours.driver true进行config配置
如果之前其他的代码导致失败, 可以尝试一下下面的代码
git pull origin master --allow-unrelated-histories//这条指令是告诉Git允许合并不相关历史的内容
把www用户调整为不可登陆
su root
vi /etc/passwd
www:x:1001:1001::/home/www:/sbin/nologin//www的用户改为nologin
最后把webhook文件上传到服务器的develop开发目录
webhook每次请求的只有开发目录(测试服),只是pull到的目录不同, 所以hook文件只需上传到develop就可以了
开发时,对于本地的项目中修改不做保存操作, 可以用到Git pull的强制覆盖,具体代码如下:
git clean -df丢弃所有 untracked(未追踪) 的文件
git fetch --all下载远程仓库最新内容,不做合并
git reset --hard origin/develop或者: git reset --hard origin/master把HEAD指向master最新版本
git pull //可以省略
git fetch 指令是下载远程仓库最新内容,不做合并
git reset 指令把HEAD指向master最新版本
0) {
switch ($data['ref']) {
case 'refs/heads/develop':
$name = 'hydev_yyzzu';
$dir = '/www/wwwroot/hydev_yyzzu';
$logdir = '/www/wwwlogs/webhook_logs/hydev_yyzzu/';
$branch = 'develop';
break;
case 'refs/heads/master':
$name = 'hy_yyzzu';
$dir = '/www/wwwroot/hy_yyzzu';
$logdir = '/www/wwwlogs/webhook_logs/hy_yyzzu/';
$branch = 'master';
break;
default:
//$subject = "请注意:服务器代码checkout失败!";
//$content = "服务器checkout代码失败,您push的分支没有在git-hook脚本中设置对应的分支!请立即更新。";
//$to = 'kentrl@qq.com';
//mail($to, $subject, $content);
die('checkout branch error!');
}
is_dir($logdir) || mkdir($logdir, 0777, true);
$res = PHP_EOL . 'pull start ---------------------------------------------' . PHP_EOL;
//$res .= shell_exec("cd {$dir} && git pull origin {$branch} 2