在DevOps中为多租户应用程序实现分支策略

时间:2018-12-18 13:09:58

标签: git azure-devops branch

我是DevOps的新手,我有一个将Umbraco用作CMS,将Mobile App用作CMS和.Net MVC Web API中添加的内容以将CMS与Mobile App连接的前端的解决方案。我也有WebJobs和Microsoft流程来执行一些调度任务。

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

该解决方案将具有一个主应用程序,该应用程序仅用作功能的主列表,以便管理员在创建新社区时启用功能。多个社区具有单独的数据库,每个社区都具有多个功能(功能1,功能2)。开发人员应该有一种向前和向后集成功能的方法。

将功能添加到任何社区后,它可以在特定功能中具有自己的自定义项。在某些情况下,开发人员还需要将这些更改添加到主社区或同级社区。我还添加了图片以更好地理解。

enter image description here

现在,我需要为我的解决方案创建分支策略,该策略可以满足上述所有要求,并在合并各个分支时最大程度地减少发生冲突的机会。我的脑海中有以下选择。

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

ii)我是否应将每个社区视为独立的分支机构?如果是,我如何分离要与社区分支合并的功能代码?

iii)我是否应该考虑所有社区之间的共享代码?如果是,那么社区的具体变化如何?

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

任何指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为分支不是解决此问题的正确方法。似乎您只想使用不同的配置部署同一应用程序。在大多数情况下,配置应超出主要代码库的范围。

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

  1. 可定制的头像,
  2. 用户通知,
  3. 一个公共的Restful API(如果这是您的果酱,请使用graphql)。

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

注意:在这种情况下,“承租人”可以是诸如类似SaaS平台的不同国家或地区(如果您是向企业出售)的公司。

由于所有功能都必须能够一起工作,因此您需要将应用程序保持为一个整体。这意味着您只有一个产品/代码库(如果您要这样做的话,可能会拆分为微服务),但是您可以使用不同的配置来部署它。

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

功能标志本质上是一种配置,您可以在运行时检查该配置以查看应用程序应如何运行。让我们以简单的情况为例,您可能有一个用于服务的JSON配置文件,如下所示:

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

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

这种配置可以位于许多不同的位置,它可以与常规配置(例如数据库连接详细信息)相邻,也可以是单独的文件。它也可以由提供此功能的服务运行,那里有很多功能切换/功能标志应用程序,它们提供了用于管理此功能的漂亮UI。

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

仅粘贴一个应用程序,但使其可配置。