代码管理_阿里如何管理代码分支

2023-11-01

文章转载自:https://mp.weixin.qq.com/s/0N3isbSZL4fM5HjZo1aafA

背景

在阿里内部,流行着许多有意思的工程实践。有些实践通过工具和流程嵌在集团的大环境里,外界不容易复制,有些实践则是流露在大家的日常习惯里,被默默的遵守。比如分支管理这件事,其实属于工具和习惯各占一半,并且颇有阿里特色的成分,适合作为一个例子。阿里有很多的研发团队,不同事业部使用的发布流程、分支策略并非整齐划一,但总体上看是比较规整的。其中有一种主流的发布模式以及对应的分支使用方式,称为“AoneFlow”。这套工作模式思路独特,在阿里以外的地方并不多见。本文围绕这些实践,聊一聊分支管理的话题。

细数分支模式

说到分支管理模式,我们最耳熟能详的莫过于 TrunkBasedGitFlow

TrunkBased

TrunkBased模式是持续集成思想所崇尚的工作方式,它由单个主干分支和许多发布分支组成,每个发布分支在特定版本的提交点上从主干创建出来,用来进行上线部署和 Hotfix。在 TrunkBased 模式中,没有显性的特性分支。当然实际上 Git 的分布式特征天生允许每个人有本地分支,TrunkBased 也并非排斥短期的特性分支存在,只不过在说这种模式的时候,大家通常都不会明确强调它罢了。

虽然近年来有许多不错的案例,但 TrunkBased 模式并没有一统天下。它的缺点比较明显,太多的团队同时工作在主干上,到发布的时候就可能出现灾难(尤其是多版本并行开发的情况)。弥补的措施是 FeatureToggle 以及频繁的集成和足够的测试覆盖,这对开发团队的能力提出了比较高的要求。目前 TrunkBased 模式主要用在不需要同时维护多个历史版本的 SaaS 型项目,特别是经过微服务改造的各种小型服务上。

TrunkBased 模式有两种常见演进版本。OneFlow 模式 参考了 TrunkBased 的许多思想,对操作流程做了更严格的定义,增加了 Hotfix 分支等内容。多主干模式(通常是双主干,固定的开发分支和固定的发布分支),算是 TrunkBased 采用固定发布分支的特例,在 提升团队的微服务落地能力 这篇文章里介绍过,不再赘述。

GitFlow

GitFlow模式是若干模式的集大成者,包含一个主干分支、一个开发分支、许多的特性分支、许多的发布分支和 Hotfix 分支,以及许多繁琐的合并规则。它有一个 Git 插件,不过早就没人维护了。由于对每个阶段的每项操作定义十分明确,它曾经是很多重视流程的企业眼里的香馍馍。但它使用起来并不是很容易,大量的合并冲突和对集成测试不友好也是它被诟病最多的地方。

对,还有 GithubFlow 模式,不过这种策略无非是在 TrunkBased 的基础上,增加了个人仓库和 Pull Request 合并代码的操作,与在同一个仓库里增加个人分支的做法类似,从实用的意义来说,它更合适分布式团队。GithubFlow 也有演进版本,例如强调了多环境部署和将仓库或分支与环境关联的 GitlabFlow 模式。

要么简单粗暴如 TrunkBased,要么繁琐复杂如 GitFlow。难到真没有其他选择了吗?

另辟蹊径的 AoneFlow

在 AoneFlow 上你能看到许多其他分支模式的影子。它基本上兼顾了 TrunkBased 的“易于持续集成”和 GitFlow 的“易于管理需求”特点,同时规避掉 GitFlow 的那些繁文缛节。

看一下具体套路。AoneFlow 只使用三种分支类型:主干分支、特性分支、发布分支,以及三条基本规则。

规则一,开始工作前,从主干创建特性分支。

AoneFlow 的特性分支基本借鉴 GitFlow,没有什么特别之处。每当开始一件新的工作项(比如新的功能或是待解决的问题)的时候,从代表最新已发布版本的主干上创建一个通常以feature/前缀命名的特性分支,然后在这个分支上提交代码修改。也就是说,每个工作项(可以是一个人完成,或是多个人协作完成)对应一个特性分支,所有的修改都不允许直接提交到主干。

