Git分支策略与testing/质量保证过程相结合

我们的开发团队一直在使用GitFlow分支策略,这非常棒!

最近我们招聘了几个testing人员来提高我们的软件质量。 这个想法是,每个function都应该由testing人员来testing/ QA。

过去,开发人员在单独的function分支上处理function,并在完成时将它们合并回develop分支。 开发人员将自己在该feature分支上testing他的工作。 现在与testing人员,我们开始问这个问题

testing人员应该在哪个分支上testing新function?

显然,有两个select:

  • 在个人function分支上
  • develop分支

testing开发分支

起初,我们相信这是一个肯定的路要走,因为:

  • 自开发开始以来,该function将与所有其他function合并到develop分支中进行testing。
  • 任何冲突都可以早于以后检测到
  • 它使testing人员的工作变得简单,他只是一直在处理一个分支( develop )。 他不需要问开发商哪个分支是哪个function(function分支是由相关开发者完全自由pipe理的个人分支)

最大的问题是:

  • develop分支受到污染。

    当testing人员发现错误或冲突时,他将其报告给开发人员,开发人员将问题修复到开发分支(function分支一旦合并就放弃),之后可能会有更多的修复。 多个子序列提交或合并(如果重新创build分支再次develop分支来修复错误)使得从develop分支回滚function非常困难。 develop分支有不同的时间合并和固定的多种function。 当我们想用develop分支中的一些function来创build一个版本时,这会产生一个大问题

function分支上的testing

所以我们再次考虑,并决定我们应该testingfunction分支上的function。 在我们testing之前,我们将从develop分支到function分支的更改合并(赶上develop分支)。 这很好:

  • 您仍然使用主stream中的其他functiontesting该function
  • 进一步发展(如修复错误,解决冲突)不会污染develop分支;
  • 您可以轻松决定不发布function,直到它完全testing和批准;

但是,有一些缺点

  • testing人员必须合并代码,如果有任何冲突(很有可能),他必须要求开发人员的帮助。 我们的testing人员专注于testing,而且不具备编码能力。
  • 一个function可以在没有另一个新function的情况下进行testing。 例如特征A和B同时处于testing中,这两个特征彼此不知道,因为它们都没有被合并到develop分支。 这意味着当两个特性都被合并到开发分支时,你将不得不再次对develop分支进行testing。 而且你必须记住在未来testing这个。
  • 如果functionA和functionB都经过testing和认可,但是在合并冲突时,两个function的开发人员都认为这不是他自己的错误/工作,因为他的function分支已经通过了testing。 沟通上有额外的开销,有时解决冲突的人有时会感到沮丧。

以上是我们的故事。 由于资源有限,我想避免在任何地方进行testing。 我们仍然在寻找更好的方法来应对这一点。 我很想听听其他团队如何处理这种情况。

我们这样做的方式如下:

我们在合并最新开发的分支代码之后,对function分支进行testing。 主要原因是我们不希望在function被接受之前“污染”开发分支代码。 如果某个function在testing后不被接受,但是我们希望发布已经合并在开发中的其他function,这将是地狱。 发展是一个释放的分支,因此最好处于可释放的状态。 长版本是我们在很多阶段testing。 更多分析:

  1. 开发人员为每个新function创build一个function分支。
  2. function分支(自动)部署在我们的testing环境中,每次提交给开发人员testing。
  3. 当开发人员完成部署并准备好testingfunction时,他将合并function分支上的开发分支,并部署包含TEST上所有最新开发更改的function分支。
  4. testing人员在testing上进行testing。 完成后,他“接受”故事,融合特色部门的发展。 由于开发人员之前已经合并了开发部门的function,所以我们通常不会期望太多的冲突。 但是,如果情况是这样,开发人员可以提供帮助。 这是一个棘手的步骤,我认为避免它的最好方法是保持function尽可能小/特定。 不同的特征必须最终以这种或那种方式合并。 当然这个团队的规模在这个步骤的复杂性上扮演着一个angular色。
  5. 开发分支也(自动)部署在TEST上。 我们有一个策略,即使function分支构build可能会失败,开发分支不应该失败。
  6. 一旦我们达到了function冻结,我们创build一个发展版本。 这是在STAGING上自动部署的。 在生产部署之前,会在那里进行广泛的端到端testing。 (好吧,也许我夸大了一点,他们不是很广泛,但我认为他们应该是)。 理想的betatesting者/同事,即真正的用户应该在那里testing。

你怎么看待这个方法?

在testing之前,我们将开发分支的更改合并到function分支

