【问题标题】:Implement Branching strategy in DevOps for Multi-Tenant application在 DevOps 中为多租户应用程序实施分支策略
【发布时间】:2023-03-28 05:31:01
【问题描述】:

我是 DevOps 的新手,我有一个解决方案,将 Umbraco 作为 CMS,将移动应用程序作为 CMS 中添加的内容的前端,以及将 CMS 与移动应用程序连接起来的 .Net MVC Web API。我还有一些计划任务的 WebJobs 和 Microsoft 流程。

现在,我需要为我的多租户应用程序实施 DevOps,这是我的场景:

该解决方案将有一个主应用程序,它将作为功能的主列表,供管理员在创建新社区时启用功能。多个社区拥有独立的数据库,每个社区都有多个特征(Feature1、Feature2)。开发人员应该有一种方法可以前向集成和后向集成功能。

将该功能添加到任何社区后,它可以对特定功能进行自己的自定义。在某些情况下,开发人员还需要将这些更改添加到主社区或兄弟社区。我还添加了图片以便更好地理解。

现在,我需要帮助来为我的解决方案创建满足上述所有要求的分支策略,并在合并所有分支时最大限度地减少冲突的机会。我有以下选择。

i) 我应该将每个功能视为单独的分支吗?如果是,如何管理在任何单个社区中完成的社区特定更改?

ii) 我应该将每个社区视为单独的分支吗?如果是,如何分离出要与社区分支合并的特性代码?

iii) 我应该考虑在所有社区之间共享代码吗?如果是,那么社区特定的变化呢?

一旦部署(在使用 Visual Studio 2017 的代码库中),一切都将立即运行。 我应该采用哪种策略?还是有比这些更好的方法?如果在部署后生成,我该如何解决合并冲突?另外,在 DevOps 中我应该选择 Git 还是 TFS?

任何指导将不胜感激。

【问题讨论】:

  • 这可能更适合放在softwareengineering.stackexchange.com。除此之外,拥有一个应用程序并拥有多个部署不是更容易吗?只需给每个功能一个切换,对于每个部署,您都可以打开和关闭不同的功能切换。 Git 并不是用于管理功能采用的真正好工具,它用于文本文件版本管理。
  • @ElliotBlackburn,感谢您的回复。正如您所说,Git 在这方面并不是一个真正好的工具,您是否建议 TFS 是满足 DevOps 和我的要求的更好选择?
  • 不,我建议您重新考虑您的方法。对应用程序功能标志使用任何类型的版本控制都是一个坏主意。您应该研究功能标志(有时称为功能切换)。 Git、TFS、SVN,所有这些做这种开发都会很痛苦。
  • @ElliotBlackburn,因此您建议不要挖掘分支,而是使用功能标志。由于我对这一切都很陌生,你能帮我了解更多吗?任何参考也将起作用。感谢您的帮助。
  • 当然,我会提供我的回复作为答案,以便获得更多文本格式。

标签: git azure-devops branch


【解决方案1】:

我不认为分支是解决这个问题的正确方法。您似乎想部署具有不同配置的相同应用程序。在大多数情况下,配置应该在主代码库之外。

假设您有一个具有 3 个可能功能的任意应用程序:

  1. 可自定义的头像,
  2. 用户通知,
  3. 一个公开的 restful API(或者 graphql,如果那是你的果酱)。

所有这些功能都在同一个代码库中,它们都需要协同工作,但它们也可能不是每个租户都想要的功能。

注意:在这种情况下,“租户”可以是任何东西,例如针对类似 SaaS 的平台的不同国家,或者如果您向企业销售产品,则可以是不同的公司。

因为无论如何所有功能都必须能够协同工作,所以您需要将应用程序保持为一个有凝聚力的部分。这意味着您只有一个产品/代码库(如果您想要这样做,可能会拆分为微服务),但您可以使用不同的配置来部署它。

您可以将该产品部署到一家名为 TheBank 的银行并启用所有 3 项功能,您也可以将该产品部署到一家名为 TheFlowerShop 的小型公司,该公司只需要用户通知(加上核心产品)。在这种情况下,您将部署相同的代码库,但通过某种方式来决定某个功能是否应该可用。有很多方法可以做到这一点,但通常都称为“功能标志”或“功能切换”。

功能标志本质上是某种配置,您可以在运行时检查它以了解应用程序应该如何操作。让我们举个简单的例子,你的服务可能有一个 JSON 配置文件,看起来像这样:

{
    "features": {
         { "name": "custom_avatars", "enabled": true }
         ....
    }
}

这可以在您部署应用程序时设置,并定义打开或关闭哪些功能,在运行时您可以读取此文件并检查是否打开了某个功能。如果禁用了名为“public_api”的功能,那么您将不允许用户为此生成令牌,并且您将不允许来自除自身之外的任何东西的 HTTP 调用。如果关闭了用户通知,那么当系统事件发生时,您不会将通知发送到用户电子邮件,您将忽略它。

这种配置可以放在许多不同的地方,它可以在您的一般配置旁边,例如您的数据库连接详细信息,也可以是一个单独的文件。它也可以由提供此功能的服务运行,有很多功能切换/功能标志应用程序提供了很好的 UI 来管理它。

当您开始为不同的部署执行应用程序的不同分支时,您会陷入巨大的混乱。您将不得不重复修复,并且您基本上将管理同一代码库的多个不同版本,这些版本最终将彼此分离。在某些时候,您可能会发现应用于一个分支的修复在另一个分支上不起作用。

坚持使用单个应用程序,但使其可配置。

【讨论】:

  • 非常感谢您的长篇描述性解释。它对我帮助很大。如果我的多个租户具有以下条件,请告诉我“坚持使用单个应用程序,但使其可配置”规则是否仍然适用: 1. 租户不会共享内容,需要一些配置 2. 租户可能对基本功能有一些扩展,IE。添加/删除或调整的某些功能形成了一个功能。 3. 我的解决方案是基于微服务的架构 4. 每个租户的数据安全措施不同 5. 可能是部署模式/环境不同,比如云端或本地等
  • 我仍然认为高度可配置是最好的答案,即使有所有这些东西。您最终可能会进行大量配置,但如果您在多个单独的代码分支上进行大量配置,您将节省大量时间并且能够满足更多需求。如果你想在未来混搭各种东西,但它们不在同一个分支上,会发生什么?我现在为两家采用配置方法的公司工作过,这始终是一个不错的决定,只是有时需要编写好的文档。
  • @Elliot Blackburn 感谢您的所有帮助。我对这种方法还有一个担忧。在我们的应用程序中维护功能标志更好还是我应该使用任何第三方功能管理工具?
  • @Developer 这是由您做出的业务决策,这取决于应用程序的复杂性以及您希望能够轻松地切换它们以及各种情况。这远远超出了这个问题的范围,也不是我们可以为您做出的决定。
猜你喜欢
  • 2021-03-31
  • 2011-11-24
  • 2020-12-07
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 2019-01-10
  • 1970-01-01
相关资源
最近更新 更多