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

    技术2025-01-06  25

    实现原理 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最新版本

    <?php /* * 码云webhooks自动更新程序 * 根据不同分支来自动更新正式站/测试站 * $logdir 日志存放目录 * $name 站点标识字符,多站点方便区分日志 * $password 码云设置的访问密码 */ $json = file_get_contents("php://input"); $data = json_decode($json,true); $password = '********'; //这里替换为你的密码 if ($data['password'] != $password) { //$subject = '请注意:服务器webhook的密码配置错误!'; //$content = '请注意:服务器webhook的密码配置错误!gitee设定的密码是:'.$data['password']; //$to = 'kentrl@qq.com'; //mail($to, $subject, $content); die('Password id error!'); } if (isset($data['ref']) && $data['total_commits_count'] > 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<&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}"); //重置指针 }
    Processed: 0.009, SQL: 9