规则二,通过合并特性分支,形成发布分支。

AoneFlow 的发布分支设计十分巧妙,可谓整个体系的精髓。GitFlow 先将已经完成的特性分支合并回公共主线(即开发分支),然后从公共主线拉出发布分支。TrunkBased 同样是等所有需要的特性都在主干分支上开发完成,然后从主干分支的特定位置拉出发布分支。而 AoneFlow 的思路是,从主干上拉出一条新分支,将所有本次要集成或发布的特性分支依次合并过去,从而得到发布分支。发布分支通常以release/前缀命名。

这条规则很简单,不过实际的玩法就相当丰富了。

首先,发布分支的用途可以很灵活。基础玩法是将每条发布分支与具体的环境相对应,比如release/test分支对应部署测试环境,release/prod分支对应线上正式环境等等,并与流水线工具相结合,串联各个环境上的代码质量扫描和自动化测试关卡,将产出的部署包直接发布到相应环境上。进阶点的玩法是将一个发布分支对应多个环境,比如把灰度发布和正式发布串在一起,中间加上人工验收的步骤。高级的玩法呢,要是按迭代计划来关联特性分支,创建出以迭代演进的固定发布分支,再把一系列环境都串在这个发布分支的流水线上,就有点经典持续集成流水线的味道了。再或者做一个将所有特性分支都关联在一起的发布分支,专门用于对所有提交做集成测试,就玩出了 TrunkBased 的效果。当然,这些花哨的高级玩法是我臆想的,阿里的发布分支一般都还是比较中规中矩。

其次,发布分支的特性组成是动态的,调整起来特别容易。在一些市场瞬息万变的互联网企业,以及采用“敏捷运作”的乙方企业经常会遇到这种情况,已经完成就等待上线的需求,随时可能由于市场策略调整或者甲方的一个临时决定,其中某个功能忽然要求延迟发布或者干脆不要了。再或者是某个特性在上线前发现存在严重的开发问题,需要排除。按往常的做法,这时候就要来手工“剔代码”了,将已经合并到开发分支或者主干分支的相关提交一个个剔除出去,做过的同学都知道很麻烦。在 AoneFlow 的模式下,重建发布分支只是分分钟的事,将原本的发布分支删掉,从主干拉出新的同名发布分支,再把需要保留的各特性分支合并过来就搞定。这一系列动作能够在很大程度上实现自动化,而且不会在仓库留下一堆剔除代码的记录,干净无污染。

此外,发布分支之间是松耦合的,这样就可以有多个集成环境分别进行不同的特性组合的集成测试,也能方便的管理各个特性进入到不同环境上部署的时机。松耦合并不代表没有相关性,由于测试环境、集成环境、预发布环境、灰度环境和线上正式环境等发布流程通常是顺序进行的,在流程上可以要求只有通过前一环境验证的特性,才能传递到下一个环境做部署,形成漏斗形的特性发布流。阿里有统一平台来自动化完成特性组合在发布分支间的迁移,在下面讲工具的部分里会再介绍。

规则三,发布到线上正式环境后,合并相应的发布分支到主干,在主干添加标签,同时删除该发布分支关联的特性分支。

当一条发布分支上的流水线完成了一次线上正式环境的部署,就意味着相应的功能真正的发布了,此时应该将这条发布分支合并到主干。为了避免在代码仓库里堆积大量历史上的特性分支,还应该清理掉已经上线部分特性分支。与 GitFlow 相似,主干分支上的最新版本始终与线上版本一致,如果要回溯历史版本,只需在主干分支上找到相应的版本标签即可。

除了基本规则,还有一些实际操作中不成文的技巧。比如上线后的 Hotfix,正常的处理方法应该是,创建一条新的发布分支,对应线上环境(相当于 Hotfix 分支),同时为这个分支创建临时流水线,以保障必要的发布前检查和冒烟测试能够自动执行。但其实还有一种简便方法是,将线上正式环境对应的发布分支上关联的特性分支全部清退掉,在这个发布分支上直接进行修改,改完利用现成的流水线自动发布。如果非得修一个历史版本的 Bug 怎么办呢?那就老老实实的在主干分支找到版本标签位置,然后从那个位置创建 Hotfix 分支吧,不过由于阿里的产品大多是线上 SaaS 业务,这样的场景并不多见。

