V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
gy0624ww
V2EX  ›  git

请教大家有关 git 工作流的问题

  •  
  •   gy0624ww · 2020-09-11 10:26:57 +08:00 · 5725 次点击
    这是一个创建于 1567 天前的主题,其中的信息可能已经有所发展或是发生改变。

    工作中遇到的情景是这样的

    多人开发同一个项目,比如有 ABC 三个需求。(有可能涉及更改同一个文件) 这三个需求是提出间隔比较短,有一段时间是并行一起开发的,同时参与测试,但是上线日期可能不同。

    首先,从 master 拉出各自的分支。每个人各自现在自己的本地环境开发,做完后把各自的分支打包到测试环境给测试。 测试人员也是多名,但是目前测试机就只有 1 台。

    现在的问题就是前后端分离,后端是 go,打包的名字都叫 main,都是 80 转发到某一个端口(项目固定比如 8080 ) 前端一套环境,后端一套,然后多个需求就会面临 A 需求有时候就会把 B 需求的 main 覆盖掉才能进行测试。

    不知道大家有没有遇到这种情况,都是怎么处理的。

    之前想过大家都把分支合到一个测试分支 比如 develop,但是这个分支包含了多个需求,有可能不同需求直接会相互影响,测试测完之后,要根据上线的顺序再手动把改的代码合并到 master,这样容易出错,而且手动合并到分支也会造成版本记录的丢失。

    也有想过每个需求都单独部署个独立的端口给前端,那么前端也需要同样根据不同需求部署多套,显然这样也很麻烦。

    请大佬解惑

    46 条回复    2020-09-12 17:07:30 +08:00
    lululau
        1
    lululau  
       2020-09-11 10:35:35 +08:00
    最好就是各个分支分别对应独立的测试环境啊,如果条件限制只有一个环境,那就只能 merge 到一个分支上测试,不同分支上代码之间可能存在的逻辑冲突你只能容忍, 这不是技术问题,这是个基本的逻辑问题吧
    monkeylyf
        2
    monkeylyf  
       2020-09-11 10:37:42 +08:00
    听上去并不是 git 流程的问题。试着让前端可以通过修改配置文件等手段监听不同的端口吗?这样就不需要覆盖了。
    如果 ABC 三个需求会造成 conflict, 合并到测试分支时解决 conflict 还是合并到 master 解决 conflict,conflict 始终存在。如果需求之间没有什么关系,那肯定是分别做 3 个 PR 来做 master merge 会更清晰点。
    gy0624ww
        3
    gy0624ww  
    OP
       2020-09-11 10:39:45 +08:00
    @lululau 先不考虑逻辑冲突的问题,如果合并到一个分支测试,怎么上线呢。B 需求要上线了,A 还没测完。这时候得手动摘出来到上线分支吧,那么之前的版本就丢失了啊,而且手动摘如果需求大而复杂的话不保证出错?
    taogen
        4
    taogen  
       2020-09-11 10:40:16 +08:00 via iPhone
    个人观点:测试可以直接使用各个需求分支进行测试,当需求测试通过后,统一合并到唯一的测试分支
    gy0624ww
        5
    gy0624ww  
    OP
       2020-09-11 10:43:13 +08:00
    @monkeylyf 如果前端只是改配置文件的话,只有一个环境,还是测试只能同时测 1 个需求。现在是多个测试同时分别测 ABC 三个需求,那么就要多个前端环境了。来回部署环境费时费力,感觉不是正道

    而且上面说了,3 个 PR,前提是这 3 个 PR 都给测试同时测,那么怎么独立环境,又绕回去了
    monkeylyf
        6
    monkeylyf  
       2020-09-11 10:44:42 +08:00
    @gy0624ww 似乎你已经知道答案了。
    gy0624ww
        7
    gy0624ww  
    OP
       2020-09-11 10:45:17 +08:00
    @taogen 前后端分离的,单独部署的,前端就一套对应后端多个分支,也只是同一时间测一个需求啊
    那只能前端也版本控制,后端也版本控制。但是测试服务器就 1 台,测试 A 测试切 A 分支,测试同学 B 就测不了了
    gy0624ww
        8
    gy0624ww  
    OP
       2020-09-11 10:45:54 +08:00
    @monkeylyf 👀 不知道啊。。。
    gy0624ww
        9
    gy0624ww  
    OP
       2020-09-11 10:46:35 +08:00
    我觉得这个是普遍存在的问题,就像知道各位是怎么处理,我借鉴下
    KuroNekoFan
        10
    KuroNekoFan  
       2020-09-11 10:49:41 +08:00
    确实是普遍存在的问题,如果不能确保不同开发者之间同一时间只修改不同的业务,那就只能创建 N 个测试环境了
    taogen
        11
    taogen  
       2020-09-11 10:54:13 +08:00 via iPhone
    @gy0624ww 多个测试要同时测试多个需求,那只能前后端每个需求各部署一套(不同端口)。一台测试服务器支撑不了多套应用部署,就加服务器。
    tealover007
        12
    tealover007  
       2020-09-11 11:03:08 +08:00
    把这三个相关的需求分给一个开发呗,反正不是不能同时上线吗,这样就避免冲突了,这个开发根据上线的优先级顺序进行开发。
    另外,没有本地测试通过的代码不能提交——这个基本约定可以保证程序正常运行。
    gy0624ww
        13
    gy0624ww  
    OP
       2020-09-11 11:05:56 +08:00
    @tealover007 开发肯定自测才提交的,但是有些特殊的边界情况还得测试来测啊。 就一个项目分给一个人不现实啊,其他人干啥去。。
    gy0624ww
        14
    gy0624ww  
    OP
       2020-09-11 11:06:36 +08:00
    @taogen 那一个需求就一台测试服务器也不现实啊
    ismumu
        15
    ismumu  
       2020-09-11 11:07:41 +08:00
    你这个问题啊,充钱就能解决
    lplk
        16
    lplk  
       2020-09-11 11:15:22 +08:00
    使用 docker 部署,a,b,c 需求分别对应不同的端口,行不行
    soulmt
        17
    soulmt  
       2020-09-11 11:15:34 +08:00
    有时候有些难缠的问题还是得靠人来解决,要么需求合并,要么测试排序, 搞在一起只会更乱。
    robot1
        18
    robot1  
       2020-09-11 11:27:31 +08:00
    如 1 楼所说 确实逻辑问题 事情要有先后
    weakish
        19
    weakish  
       2020-09-11 11:45:05 +08:00
    要让测试环境部署不麻烦(容器化),这样无论是同时只有一个环境(内部说一下,一个测好了就切到另一个,测完在切下面一个或切回去)还是多个环境都不麻烦。
    594duck
        20
    594duck  
       2020-09-11 14:06:27 +08:00
    典型的瞎理解 敏捷开发造成的版本控制 问题.

    楼主你自己画一个版本控制图,类似这样的 http://img.mukewang.com/55768d5e00016c4b12400430.png

    你看看你画的出来么。按照你的逻辑从 Master 分出来的,还要随时测,全挤一个点上去了,工程性上行不通。

    哪怕是敏捷开发也不能这么瞎搞

    当然你要强行瞎搞也行,一台服务器安装 crtix xenserver 虚拟机,虚拟出几台前端,你们瞎开发,测试瞎部署同时跟着瞎测。

    然后如果是三个开发做三个版本对应一个测试就是群殴,怎么个群殴法呢。

    办公室是不停的叫唤(甲,测试快测我的。乙,测试你测我的不要理甲 。丙,测试这包华子拿去,你先测我的别理那二个傻 x)

    你要知道在软件工程里,不能这么干的。

    你自己后面的回复已经把答案说守了。

    至于某个教你用 Docker 解决的,或者后面叫你用 K8s 的,建议你加入特别关注好好看看他们平时是干什么活的。需求和工程都不理解 瞎扯
    gy0624ww
        21
    gy0624ww  
    OP
       2020-09-11 14:40:19 +08:00
    @594duck 可是需求场景就是这样的啊,现实情况哪允许你一个一个开发。你的意思是需求 A 测完先上线的,把代码再合到 master 和其他测试分支,是么。
    gy0624ww
        22
    gy0624ww  
    OP
       2020-09-11 15:32:54 +08:00
    @594duck 我现在就是想知道有没有这种情况的最佳实践,根据大家的经验,权衡各种因素,就这么做最合理
    goodboy95
        23
    goodboy95  
       2020-09-11 15:41:17 +08:00
    话说我们这里是有 develop, release, master 三个大分支,后端每一个需求开一个 feature 分支,做完一些就合到 develop,前端去对接。开发这边感觉没问题,而且剩余时间足够,大概率能发版了,就合到 release 让测试去测。

    一般情况下,release 不会有太大问题,稍微改改就能合 master (改的时候一般在 feature 上改,改完再合到 develop 和 release )。

    如果真的有太大问题了,某一个 feature 没法上 master 了,那就把能上 master 的 feature 合到 master 发版。

    发完版之后,删掉原来的 release,在 master 上切出一个新的 release 分支。
    594duck
        24
    594duck  
       2020-09-11 17:18:50 +08:00 via iPhone
    @gy0624ww 你这系统没做 soa 吧。
    MaxFang
        25
    MaxFang  
       2020-09-11 19:21:52 +08:00
    感觉可以从管理上来缓解这个问题呀。
    A B C 是否是要在一次发布上发布,是的话,可以切一个公共 feature 分支 X,ABC 都合上去,使用 X 分支测试;不是话,就按功能发布顺序测试,假如是 A 先发布,就 A 分支先测试和主分支发布,B 发布前肯定是要合并主分支的代码整个测试的,有冲突也是 B 来解决。

    如果功能涉及到可能冲突的,肯定要么是合并一起测试,要么是发布一个再合并测试下一个呀。
    Still4
        26
    Still4  
       2020-09-11 19:46:28 +08:00
    不是可以本地环境开发吗,那就在哪开发在哪起服务测啊
    公用测试机会有问题,我改完代码要重启,其他人功能测一半怎么办
    gy0624ww
        27
    gy0624ww  
    OP
       2020-09-11 20:02:13 +08:00
    @MaxFang 不考虑冲突问题,测试是同时测的,环境分前端和后端。
    flyBlackElephant
        28
    flyBlackElephant  
       2020-09-11 20:38:38 +08:00
    这个应该不是 git 工作流问题,而是多版本测试环境管理的问题

    1 、该种情况在我们公司的处理方案是通过 docker 搭建多个测试环境,不同测试环境的域名不一致(使用通配域名),例如 test1 、test2 。根据访问域名的不同,来指向不同的测试环境进行测试。
    2 、另外关于环境中的前后端问题:
    2.1 不同测试环境有测试需求所涉及的代码仓库,将仓库分支切到开发分支即可
    2.2 如果使用的前端都是 master,可以将该仓库的访问打到一个公共地址对应的仓库上去(避免每个仓库都存在相同的代码)
    shilianmlxg
        29
    shilianmlxg  
       2020-09-11 21:56:09 +08:00 via iPhone
    之前遇到个问题,两个同事共同用到一个文件,而且每个人都把这个文件改的面目全非,相当于每一行都有改动,merge 合并错误,请问下这种情况怎么处理呢
    MarioLuo
        30
    MarioLuo  
       2020-09-11 23:12:42 +08:00 via Android
    @shilianmlxg 只能手动解决冲突,相关开发沟通下,类似的情况也会发生在代码重构时,尽量避免同时存在多个差异过大的分支
    MarioLuo
        31
    MarioLuo  
       2020-09-11 23:19:55 +08:00 via Android
    推荐用同一个测试分支,小需求又独立,出现冲突手动处理下问题也不大。长久考虑整两套测试环境,内网台式机搭建便宜
    358515041
        32
    358515041  
       2020-09-12 00:09:38 +08:00 via Android
    TFS 路过…
    sampeng
        33
    sampeng  
       2020-09-12 00:52:59 +08:00 via iPhone
    楼上的都没提到一个问题,从工程性来说。分开测,你怎么保证三个功能没互相影响?就凭一张嘴还要测试干什么?合并在一起再测一遍?我认为在测试中,一个项目有且仅有一个环境即可。
    sampeng
        34
    sampeng  
       2020-09-12 00:56:47 +08:00 via iPhone
    我虽然是运维,我也支撑多环境部署。但我也曾经是开发。从整个工程链路的全盘角度来说,多分支测试浪费大量的人力物力只是为了满足测试方赶紧完成自己的工作任务,满足开发结束提测休息。那全局来看,谁来管整个项目质量到底如何呢?
    yangbonis
        35
    yangbonis  
       2020-09-12 01:16:33 +08:00 via iPhone
    找个懂的,依赖反转。
    realpg
        36
    realpg  
       2020-09-12 01:21:23 +08:00
    针对同一个代码片段的互相有影响修改,竟然可以分别独立测试?难道最终这不是要合并到一起运行的?

    显然要规定合并顺序,ABC 约定好合并顺序,假设 A B C 的顺序

    A 首先他的 base 就是原始代码,进行一次测试,测试通过合并进主线或者合并进新分支 Atested

    测试通过后合并进主线,由 B 在另外测试分支,解决冲突合并成 A+B(Atested),预提交进 Bpretest,测试人员通过 Bpretest 分支进行测试,测试通过合并进主线或者合并进新分支 ABtested

    然后 C 进来
    yangbonis
        37
    yangbonis  
       2020-09-12 01:27:41 +08:00 via iPhone
    软件不是功能的堆砌,而是组织,要加需求先重构。
    afx
        38
    afx  
       2020-09-12 01:33:26 +08:00 via iPhone
    三个需求提出时间比较短,上线时间可能不同,按照我们的做法是先对需求和团队人力做评估,然后明确上线时间和上线需求。开发可以并行开发,到时需要上线什么需求就擦该分支合并入专门的发布分支,测试组只关心发布分支的内容。我们不会单独测试某个分支,一切需求都需求合并入发布分支才接受测试,这样可以从流程上保证工程质量,才不会无谓地浪费时间。
    cassyfar
        39
    cassyfar  
       2020-09-12 01:37:38 +08:00
    初一看,这不是一个因为只有一台测试机,而无法同时跑 3 个代码版本的问题吗? Docker 解决。

    细想下,我感觉是开发流程的问题。一般都是本地开发然后测试,然后提交代码审查,然后合并进测试环境,测试环境可以只有一个, 只用测 master branch,最后再到生产环境。

    你的问题是混淆了开发环境和测试环境,测试环境上不应该测试还未开发完整的代码。
    palmers
        40
    palmers  
       2020-09-12 10:40:19 +08:00
    我理解你的问题是 测试开发资源都非常紧张, 要尽可能的利用开发和测试资源快速完成这三个需求, 但是这三个需求设计的功能点重叠部分较多 并行开发冲突很多 现在三个需求都开发完了 又不能串行测试 需要并行测试 然后上线时间待定 根据老大或上头资源协调的情况定 是吧?

    如果没理解错的话, 我的建议是: 前后端都使用个合并分支 将这三个需求合并到一个分支上发布 这期间肯定需要解决冲突,然后期间如果遇到 bug 修复, 优先在 ABC 三个需求对应的分支上修改然后合并到发布分支 测试, 后面如果上线 AB 则将 AB 分支代码合并测试上线 目前我能想到的办法就是这个, 这里面风险是比较大的 因为稍微不注意就会合错代码, 在开发的时候代码尽量做到需求上的物理隔离, 这样因为冲突导致代码合并错乱的几率会降低
    lecion
        41
    lecion  
       2020-09-12 10:53:33 +08:00 via iPhone
    确实是一个普遍问题,目前我们部署了 10 个前端环境,后端是一个,因为后端多数是增加接口不会有兼容或者冲突问题,能解决 95%的场景了,剩余 5%就资源协调吧
    gy0624ww
        42
    gy0624ww  
    OP
       2020-09-12 11:14:05 +08:00
    @realpg 恩 涉及冲突的可以安排先后顺序进行测试,不考虑有冲突。每个需求都是独立且同时开发的。然后几乎同时测试,但是测试周期和上线日期不同
    gy0624ww
        43
    gy0624ww  
    OP
       2020-09-12 11:22:58 +08:00
    @afx 那就是说同一时间只有一个需求进行测试,开发并行开发完成后,依此合并分支提测。那么剩下时间只能等待了
    angryfish
        44
    angryfish  
       2020-09-12 11:43:24 +08:00 via iPhone
    懒得弄多环境的话,让测试连开发电脑测试。
    foam
        45
    foam  
       2020-09-12 12:43:30 +08:00   ❤️ 1
    谈谈我在我司的实践。
    1. 服务器部署:
    前端目录:将项目目录复制为 f1 、f2 、f3 ....
    后端目录:将项目目录复制为 b1 、b2 、b3 ....
    nginx 配置 f1.test.xx.com f2.test.xx.com f3.test.xx.com / b1.test.xx.comb2.test.xx.comb3.test.xx.com 到对应目录。ps. 如果后端只想用一个域名,可以。b.test.xx.com/1/api,然后 nginx 把 1 解析到对应目录,去掉 1,rewrite 一下 URI

    2. 前端(客户端)配置后端环境
    前端开发一个切换环境的组件,提供入口给测试同学输入数字切换环境。
    例如安卓,长按某个页面元素,跳转到命令框输入,测试同学输入数字 n,那么把 n 保存到文件 /localStorage,后面发起
    api 调用时,只需将数字拼接到 host 或 path,就能调用不同环境。并且,前端需要将“测试环境 1/2/3”标注在页面显眼的地方,让测试同学清除现在身处哪个环境。
    后面后端水平扩展多个环境都可以,测试同学可以随意切换不同环境,不需前端改代码

    PS. 前端发布线上版本的话,注意要将这个组件移除(编译脚本实现)

    3. 测试同学 /产品
    需要给这两位同学简单培训使用方法。并且在某个功能测试时,需要发布测试须知:
    xx 功能,前端环境:2,后端环境:5


    抛砖引玉~
    gy0624ww
        46
    gy0624ww  
    OP
       2020-09-12 17:07:30 +08:00
    @foam 恩,多谢 很有启发
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1139 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:39 · PVG 02:39 · LAX 10:39 · JFK 13:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.