不,不,特别是如果我们是质量保证testing员。 合并将涉及解决潜在的冲突,这最好由开发人员(他们知道他们的代码)完成,而不是由QAtesting人员(谁应该尽快进行testing)完成。

让开发人员在开发人员的基础上对他/她的feature分支进行重定位 ,并推送该feature分支 (开发人员已经validation了该分支在最近的devel分支状态上编译和工作)。
这允许:

  • 一个非常简单的function分支集成(简单的快速合并)。
  • 或者按照Aspasia在下面的注释中推荐的方式, 请求 (GitHub)或者合并请求 (GitLab) :维护者在特性PR / MR分支和develop之间进行合并,但是只有在没有冲突时才被GitHub / GitLab检测到。

每次testing人员检测到错误时,他/她都会将其报告给开发人员,并删除当前的function分支。
开发人员可以:

  • 修复错误
  • 在最近获取的开发分支之上重新绑定(同样,要确保他/她的代码与其他已validation的function集成在一起)
  • feature分支。

总体思路:确保合并/集成部分由开发人员完成,将testing留给QA。

最好的方法是持续集成 ,其中总体思路是尽可能频繁地将特征分支合并到开发者分支中。 这减less了合并痛苦的开销。

尽可能依靠自动化testing,并通过Jenkins的unit testing自动开始构build。 让开发人员将所有更改合并到主分支中,并为所有代码提供unit testing。

testing人员/ QA可以参与代码审查,检查unit testing,并编写自动化集成testing,以便在function完成时添加到回归套件中。

欲了解更多信息,请查看此链接 。

我们使用我们所说的“黄金”,“银”和“青铜”。 这可以被称为prod,staging和qa。

我来把这个称为熔炉模型。 它对我们来说效果很好,因为我们对业务方面的QA有巨大的需求,因为要求可能比技术难以理解。

当一个错误或function准备好进行testing时,它会变成“青铜”。 这触发了一个jenkins构build,将代码推送到预构build的环境。 我们的testing人员(不是超级技术人员)只是碰到一个链接,不关心源代码pipe理。 这个构build也运行testing等。如果testing(单元,集成,selenium)失败,我们已经在这个构build中反复实际推送代码到testing\ qa环境。 如果您在单独的系统上testing(我们称之为领先),则可以防止将更改推送到您的qa环境。

最初的担心是我们之间会有很多这些function之间的冲突。 它确实发生了functionX使得它看起来像functionY打破,但它是不经常的,实际上帮助。 它有助于在外面看起来是变化的背景下进行广泛的testing。 运气好多次,你会发现你的变化如何影响平行发展。

一旦某个function通过质量保证,我们就会将其移至“silverlight”或分期。 构build运行并再次运行testing。 每周我们把这些变化推到我们的“黄金”或产品树,然后部署到我们的生产系统。

开发者从黄金树开始他们的变化。 从技术上讲,你可以从升级开始,因为这些将会很快上升。

紧急修复直接进入黄金树。 如果一个变化很简单,很难进行质量保证,那么它可以直接进入silverlight,然后进入testing树。

在我们发布后,我们把黄金(prod)的变化推向青铜(testing),只是为了保持一切同步。

在推入暂存文件夹之前,您可能需要重新绑定。 我们发现时常清除testing树保持清洁。 有时候特性在testing树中被抛弃,尤其是在开发人员离开的时候。

对于大型的多开发者function,我们创build一个单独的共享库,但是当我们准备好的时候把它合并到testing树中。 事情往往会从QA反弹,所以重要的是保持你的变更集被隔离,以便你可以添加,然后合并/压缩到你的分段树。

“烘烤”也是一个不错的副作用。 如果你有一些根本性的改变,你可以坐下来一段时间,有一个很好的地方。

另外请记住,我们不维护过去的版本。 目前的版本始终是唯一的版本。 即使如此,您也许可以拥有一个烘焙树,让您的testing人员或社区能够看到不同的贡献者如何互动。

我不会单靠手工testing。 我会自动化与jenkins每个function分支的testing。 我安装了一个VMWare实验室,在Linux和Windows上为所有浏览器运行Jenkinstesting。 这是一个真棒跨浏览器,跨平台testing解决scheme。 我testingfunction/与Selenium Webdriver集成。 我的seleniumtesting在Rspec下运行。 我特别写了他们在Windows上被jRuby加载。 我在Jasmine的Rspec和Javascripttesting下运行传统的unit testing。 我用Phantom JS设置无头testing。