正是这些简单的规则,组成了 AoneFlow 独树一帜的核心套路。

AoneFlow 中每一个看似简单的步骤都并非凭空臆造,而是经历大量产品团队反复磨砺后积累下来的经验。接下来,我会说说 AoneFlow 的技术门槛以及阿里内部的应对之道。

AoneFlow 的体验优化

谙熟武侠之道的人都懂得,掌握一个门派的看家武艺,除了要会招式,还得有深厚的内功和趁手的兵器。否则拿了辟邪剑谱,也只能望谱兴叹。

阿里团队的内功和兵器,实际上是良好的代码习惯和齐全的配套工具。

这里说的习惯,除了开发流程和代码分支的管理方式以外,还包括日常开发中的一些约定俗成的规约。阿里的许多开发规约是有“文献”记载的,主要收录在 《阿里巴巴 Java 开发手册》 里面。它的内容现在已经公开了,所以早就不算是秘密。

举一个具体的例子。在 AoneFlow 的流程中,每次重建发布分支的时候都会重新合并然后编译代码,产生新的部署包。然而,即使代码的内容是一样的,如果工程中依赖了一些会改变的第三方软件包,依然可能导致打包出的产品行为不完全一致。因此,在阿里的代码规约中就明确地指出了,用于线上发布的代码,不可以使用包含“SNAPSHOT 版本”(即未正式发布版本)的依赖包,从而确保每次构建出的产物都是一致的。类似这样的细节还有很多,好的开发习惯是确保软件质量的必要前提。

工具可以使得团队协作更加平滑。虽然只要弄懂原理,AoneFlow 中每个分支创建、合并、更改步骤使用单纯的 Git 命令就能玩转。但其中的一些操作(比如为每个发布分支选出恰当的特性分支组合进行合并)手工执行极易出错,而且让团队的个人重复这些日常琐事的命令操作,并不是令人愉悦的事情。

在阿里内部,使用 AoneFlow 流程的团队基本上不用自己运行 Git 来处理分支的事情,而是由阿里巴巴集团内部名叫 Aone 的协同研发平台(以下简称平台)接管。这个承担集团 80% 产品从需求和用户故事提出到部署上线完整研发流程的平台,内置了许多以服务组件的形式嵌入的研发提效工具,其中的发布组件为 AoneFlow 的用户体验添色不少。比较显著的辅助“功效”包括以下几个方面。

首先是整体流程的自动化。

由于是内部工具,平台的功能高度内聚。对于项目而言,从提出原始需求,将需求拆分为任务,然后根据任务在线创建特性分支,再聚合生成发布分支,同时根据模板自动创建测试环境,直到后期的运维保障都可以一站式的搞定。

这个流程已经远远超出了代码分支管理的范畴。但正是因为如此,平台对于 AoneFlow,向前做到了将特性分支和需求项关联起来,确保了特性分支的命名规范性;向后做到了将发布分支与部署行为关联起来,确保了各环境版本来源的可靠性。打通了端到端交付的任督二脉。

其次是发布分支的流水线。

作为一种流程自动化的手段,CI/CD 流水线是许多现代交付团队中常见的标配实践。在 AoneFlow 的代码生命周期里涉及许多分支,当这些分支被创建或更新时,往往需要伴随其他的一系列行为。流水线能够将这些日常开发过程中的代码分支与其所表达的深层意图(比如提交代码即进行集成测试)联系起来。特别是发布分支,AoneFlow 的每个发布分支通常关联具体的部署环境,当有新代码合并进分支时,就应该及时对代码进行检查和部署。

理想情况下,每条不同的分支都应该有与其作用相匹配的一条流水线来为它服务。AoneFlow 的发布分支是相对固定的,因此相比 GitFlow 更易于进行持续集成。理论上任何流水线工具都能够配合 AoneFlow 使用,不过,阿里的统一平台提供流水线对代码评审、安全检查、在线部署等功能的整合,还是为 AoneFlow 在内部团队的使用优化增色不少。

还有一项很有用的辅助是分支关联的管理。

