Deployment 如何在组织范围内处理特定于环境的应用程序配置? 问题

Deployment 如何在组织范围内处理特定于环境的应用程序配置? 问题,deployment,configuration,Deployment,Configuration,您的组织有许多独立的应用程序,其中一些相互作用(形成“系统”)。您需要将这些应用程序部署到单独的环境中,以便于分阶段测试(例如,开发、质量保证、用户体验、产品开发)。给定的应用程序需要在每个环境中稍微进行不同的配置(例如,每个环境都有一个单独的数据库)。您希望通过某种自动机制来处理这种重新配置,这样您的发布经理就不必在每次将每个应用程序部署到不同的环境时都手动配置它 所需功能 我希望设计一个具有以下属性的组织范围内的配置解决方案(理想情况下): 支持“一键式”部署(只需指定环境,部署期间/之后

您的组织有许多独立的应用程序,其中一些相互作用(形成“系统”)。您需要将这些应用程序部署到单独的环境中,以便于分阶段测试(例如,开发、质量保证、用户体验、产品开发)。给定的应用程序需要在每个环境中稍微进行不同的配置(例如,每个环境都有一个单独的数据库)。您希望通过某种自动机制来处理这种重新配置,这样您的发布经理就不必在每次将每个应用程序部署到不同的环境时都手动配置它

所需功能 我希望设计一个具有以下属性的组织范围内的配置解决方案(理想情况下):

  • 支持“一键式”部署(只需指定环境,部署期间/之后无需手动重新配置)
  • 应该有一个“记录系统”,其中指定了一个共享的依赖于环境的属性(例如由许多应用程序共享的数据库连接字符串)
  • 支持重新配置已部署的应用程序(在特定于环境的属性需要更改的情况下),理想情况下无需重新部署应用程序
  • 允许应用程序在同一台计算机上但在不同的环境中运行(同时运行PROD实例和DEV实例)
可能的解决方案 我认为解决方案可以朝两个基本方向发展:

  • 使所有应用程序“环境感知”。您可以在命令行将环境名称(DEV、QA等)传递给应用程序,然后应用程序就足够“智能”了,可以在运行时计算出特定于环境的配置值。应用程序可以从与应用程序一起部署的平面文件或从中央配置服务获取值
  • 应用程序不像#1中的应用程序那样“智能”,只需从应用程序部署的配置文件中按属性名获取配置。这些属性的值在部署时由安装程序/脚本注入配置文件。该安装脚本采用环境名称,并从中央配置服务获取所有相关配置值
  • 问题:
    您是如何实现解决这些问题并支持这些所需功能的配置解决方案的?我有两种可能的解决方案吗?您对这些解决方案有偏好吗?另外,请随时告诉我,我对这个问题的想法完全错了。任何反馈都将不胜感激。

    我们都遇到过这种情况,尤其是在大型组织中。我认为最重要的是首先管理您自己的期望,并询问是否确实有必要告诉给定框中的每个系统和子系统“更改为开发模式”或“更改为产品模式”。我个人的建议如下:

  • 让各个盒子负责不同的阶段,即“这是一个开发盒子”和“这是一个产品盒子”

  • 在一个位置收集尽可能多的不同配置,即使它需要软链接或脚本来收集信息然后打印出来

    A.这样,您可以轻松地在两个位置“转储此框的配置”,并查看不同之处,例如在新部署之后

    B.您还可以将配置更改与软件更改分开,至少在某种程度上是这样,这是根除发布时出现的bug的好方法

  • 然后让所有配置都基于未烘焙或硬编码的东西/地方-只需确保收集并记录在该位置即可。机制是什么几乎无关紧要,这是一件好事,因为有些系统只是不想被迫使用某些机制或其他机制

  • 抱歉,如果这是一个过于笼统的回答-问题非常笼统。我以前在几个大型软件组织工作过,这似乎是最好的方法。使用独立服务器作为“一个部署单元”是最现实的场景(尽管有时成本很高),因为应用程序相互影响,无论您多么小心,当您移动任何给定齿轮或齿轮时,都会破坏整个系统的稳定性

    替代方案很快变得非常复杂。您需要开始重写您可以控制的应用程序,以便让它们接受一个“DEV”开关,最后在您无法控制的应用程序上添加一层混乱。通常情况下,你无法控制的系统至少会基于系统级定义的属性,除非它们“调用母舰以获取指令”

    将人们重定向到远程位置并让他们“使用开发”与“使用产品”比“让这台机器像开发人员一样运行”与“让这台机器像产品一样运行”更容易。如果你把事情搞混了,比如让一个开发任务和一个PROD任务一起在同一个盒子上运行,那么不管怎样,这都不是一个现实的场景:我保证最终你会授予PROD上的某个人非法的只允许开发人员访问的权限,你会让一个开发任务清除一个PROD数据库


    希望这有帮助。如果您想讨论更多相关细节,请告诉我。

    我个人更喜欢解决方案2(通过配置,应用程序应该知道自己运行的环境)。对于解决方案1(将环境名称作为启动参数传递),使用错误的环境说明符的危险太大。从PROD代码访问测试数据库,反之亦然,如果两个已安装的代码库的版本不相同(通常情况下),则可能会造成混乱

    我当前的项目使用解决方案1,但我不喜欢这样。我以前参与的一个项目使用了so的变体
    var config = {
        'ver': '1.0',
        'help': {
            'BLURB': 'This pre-production environment is not supported. Contact Development Team with questions.',
            'PHONE': '808-867-5309',
            'EMAIL': 'coder.jen@lostnumber.com'
        },
        'help@www.productionwebsite.com': {
            'BLURB': 'Please contact Customer Service Center',
            'BLURB@fr': 'S\'il vous plaît communiquer avec notre Centre de service à la clientèle',
            'BLURB@de': 'Bitte kontaktieren Sie unseren Kundendienst!!1!',
            'PHONE': '1-800-CUS-TOMR',
            'EMAIL': 'customer.service@productionwebsite.com'
        },
    }
    
    prefer(config,['www.productionwebsite.com','de']); // prefer(obj,string|Array<string>)
    
    JSON.stringify(config); // {
        'ver': '1.0',
        'help': {
            'BLURB': 'Bitte kontaktieren Sie unseren Kundendienst!!1!',
            'PHONE': '1-800-CUS-TOMR',
            'EMAIL': 'customer.service@productionwebsite.com'
        }
    }
    
    appsettings.dev.json
    appsettings.qa.json
    appsettings.staging.json