码云webhook双分支(master/develop)自动部署生产服/测试服

实现原理
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 "[email protected]"
然后就是设置密码了,不设置就一直回车
生成完毕, 查看公钥
cat ~/.ssh/id_rsa.pub
将此id_rsa.pub公钥拷贝到码云进行绑定,再回到终端测试一下ssh -T [email protected]
还可以再简单配置一下:
git config --global user.name "kentrl"
git config --global user.email "[email protected]"

如果出现错误,就需要开启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 [email protected]: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 = '[email protected]';
                //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<&1");
        $res .= shell_exec("cd {$dir} && git clean -df && git fetch --all");
        $res_log = '------------------------------------------------------------' . PHP_EOL;
        $res_log .= '站点更新,目录:' . $dir . PHP_EOL;
        $res_log .= $data['user_name'] . ' 在 ' . date('Y-m-d H:i:s') . ' 向 ' .
            $data['repository']['name'] . ' 项目的 ' . $data['ref'] . ' 分支push了 ' .
            $data['total_commits_count'] . ' 个commit:' . $data['commits']['message'];
        $res_log .= $res . PHP_EOL;
        $res_log .= 'pull end -----------------------------------------------------' . PHP_EOL;
        file_put_contents($logdir . $name . '_' . date('Ymd') . '.txt', $res_log, FILE_APPEND);
        shell_exec("cd {$dir} && git reset --hard origin/{$branch}");   //重置指针
    }

你可能感兴趣的:(环境搭建,其他技巧,webhook,自动部署)