特性分支与发布分支的关联关系维护是一个 AoneFlow 特有的问题。记住每个发布分支分别来自哪些特性分支对于需要基于现有特性组合进行改变的时候十分有意义。比如当需要将某个特性从特定发布分支退出时,通常会将除了该特性以外的其他特性所在分支进行一次合并,以替换原有的发布分支。人为的记录这些信息并不轻松,要是通过平台进行展示和辅助就会方便许多。

当某些功能组合在一个低级别的发布环境(如集成测试环境)验证完成后,我们希望将它的内容直接迁移到高级别的环境(如预发布环境)对应的发布分支上。这样可以确保线上的版本一定是经过预发验证的,预发的版本一定是经过集成验证的,以此类推,使得各个发布分支形成串联。同样的,使用普通的 Git 命令就能实现这个操作,只不过用可视化工具会让流程更加直观。

除此以外,平台提供代码仓库各个分支状况的统一展示,包括分支所对应部署环境的机器信息、操作记录等全都一览无余。正是这些“高附加值”的辅助,使得 AoneFlow 得以扬长避短,成为阿里团队支撑复杂项目首选的利器。

不久前,2017 年 12 月 20 日云栖大会,阿里协同研发平台的团队刚刚在阿里云上 发布了一款公开版的研发效能产品:云效。相比集团内部平台,目前公开的 云效 还只是初级版本,不过值得庆幸的是,它 对 AoneFlow 的支持 已经比较完备,好奇之士可自行前往探索。

地址:https://yq.aliyun.com/articles/307586

写在最后

