在 DevOps 中为多租户应用程序实施分支策略
Implement Branching strategy in DevOps for Multi-Tenant application
我是 DevOps 的新手,我有一个解决方案,使用 Umbraco 作为 CMS,将移动应用程序作为 CMS 中添加的内容的前端,并使用 .Net MVC web API 将 CMS 与移动应用程序连接起来.我还有一些调度任务的 WebJobs 和 Microsoft 流程。
现在,我需要为我的多租户应用程序实施 DevOps,这是我的场景:
该解决方案将有一个主应用程序,它仅作为功能的主列表供管理员在创建新社区时启用功能。具有独立数据库的多个社区,每个社区都有多个功能(Feature1,Feature2)。开发人员应该有一种方法来向前集成和向后集成功能。
将功能添加到任何社区后,它可以对特定功能进行自定义。在某些场景中,开发人员还需要将这些更改添加到主社区或兄弟社区。我还添加了图像以便更好地理解。
现在,我需要帮助为我的解决方案创建分支策略,以满足上述所有要求并在合并所有分支时最大限度地减少冲突的可能性。我有以下选择。
i) 我应该将每个功能视为单独的分支吗?如果是,如何管理在任何单个社区中完成的社区特定更改?
ii) 我应该将每个社区视为独立的分支吗?如果是,我如何分离出要与社区分支合并的功能代码?
iii) 我应该考虑在所有社区之间共享代码吗?如果是,社区具体变化如何?
一切都将在部署后立即运行(在使用 Visual Studio 2017 的代码库中)。
我应该采用哪种策略?或者有比这些更好的方法吗?如果在部署后生成,我如何设法解决合并冲突?另外,在 DevOps 中,我应该选择 Git 还是 TFS?
任何指导将不胜感激。
我认为分支不是解决此问题的正确方法。似乎您想使用不同的 配置 部署相同的应用程序。在大多数情况下,配置应该在主代码库之外。
假设您有一个具有 3 个可能功能的任意应用程序:
- 可自定义头像,
- 用户通知,
- A public restful API(或者 graphql,如果你喜欢的话)。
所有这些功能都将在同一个代码库中,它们都需要协同工作,但它们也可能不是每个租户都想要的功能。
注意:在这种情况下,"tenant" 可以是任何东西,例如 SaaS 类平台的不同国家,或者如果您向企业销售产品,则可以是不同的公司。
因为所有功能无论如何都必须能够协同工作,所以您会希望将应用程序保持为一个整体。这意味着您只有一个产品/代码库(如果您想要这样做,可能会拆分成微服务),但您可以使用不同的配置对其进行部署。
您可以将产品部署到一家名为 TheBank 的银行并启用所有 3 个功能,您也可以将产品部署到一家名为 TheFlowerShop 的小公司,它只需要用户通知(加上核心产品)。在这种情况下,您将部署相同的代码库,但可以通过某种方式来决定某个功能是否可用。有很多方法可以做到这一点,但通常它们都被称为 "Feature Flags" 或 "Feature Toggles".
功能标志本质上是某种配置,您可以在 运行 时检查它以了解应用程序应如何运行。让我们举个简单的例子,你的服务可能有一个 JSON 配置文件,看起来像这样:
{
"features": {
{ "name": "custom_avatars", "enabled": true }
....
}
}
这可以在您部署应用程序时设置,并将定义打开或关闭哪些功能,在 运行 时您可以读入此文件并检查功能是否打开。如果名为 "public_api" 的功能被禁用,那么您将不允许用户为此生成令牌,并且您将不允许来自除它本身之外的任何东西的 HTTP 调用。如果关闭用户通知,那么当系统事件发生时,您不会将通知发送到用户电子邮件,您将忽略它。
这种配置可以位于许多不同的位置,它可以位于您的常规配置旁边,例如您的数据库连接详细信息,也可以是一个单独的文件。它也可能是 运行 由提供此功能的服务提供的,有很多功能切换/功能标志应用程序可以很好地 UI 来管理此功能。
当您开始为不同的部署执行应用程序的不同分支时,您将陷入一片混乱。您将不得不重复修复,并且基本上要管理同一代码库的多个不同版本,这些版本最终会彼此分离。在某些时候,您可能会发现应用到一个分支的修复程序在另一个分支上不起作用。
坚持使用单个应用程序,但使其可配置。
我是 DevOps 的新手,我有一个解决方案,使用 Umbraco 作为 CMS,将移动应用程序作为 CMS 中添加的内容的前端,并使用 .Net MVC web API 将 CMS 与移动应用程序连接起来.我还有一些调度任务的 WebJobs 和 Microsoft 流程。
现在,我需要为我的多租户应用程序实施 DevOps,这是我的场景:
该解决方案将有一个主应用程序,它仅作为功能的主列表供管理员在创建新社区时启用功能。具有独立数据库的多个社区,每个社区都有多个功能(Feature1,Feature2)。开发人员应该有一种方法来向前集成和向后集成功能。
将功能添加到任何社区后,它可以对特定功能进行自定义。在某些场景中,开发人员还需要将这些更改添加到主社区或兄弟社区。我还添加了图像以便更好地理解。
现在,我需要帮助为我的解决方案创建分支策略,以满足上述所有要求并在合并所有分支时最大限度地减少冲突的可能性。我有以下选择。
i) 我应该将每个功能视为单独的分支吗?如果是,如何管理在任何单个社区中完成的社区特定更改?
ii) 我应该将每个社区视为独立的分支吗?如果是,我如何分离出要与社区分支合并的功能代码?
iii) 我应该考虑在所有社区之间共享代码吗?如果是,社区具体变化如何?
一切都将在部署后立即运行(在使用 Visual Studio 2017 的代码库中)。 我应该采用哪种策略?或者有比这些更好的方法吗?如果在部署后生成,我如何设法解决合并冲突?另外,在 DevOps 中,我应该选择 Git 还是 TFS?
任何指导将不胜感激。
我认为分支不是解决此问题的正确方法。似乎您想使用不同的 配置 部署相同的应用程序。在大多数情况下,配置应该在主代码库之外。
假设您有一个具有 3 个可能功能的任意应用程序:
- 可自定义头像,
- 用户通知,
- A public restful API(或者 graphql,如果你喜欢的话)。
所有这些功能都将在同一个代码库中,它们都需要协同工作,但它们也可能不是每个租户都想要的功能。
注意:在这种情况下,"tenant" 可以是任何东西,例如 SaaS 类平台的不同国家,或者如果您向企业销售产品,则可以是不同的公司。
因为所有功能无论如何都必须能够协同工作,所以您会希望将应用程序保持为一个整体。这意味着您只有一个产品/代码库(如果您想要这样做,可能会拆分成微服务),但您可以使用不同的配置对其进行部署。
您可以将产品部署到一家名为 TheBank 的银行并启用所有 3 个功能,您也可以将产品部署到一家名为 TheFlowerShop 的小公司,它只需要用户通知(加上核心产品)。在这种情况下,您将部署相同的代码库,但可以通过某种方式来决定某个功能是否可用。有很多方法可以做到这一点,但通常它们都被称为 "Feature Flags" 或 "Feature Toggles".
功能标志本质上是某种配置,您可以在 运行 时检查它以了解应用程序应如何运行。让我们举个简单的例子,你的服务可能有一个 JSON 配置文件,看起来像这样:
{
"features": {
{ "name": "custom_avatars", "enabled": true }
....
}
}
这可以在您部署应用程序时设置,并将定义打开或关闭哪些功能,在 运行 时您可以读入此文件并检查功能是否打开。如果名为 "public_api" 的功能被禁用,那么您将不允许用户为此生成令牌,并且您将不允许来自除它本身之外的任何东西的 HTTP 调用。如果关闭用户通知,那么当系统事件发生时,您不会将通知发送到用户电子邮件,您将忽略它。
这种配置可以位于许多不同的位置,它可以位于您的常规配置旁边,例如您的数据库连接详细信息,也可以是一个单独的文件。它也可能是 运行 由提供此功能的服务提供的,有很多功能切换/功能标志应用程序可以很好地 UI 来管理此功能。
当您开始为不同的部署执行应用程序的不同分支时,您将陷入一片混乱。您将不得不重复修复,并且基本上要管理同一代码库的多个不同版本,这些版本最终会彼此分离。在某些时候,您可能会发现应用到一个分支的修复程序在另一个分支上不起作用。
坚持使用单个应用程序,但使其可配置。