NuGet企业版 - 不同成熟度级别包的最佳实践

16

我们希望使用NuGet在组织中的开发人员之间共享程序集。目前,我们正在考虑设置三个NuGet源,如下:

  • 发布源:程序集的稳定发布版本。
  • QA源:在主干分支(我们的集成分支)上构建的程序集。
  • 开发源:在任何特性分支上构建的程序集(共享进度)。

开发人员机器上的本地构建应该不会被发送到这些源中。只有构建服务器生成的构建才应该这样做。我们的构建服务器执行三种不同类型的构建,具体取决于分支:开发分支、QA分支和发布分支。每个都对应一个构建配置,可以触发源代码更改。在构建过程中,它们将把已构建的程序集NuGet包推送到相应的源中。开发构建将在版本号后添加"-dev"。QA构建将在版本号后添加"-qa",而发布构建将有一个“纯”版本号。


现在,问题:

  1. 开发人员要控制使用哪些软件包最好的解决方案是什么?我猜开发人员必须手动编辑依赖源参数来明确定义从哪个源获取程序集:有时您需要发布程序集,有时需要QA程序集,有时甚至需要最新的开发版本。

  2. 我们还考虑将本地构建包推送到每个开发人员自己机器上的本地私有源中,以帮助加速构建。这在源方面是否会有问题?

  3. 如果这些定义是由开发人员在依赖文件中进行的(这也必须进行版本控制),则该设置将在提交到存储库时带入开发源中(与开发人员的重点相同,只是与其他人共享)。这可能是开发源的正确设置,也可能不是?

  • 当源代码合并到QA分支时,依赖关系中定义的feeds仍然是开发者制作的,可能会从开发feeds获取程序集。对于QA构建,我认为这可能不是我们想要的。 QA构建应该限制feeds只使用发布程序集,因为您希望看到更改是否与发布组件一起按预期工作。您不希望使用其他“未经测试”的QA程序集进行测试。 这对他人也有意义吗?

  • 在发布分支中,发布版本的构建应该仅使用发布feed的程序集,我猜? 我觉得可能已经有共识了,因此可能根本不是问题:)。


  • 因此,总结所建议的过程......在构建期间,我们应该:

    • 遵循开发人员在本地和开发构建的依赖关系规范中设置的源。
    • 在执行QA和Release构建时,应将feed限制为Release feed。

    顺便说一句,QA feeds实际上不会被任何其他构建使用。但是,QA部门将使用这些进行测试。


    涉及多少开发人员?有多少开发团队?如果我们谈论的是5名开发人员和50名开发人员,您需要的模式是非常不同的。 - Matthew Skelton
    我们现在大约有7个人,但计划在未来一年内将规模扩大一倍。 - Spiralis
    好的,谢谢Spiralis - 这对这个问题和https://dev59.com/ZmEi5IYBdhLWcg3wPKWx上的那个问题有所帮助。 - Matthew Skelton
    1个回答

    15

    在我的看法中,你提出的流程对于你现在的团队规模和一年后的团队规模来说都太复杂了。

    我理解你认为需要三个不同的源(开发、QA、发布)的原因,但我预测这将会在一年后给你带来痛苦。我认为你想要增加软件包从开发到QA再到发布的稳定性/质量的信心,这是一个完全合理的要求。然而,许多人认为,对于开发、QA和发布分别采用不同的源代码分支,尤其是使用不同的构建是一种反模式。具体来说,在Humble和Farley所著的经典书籍《持续交付》中,强烈推荐只使用单一的代码库进行构建,而且任何构建都应该能够在测试通过后升级到生产环境。 "只构建你的代码一次" 是关键。

    与你所描述的模式不同,我建议你:

    1. 使用允许你建立一个部署管道的CI工具:Jenkins、TeamCity、TW GO等。这可以为从初始CI构建直接流动到生产环境的工件设置一个良好的先例,而无需重新构建。
    2. 使用语义化版本控制(在.NET世界中称为SemVer)来保护软件包消费者免受破坏性更改,并向其他团队传达软件包更改的性质。
    3. packages.config中使用版本范围约束,以避免新的主要版本(具有破坏性更改)破坏构建。
    4. 使开发团队从代码提交到生产环境负责特定的软件包。如果他们维护的软件包出现问题,他们需要快速提供修复程序,以便其他团队不会被阻塞。团队还需要纪律性地确保他们通过SemVer传达软件包更改的性质(是破坏性更改?新功能?漏洞修复?)
  • 如果你认为有必要,可以使用NuGet的预发布功能来“隐藏”新包版本,以避免影响下游构建和测试。这可能可以帮助开发团队更有效地进行更改,但如果你使用允许快速制作和交付新包版本的部署管道,则可能不是必要的。
  • 简而言之,只需构建一次源代码,并设置自动化程序,使得对现有包的任何修复都可以通过部署管道迅速推出。


    谢谢。我还没有被说服,至少现在还没有。从dev-branches构建的版本是使用debug-flag构建的,不适合发布。此外,程序集中的版本号是在构建过程中创建的,并且需要重新构建才能更新。我真的不希望将构建版本化为开发构建的发布版本。有一个危险,其中之一可能会被部署到客户站点进行测试,然后被遗忘。对于任何人来说,这个程序集看起来像是最终版本。可以在NuGet中重新打包,但程序集版本保持不变。 - Spiralis
    阅读《持续交付》第5章(它恰好是免费样章):http://www.informit.com/articles/article.aspx?p=1621865特别是第113页的“只构建一次二进制文件”模式。拥有任何构建潜在发布候选版本的好处是巨大的:它可以启用各种良好的模式。 - Matthew Skelton

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接