代码分支模式的选择并没有绝对的正确和错误之分,关键是与项目的规模和发布节奏相匹配。阿里协同研发平台在经过众多实践历练后,总结出了一套独创的分支管理方法,通过兼备灵活高效与简单实用的流程,保障阿里旗下众多产品的交付。当你还在犹豫于琳琅满目的分支模式,既舍不得 GitFlow 的并行特性开发,又放不下 TrunkBased 的持续集成友好时,AoneFlow 也许是一个值得考虑的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码管理_阿里如何管理代码分支 的相关文章

  • GIT代码管理: git remote add

    这里主要以 如何将一份已经写好的代码提交到两个git远端 为例 xff0c 更好地理解git remote add这句 xff1b 首先要明白一句代码的意思 xff0c 以github最经常的提示为例 xff1a 在这张图面里git ini
  • git中的后悔方法:rebase,revert,reset

    http zhaojunde1976 blog 163 com blog static 12199866820136119201752 如果git中提交了错误代码 怎么办 有三种选择 rebase revert reset revert 用
  • [Git] 代码管理之 Git(六)Git rebase 压缩提交历史

    我们在工作中 可能会出现这样的情况 一项工作由好几个同事同时完成 然后每个人针对当前的feature都有对应的提交 那么就会造成同一个feature有多次提交的这样的冗余存在 除此之外 如果我们自己针对同一个feature的每天的提交以及一
  • Git删除本地在远端已经删除的分支

    git remote prune origin
  • 论git中使用https和ssh协议的区别

    论git中使用https和ssh协议的区别 SHELDON CUI S BLOG 2017 09 08 git https ssh 心得 http好还是ssh好 git可以使用四种主要的协议来传输资料 本地协议 Local HTTP 协议
  • 前端自动埋点

    起源是在测试时候没有报错 系统功能不正常 和测试查找错误很麻烦 埋点就是在某个功能函数里上报一些信息 比较类试express的中间件机制 但是没有操作的权限 自定义express的打印日志中间件 app get req res gt con
  • 代码管理_阿里如何管理代码分支

    文章转载自 https mp weixin qq com s 0N3isbSZL4fM5HjZo1aafA 背景 在阿里内部 流行着许多有意思的工程实践 有些实践通过工具和流程嵌在集团的大环境里 外界不容易复制 有些实践则是流露在大家的日常
  • linux下svn命令大全

    1 将文件checkout到本地目录 svn checkout path path是服务器上的目录 例如 svn checkout svn 192 168 1 1 pro domain 简写 svn co 2 往版本库中添加新的文件 svn
  • git解决代码冲突、合并代码

    共同开发时提交代码会遇到代码冲突 第一次遇到就手足无措的我 打算写一篇博客记录下来 下次遇到稳如老狗 一 远程代码已有更新记录 忘记拉取远程代码 直接提交 单人开发时 我没有先拉远程代码再提交的习惯 千万不要学习 一定要先拉代码再提交 导致
  • win10 VS code 编译运行 C/C++的方法

    win10 VS code 编译运行 C C 的方法 具体配置过程如下链接 https zhuanlan zhihu com p 35178331 但中间出了点问题 CTRL ALT n 运行后 PS D C gt cd d C if gc
  • Window下CodeStriker Server的搭建

    Windows下Codestriker Server的搭建分为以下几个步骤 1 安装Perl解析器 这里以ActivePerl为例 安装没有什么难度 主要是用安装以后GUI的PPM去下载相关的PM组件 2 安装数据库并为codestrike
  • Gitlab的API调用

    1 概述 Gitlab作为一个开源 强大的分布式版本控制系统 已经成为互联网公司 软件开发公司的主流版本管理工具 使用过Gitlab的都知道 想要提交一段代码 可以通过git push提交到远程仓库 也可以直接在Gitlab平台上修改提交
  • 常用命令图解 & & git 错误 fatal: Not a valid object name: ‘master‘.

    亲测可用 若有疑问请私信 常用命令图解 转自Git 常用命令详解 二 阳光岛主的博客 CSDN博客 git命令 Git 是一个很强大的分布式版本管理工具 它不但适用于管理大型开源软件的源代码 如 linux kernel 管理私人的文档和源
  • [YOLO专题-28]:YOLO V5 代码管理 - 如何与官网协同开发自己的项目代码

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122519479 目录 前言
  • git submodule的使用

    开发过程中 经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用 而公共代码库的版本管理是个麻烦的事情 今天无意中发现了git的git submodule命令 之前的问题迎刃而解了 添加 为当前工程添加submodule
  • git rebase小计

    http www cnblogs com kym archive 2010 08 12 1797937 html git rebase 顾名思义 就是重新定义 re 起点 base 的作用 即重新定义分支的版本库状态 要搞清楚这个东西 要先
  • git-常见问题解决方法(全)

    git使用过程中遇到的问题解决方法记录 问题 1 更新代码后显示 unable to unlink old xxx xxx xx invalid argument 问题原因 要提交或更新的文件被系统线程占用 解决方法 把相关服务暂停 重新p
  • github token个人令牌

    remote Support for password authentication was removed on August 13 2021 remote Please see https docs github com en get
  • 太方便了,钉钉上就可完成代码发布审批啦!

    如今 不少企业的发布流程要求代码发布到生产环境前需要经过审批 这种发布审批流程 对企业的的CI CD工具提出了新要求 CI CD步骤里需要支持人工卡点审批 并在人工卡点审批通过后能自动触发后续的部署工作 云效流水线Flow发布审批示例 如上
  • 【Inno Setup】判别系统版本

    Code function IsXP32 Boolean var Version TWindowsVersion S String begin GetWindowsVersionEx Version S 主版本号 IntToStr Vers

