资讯专栏INFORMATION COLUMN

git不同分支push之后通过hook自动部署到服务器不同路径

huaixiaoz / 3228人阅读

摘要:我想做的是这么一件事每创建一个新分支,之后自动部署的服务器的不同路径,然后根据不同端口访问不同分支的代码,以方便进行该分支的测试。各个分支自动部署到不同路径。首先完成自动部署这里我用的是码云来做的。

我想做的是这么一件事:git 每创建一个新分支,push之后自动部署的服务器的不同路径,然后根据不同端口访问不同分支的代码,以方便进行该分支的测试。

并且我正在学习 thinkphp 5 呢,正好测试一下。

举个栗子来说就是:当我新建了一个分支为 8081_opqnext_test,然后完成了某个功能。git add、git commit、当 git push 之后,服务器会自动拉取 8081_opqnext_test 分支上的代码到 /data/tp/8081 这个目录里,然后 访问 beta.tp.opqnext.com:8081 就会直接访问到该分支的代码。同理,当我创建看一个 8082_user_list 的分支。完成了用户列表的功能。git push 之后服务器会自动创建目录 /data/tp/8082 并且将代码到 pull 到该目录。当你访问 beta.tp.opqnext.com:8082 的时候,会访问到该分支的代码便于测试。那 master 的代码每次合并之后 都会自动部署到 /data/tp.opqnext.com/ 访问 tp.opqnext.com 即线上的代码。

然后我们分开步骤来说:

首先完成自动部署功能。

各个分支自动部署到不同路径。

访问不同的端口映射到不同的分支代码。

首先完成自动部署

这里我用的是 码云 git@oschina 来做的。

首先需要配置 ssh公钥,看这里:

特别提醒的是:你的 nginx 是用哪个用户跑的,那么在生产公钥之前先要切换到该用户下。比如我 nginx 是 ngxuser 用户,假如你在 root 下生产公钥并且配置到码云,你的hook是没有权限 clone 和 pull 代码的/(ㄒoㄒ)/~~

你可以按如下命令来生成sshkey:

sudo ngxuser  # 你的nginx用户
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"

# Generating public/private rsa key pair...
# 三次回车即可生成 ssh key

查看你的 public key,并把他添加到码云(Gitee.com)

cat ~/.ssh/id_rsa.pub
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....

添加后,在终端(Terminal)中输入

ssh -T git@git.oschina.net

若返回

Welcome to Git@OSC, yourname!

则说明添加成功,然后去 码云后台 添加你的 ssh key

然后去配置 webhook 查看教程 配置完成 webhook 之后,你每次 push 之后就会触发这个钩子。最简单的,你写一个 auto_deploy_code.php 放到网站根目录。内容是:

";
system("git pull", $var);

不用接收 webhook 给你发过来的数据,你只管 pull ,假如你只有一个分支的话。

但是我要接收呢,既然有了数据,当然要接收。

我创建了一个新的分支,这个分支名称可以规定好,比如:8081_opqnext_user (端口-开发者-开发功能)这里怎么约定,那你后面的脚本就怎么写呗。

自动部署的脚本:

".date("H:i:s"));
        } else {
            if(!is_dir($dir)){
                mkdir($dir,0777,true);
                $cmd = "cd $dir; git clone -b $branch git@git.oschina.net:opqnext/thinkphp.git $dir";
            } else {
                $cmd = "cd $dir; git pull origin $branch";
            }
            shell_exec($cmd);
            error_log("auto_git_pull ".$res["push_data"]["user_name"]." ".$branch." msg:".$res["push_data"]["commits"][0]["message"]." =>".date("H:i:s"));
        }
    } else {
        // 删除分支
        $cmd = "cd /data/tp; rm -rf $port";
        shell_exec($cmd);
        error_log("auto_git_del_branch ".$res["push_data"]["user_name"]." ".$branch." =>".date("H:i:s"));
    }
}

首先检测 token 是否正确,获取分支名称,截取端口号,填写端口完整路径。
如果 commit 信息有内容,说明判断分支是否为 master 如果是就拉线上代码,如果是分支 commit 检测端口路径是否存在,存在即 pull 否则 clone 没了。

既然各个分支的目录都已经创建好了,代码也可以自动部署了。那再配置 nginx 就可以了,我本来以为可以写一个类似于正则匹配,匹配到哪个端口就去访问对应的路径,但是貌似不行,所以只能写多个 server 监听不同的端口,配置相应的路径。

比如 8081,8082,8083,8084...

每个开发者三五个端口,不错了。大概就是这样一个理论。我发现我写代码从来都是道理基本通,但是不能用...如果你要用的话,再修改修改就 beautiful 了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40547.html

相关文章

  • gitlab + php自动部署

    摘要:起因某种原因不能使用于是用写了一个自动部署脚本项目介绍用写的部署脚本可配置源代码目录目标目录缓存目录用来部署后删除忽略目录文件他们在本地的变化不会被部署支持可配置版本库和分支支持一个同时往多个目录部署支持手动在命令行触发支持网页界面操作 Summer-PHP-Deploy 起因 某种原因, 不能使用Jenkins, 于是用PHP写了一个自动部署脚本 项目介绍 用PHP写的部署脚本 可...

    The question 评论0 收藏0
  • GitLab CI/CD 在 Node.js 项目中的实践

    摘要:近期在按照业务划分项目时,我们组被分了好多的项目过来,大量的是基于的,也是我们组持续在使用的语言。部署环境强依赖本地,因为需要在本地建立仓库的临时目录,并经过多次的方式完成部署上线的操作。 近期在按照业务划分项目时,我们组被分了好多的项目过来,大量的是基于 Node.js 的,也是我们组持续在使用的语言。 现有流程中的一些问题 在维护多个项目的时候,会暴露出一些问题: 如何有效的使用...

    Profeel 评论0 收藏0
  • git webhooks 实现自动拉取代码

    摘要:而利用的功能,能够让我们省去这一步,下面我就以码云的为例,实现服务端的代码自动同步部署。查看是哪个用户执行该命令参考文章使用脚本远程部署项目利用实现自动部署代码码云通过实现自动同步代码部署执行系统外部命令函数 当进行开发的环境在本地,而运行的环境要在服务端时,每一次提交代码都需要在服务端pull一次。而利用git的hooks功能,能够让我们省去这一步,下面我就以码云的webhooks为...

    marek 评论0 收藏0
  • 搭建Git务器、编写自动部署脚本

    摘要:搭建服务器编写自动部署脚本今天试了下在服务器上搭建服务器,并且编写一个简单的自动部署脚本。好了,试试吧原文连接搭建服务器编写自动部署脚本更多分享知识点请扫码关注 搭建Git服务器、编写自动部署脚本 showImg(https://segmentfault.com/img/bVbs9fB?w=675&h=221); 今天试了下在linux服务器上搭建Git服务器,并且编写一个简单的自动部...

    jollywing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<