请问代码发布系统中,如何避免多人发布造成冲突而产生发布错了文件? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pizida
V2EX    问与答

请问代码发布系统中,如何避免多人发布造成冲突而产生发布错了文件?

  •  
  •   pizida 2017-03-10 17:19:26 +08:00 3962 次点击
    这是一个创建于 3223 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT. 在下自己打算写一个发布系统,大概思路是通过打 tag 和线上版本进行对比,团队确认没有问题就通过 rsync 同步代码。但是现在有个问题,是假设 A 同事打了一个 tag1 , tag1 和线上版本对比,只有 a 文件有修改。 但这个时候同事 b 也提交了一个 b 文件, b 同事也打了个 tag2 ,和线上版本对比,只有 b 文件有修改。这时候 b 同事先发布。 那么!问题来了,这个时候如果 a 同事进行发布(假设 a 延迟发布了),那么就会把 tag1 发出去,此时将 b 文件给覆盖了。要如何解决呢?我的思路是创建一个发布流程前就加锁,但是这样死感觉很有点 low 。

    各位有好的办法吗?

    27 条回复    2017-03-12 01:23:02 +08:00
    zhuyao
        1
    zhuyao  
       2017-03-10 17:21:38 +08:00
    设定权限?
    pizida
        2
    pizida  
    OP
       2017-03-10 17:24:18 +08:00
    @zhuyao 那这样只能一个人或者说一个账户来发布咯?
    skydiver
        3
    skydiver  
       2017-03-10 17:50:06 +08:00
    后打的 tag 必须包含前一个的 tag 的内容。
    或者直接规定只能在某一个分支上打 tag 。
    VeryCB
        4
    VeryCB  
       2017-03-10 17:54:27 +08:00 via iPhone
    感觉不是发布流程的问题,是开发流程的问题...可以看看 git flow
    SpicyCat
        5
    SpicyCat  
       2017-03-10 18:05:06 +08:00
    按照 git commit 的思路,每个 commit 只记录变更。
    同事 A 只改了文件 a ,那么上传的时候,系统只执行文件 a 的更改,其他不变。同理,同事 B 改了文件 b ,也只执行文件 b 的更改。
    这样,不管同事 A 和同事 B 的发布顺序如何,都不会彼此覆盖。
    除非同事 A 和同事 B 更改了同一文件的同一个地方,那么会有冲突。这时候,后提交的人就会被提示有冲突。
    domty
        6
    domty  
       2017-03-10 18:55:50 +08:00
    没用过 git 吗

    我们这里的方式是借用 git 的分支进行发布。只允许发布 master 分支。
    平时的开发使用自建的开发分支,上线前将开发分支的代码合并到 master 。

    这样像你这种情况下 a 如果等到 b 提交代码后进行发布的话会把 a 和 b 的代码一起发布。
    hxsf
        7
    hxsf  
       2017-03-10 19:28:33 +08:00
    发布走队列,同一个项目只能同时发布一个版本。
    Felldeadbird
        8
    Felldeadbird  
       2017-03-10 23:01:41 +08:00 via iPhone
    为什么不基于版本库进行更新啊。
    kmahyyg
        9
    kmahyyg  
       2017-03-11 00:32:17 +08:00 via Android
    git + code review
    cxbig
        10
    cxbig  
       2017-03-11 00:37:12 +08:00
    一般小的提交+RP 用不着 Tag
    不同的程序员接到不同的任务,怎么会有相同的 Tag 呢?这是管理问题吧?
    AccIdent
        11
    AccIdent  
       2017-03-11 00:38:41 +08:00
    噗莫名想到 false sharing

    加锁可以(悲观),或者用版本号做检查(乐观)
    SoloCompany
        12
    SoloCompany  
       2017-03-11 04:21:58 +08:00
    你这是拿 tag 当分支来用?
    正常系统的 tag 必须从指定分支抓取(比如 master )
    即使你不走 review 流程,起码可以保证没人可以 force push 从而覆盖别人的变更
    guoqiao
        13
    guoqiao  
       2017-03-11 05:54:50 +08:00 via iPhone
    似乎是对 git 的使用不够了解才会引出这样的问题
    murmur
        14
    murmur  
       2017-03-11 07:09:31 +08:00
    上线之前还有仿真环境 仿真环境的代码才会推到生产服务器上
    paulagent
        15
    paulagent  
       2017-03-11 08:22:06 +08:00
    目前一个项目,就是只有 master 才能发布到生产环境,开发人员在 branch 上开发,然后提交 merge , 别的同事 review 万事,同意的话就 merge 到 master 上然后直接跑测试,通过后自动发布。谁先谁后不重要
    nicevar
        16
    nicevar  
       2017-03-11 09:09:50 +08:00 via iPhone   1
    master 用来发布, tag 用于发版之后,开发在分支上并分配权限,搭个 gitlab 之类,分支上开发完成后发起 merge request ,有权限的人 review 后决定是否 merge
    lyao
        17
    lyao  
       2017-03-11 10:13:05 +08:00 via Android
    git town
    pizida
        18
    pizida  
    OP
       2017-03-11 14:37:12 +08:00
    @SpicyCat 公司项目用的是 svn
    pizida
        19
    pizida  
    OP
       2017-03-11 14:38:57 +08:00
    @domty 用过 git ,但是目前公司全都是用 svn 管理的。那这样是不是也可以用 svn 的 branch 各自开发,开发完毕后提交到 master ,然后 master 跟上一个发布版本对比一下,没问题就进行发布呢?
    pizida
        20
    pizida  
    OP
       2017-03-11 14:39:57 +08:00
    @Felldeadbird 不太了解,基于版本库更新是什么意思。目前用的是 svn ,每次都会先 svn up 的
    pizida
        21
    pizida  
    OP
       2017-03-11 14:42:14 +08:00
    @SoloCompany 你好,我用的是 svn 管理项目。是不是应该新建分支开发( svn branch ),然后测试 ok 就 merge 到 master 。然后发布 master 。
        22
    pizida  
    OP
       2017-03-11 14:44:47 +08:00
    @paulagent 如果 merge 到 master 之后,发现有点问题,这个时候没有回滚,但是其他同事就发布出去了呢?
    pizida
        23
    pizida  
    OP
       2017-03-11 14:53:09 +08:00
    @nicevar 如果是用 svn 管理,要如何实现呢 merge request 呢?
    julyclyde
        24
    julyclyde  
       2017-03-11 18:40:39 +08:00
    @SpicyCat git commit 不记录变更啊
    Infernalzero
        25
    Infernalzero  
       2017-03-11 19:13:32 +08:00
    基于 svn 的这种蛋疼发布系统我之前也有搞过,无非就是仅同步想要发布的文件, php 之类的可能还好些, java 的话一旦有人漏提交就会导致 build 失败,而且还得去发布系统填个发布请求,填上对应的文件,特别蛋疼,只会降低工作效率。讲道理,发布系统就不应该管版本控制的事,做些静态检查倒是可以的,版本控制用 git 或者 hg 完全足够了
    Felldeadbird
        26
    Felldeadbird  
       2017-03-11 22:31:35 +08:00 via iPhone
    svn 的话我没解决的方案。
    我在的公司内部是用 git 的。每个人都通过分支开发,然后我进行合并到 master 分支。最后通过发布系统推送到对应的服务器。
    akira
        27
    akira  
       2017-03-12 01:23:02 +08:00
    svn 的话 你要看看分支代码的合并那一块怎么处理的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3052 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 14:17 PVG 22:17 LAX 06:17 JFK 09:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86