随机推荐

  • 类文件结构

    类文件结构 深入理解Java虚拟机 第2版 Java虚拟机不和包括Java在内的任何语言绑定 它只与 Class文件 这种特定的二进制文件格式锁关联 不管是Java代码编译为存储字节码的Class文件 还是使用JRuby等其他语言的编译器将
  • hive中的复杂类型使用

    在Hive 中如何使用符合数据结构 maps array structs 1 Array的使用 创建数据库表 以array作为数据类型 create table person name string work locations array
  • Qt designer 中设置背景图片,以及子窗体不继承父窗体背景的方法

    设置背景图片 子窗体不继承父窗体背景
  • html5扑克牌游戏源码,【web】纯JavaScript实现window经典纸牌游戏

    JavaScript 纯文本查看 复制代码 循环遍历将poker图片添加到数组中 var pokersList var flower 0 for var i 1 i lt 52 i var poker new Image poker src
  • Hexo 美化优化配置(持续更新)

    文章目录 添加网站运行时间 添加文章边框阴影效果 在Hexo博客中插入图片 src 链接 本地绝对路径 本地相对路径 Base64 格式 参考链接和工具 相册 某某地方玩 广告 新建文章时 在相同目录下创建同名文件夹 便于图片管理 评论系统
  • Qt控件增加属性并通过添加的属性设置样式

    Qt控件增加属性并通过添加的属性设置样式 1 应用场景 在Qt应用编程中经常要对应用的界面进行美化 这里要用到样式表qss 下面说的方法适用于对某一种控件在界面上有几种不用的风格样式 例如 界面上有两种风格的button 2 设置方法 给要
  • idea java项目转javaWeb

    Idea的java项目转换为javaWeb项目 file Project structure Modults Web 配置web xml文件位置 和web资源目录 注意 删除目录的时候要apply在添加 然后修改
  • 基于SSM的人才招聘网站

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 富文本插件 Tinymce图片上传 img地址变为本地地址

    描述 本人使用Tinymce富文本插件时出现的bug 图片上传 images upload handler blobInfo success gt new Promise resolve reject gt console log blob
  • RDS主/ECS从(只读)建立主从同步

    阿里云RDS 基础版 及阿里云ECS自建Mysql5 7主从 参考文章 新主从数据库搭建 gt gt http blog csdn net abcdocker article details 71249809 RDS高级版主从ECS搭建 g
  • 模拟定位原理

    背景描述 越来越多的用户通过位置模拟的方式 将自己的位置伪造成任意地点 通过发布有暗示性内容的动态进行用户引流或者杀猪盘操作 今天不讨论这些用户 单纯从技术的角度分析一下位置模拟是怎么实现的 目前常见位置信息模拟方式 基于开发者模式的位置修
  • C++的引用详解

    引用 注意事项 1 引用必须初始化 2 初始化后将不能更改 原因是int p a 相当于 int const p a 使用方法 1 给一个变量起一个别名 2 作为函数参数传参 函数中的操作同样对实参有效 3 作为函数返回值 int func
  • 使用element UI el-upload组件实现视频文件上传及上传进度显示方法总结

    使用element UI el upload组件实现视频文件上传及上传进度显示方法总结
  • Mysql学习笔记3: 查询截取分析

    第 3 章 查询截取分析 1 查询优化 1 1 MySQL 优化原则 mysql 的调优大纲 慢查询的开启并捕获 explain 慢SQL分析 show profile查询SQL在Mysql服务器里面的执行细节和生命周期情况 SQL数据库服
  • 第七周PCL学习--点云配准(七)

    目录 引言 一 点云配准 1 1 定义 1 2 含义 1 3 配准过程 1 4 算法原理 1 5 实验 二 总结 三 参考 引言 随着计算机辅助设计技术的发展 通过实物模型产生数字模型的逆向工程技术 由于它的独特魅力获得了越来越广泛的应用
  • CVE-2023-21839:Oracle WebLogic Server RCE

    CVE 2023 21839允许远程用户在未经授权的情况下通过 IIOP T3 进行 JNDI lookup 操作 当 JDK 版本过低或本地存在小工具 javaSerializedData 时 这可能会导致RCE漏洞 影响版本 Weblo
  • datax的使用以及参数解释,快速入门版

    datax的使用以及参数解释 文章目录 datax的使用以及参数解释 前言 一 datax是什么 二 文件配置说明 1 查看配置文件 2 配置参数解释 3 reader参数解释 4 writer参数解释 总结 前言 本文我们介绍一下data
  • (四)ESP32基于MicroPython平台——驱动TFT-1.44寸屏(SPI)

    一 所需器件工具 1 ESP32 CAM开发板 开发板购买链接 2 TFT 1 44寸屏 TFT 1 44寸屏购买链接 二 硬件SPI接口简介 有两个硬件SPI通道允许更快的传输速率 最高80Mhz HSPI id 1 VSPI id 2
  • 使用yum方式安装nginx,yum方式nginx启动

    yum命令安装nginx 前段时间写了一篇使用安装包编译安装nginx的文章 流程比较多 相对比较复杂一点 因为使用安装包编译安装需要自己安装好nginx需要的环境 今天分享一下使用yum的方式安装 这个要简单很多 1 首先安装yum ut
  • 代码管理_阿里如何管理代码分支

    文章转载自 https mp weixin qq com s 0N3isbSZL4fM5HjZo1aafA 背景 在阿里内部 流行着许多有意思的工程实践 有些实践通过工具和流程嵌在集团的大环境里 外界不容易复制 有些实践则是流露在大家的日常