34

您(您的公司)如何管理您构建的应用程序/系统的配置文件?让我告诉你我们是怎么做的,问题是什么。

我在一家公司工作,我们与大约 15 名开发人员一起开发软件。我们构建部署在我们的托管托管服务提供商处的业务线 Web 应用程序。我们的主要应用程序之一由一个网站和大约十个 WCF 服务组成。一些服务是相互连接的。

我不知道这是一个大系统还是小系统,但我认为这需要我们太长时间才能在我们不同的环境(测试、验收和生产)中启动和运行。

我们的 Visual Studio 项目中每个环境都有配置文件。所以 a web.test.config, a web.acc.config, aweb.prod.config和 aweb.config用于发展。它们都有相同的键,但值可能不同,具体取决于它们所使用的环境。

如果我快速计算 web.config 中 webapp 的 appsettings 数,我数为 32。我数了 5 个端点。我们有四个环境(dev、test、acc 和 prod),这意味着一个 web 应用程序总共有 128 个 appsettings 和 20 个端点。我们很容易犯错,尤其是在最后期限临近的时候。

我们都是人类,所以这样的事情可能发生在任何人身上:

  • 我们对其中一个配置文件进行了更改,但在构建和部署之前忘记签入。
  • 或者我们在 WebServer 上进行了更改而忘记在其他四个 web.configs 中进行相应的更新。
  • 或者我们只更改四个配置文件中的三个。等等。

然后,我们在托管托管服务提供商处拥有基础设施。默认情况下,每个端口都是关闭的。因此,如果其中一个 WCF 服务需要与位于不同服务器上的另一个 WCF 服务通信,则必须打开受防火墙保护的端口。

我们在Test中这样做,但是在Acceptance中我们必须再次这样做,并且我们忘记了必须打开哪些端口,所以它更像是试错:哦我的服务无法连接到数据库,可能是端口关闭。同样的问题也可能在生产中发生。

根据 SLA,我们的托管主机提供商可能需要几天时间才能在防火墙中打开一个端口。所以,这很快就变成了一个相当漫长的过程。最后,我们需要大约两个月的时间来启动和运行测试、验收和生产。

所以,我的问题是:您如何管理配置和基础设施以及围绕它的流程?

4

7 回答 7

6

Config4 *项目(免责声明:我是它的主要开发人员)没有与 .Net 或 WCF 的开箱即用集成,因此它可能对您没有用处。但是,Config4* 中的一项功能与您的问题相关:它能够在配置文件中嵌入 if-then-else 语句,以便该文件可以“适应”自己以适应不同的环境(例如开发、测试,验收和生产)。

您可以修改该概念以使用您在基于 .Net/WCF 的项目中使用的任何配置语法(我不熟悉这些技术,但我猜他们可能使用基于 XML 的配置文件) . 特别是,您可以使用 Python 编写脚本,该脚本使用 if-then-else 语句在 a 中设置特定于环境的name=valuemap,然后使用一些print语句生成一组为环境量身定制的配置文件. 这种脚本的伪代码大纲是:

#--------
# Set up configuration variables suitable for a specified environment
#--------
cfg["variable1"] = "default value";
cfg["variable2"] = "another default value";
if (environment == "testing") {
  cfg["variable1"] = "override default value for this environment";
  cfg["variable3"] = "value suitable for this environment";
  ...
} else if (environment == "production") {
  ...
}
#--------
# Now use print statements to generate configuration files
# Alternatively, use the _name=value_ pairs in the map to
# perform global search-and-replace on template versions of
# configuration files.
#--------
...

对于奖励积分,脚本还可以生成需要为环境执行的测试清单,例如,“检查是否需要在以下端点之间打开防火墙端口:...”

于 2012-12-11T21:26:32.963 回答
4

我们正在开发一个分布式存储系统,我们在每次构建时运行的单元和集成测试中发现了许多类似的问题。此外,我们正在使用 ReviewBoard,以便其他开发人员在提交之前查看任何更改。下一步是在不同环境中自动部署和测试工件的持续集成服务器 (jenkins)。最后,我们的最后一道防线是在发布之前针对任何新版本运行的压力测试测试平台。当然,拥有一个尽可能好地模拟您的生产环境的测试平台是必不可少的,但如果您总是在同一个托管服务提供商处部署,那应该不会太难。

  • 关于您的特殊情况,其中一个文件中的更改可能已在其他文件中被遗忘,等等:我想这很容易使用测试脚本进行自动检查。

  • 未提交的更改应该像“git diff master”或您使用的任何 vcs 一样容易检测。

  • 了解需要为服务打开哪些端口似乎更像是一个适当的文档问题,而不是配置管理的问题。

许多使用我们系统的站点也使用 puppet 来管理其不同节点的配置。我不确定这是否适合您,但可能值得一看。

于 2014-02-05T08:39:19.003 回答
4

这可能会有所帮助,它讨论了从一个来源引用的配置文件和服务的中心位置。

http://blogs.msdn.com/b/youssefm/archive/2010/09/02/loading-wcf-client-configuration-from-different-files-with-configurationchannelfactory.aspx

于 2012-12-07T16:17:58.340 回答
4

听起来您有一个足够小的环境,您可以使用Ansible 模板SaltStack轻松管理所有配置文件。

于 2015-07-30T17:32:13.630 回答
3

看看http://www.configapp.com上的 Config 。它的工作方式是您将导入一个名为 web.config 的基本配置文件。然后在 webapp 中,您将创建 4 个环境,dev、test、acc 和 prod。转到开发环境,创建环境变量,并设置适合环境的值。您将只维护一个带有环境变量的配置文件。您可以查看所有环境变量,并轻松查看环境之间的差异。

您将犯更少的错误,因为您只需管理 1 个配置文件。当您添加新的通用/静态配置时,所有环境都会神奇地拥有该新设置。添加变量配置时,只需转到正确的环境选项卡并在那里设置值。您可以查看所有环境的特定配置值,以便快速检查您是否遗漏了什么。您还可以查看每个环境的每个配置文件,因为它们就在您面前。您不需要对每台服务器进行 RDP/SSH。

您不会忘记签入,因为 Config 将是主副本,并且您不会再直接编辑配置文件。如果您直接编辑它们,我们有一个差异功能,因此您可以看到主副本和本地副本之间的差异。您可以使用适合您团队的各种部署模型将主副本部署到本地服务器。您可以推送、手动拉取、自动拉取或导出/复制。

我们将支持自定义类型,我们将来可以添加的一件事是端口数据类型。端口验证的一部分将检查端口是否打开。这仅适用于本地计划,因为它需要访问内部网络。或者您可以手动检查它。转到端口环境变量,并显示当前配置的所有端口。检查列表中的每个端口。如果端口看起来不错,请在 Config 中添加注释,说明它已打开并在某个日期进行了检查。Config 是为搜索和文档而设计的。

顺便说一句,我是 Config 团队的一员。

于 2018-01-03T17:56:12.097 回答
1

就个人而言,如果可能,我会通过以下方式管理它:所有“静态”环境设置(数据库连接、LDAP 等)都放在服务器配置文件中(不受代码迁移影响),“动态”设置在数据库本身。

所以我只依赖数据库团队来更新设置(如果你可以直接访问数据库,那就更容易了)。而且我没有风险在我的开发 PC 上运行指向 prod 数据库的代码:D

但我没有 Visual Studio 经验,所以我不确定你是否可以在你的情况下应用类似的东西,但我希望它能给你一些想法。

于 2014-02-04T16:59:06.043 回答
0

您是否考虑过使用部署管理工具来处理它?我曾在运营团队工作过,负责部署一个产品,该产品有大约 10 个需要相互通信的不同系统,所以我非常了解您的情况。部署整个解决方案大约需要 4 小时的手动步骤 + 2 小时的测试。我们决定使用 Octopus Deploy ( https://octopus.com ) 来自动化部署过程。该工具可以在配置文件中进行变量替换,您可以为每个环境定义变量(等等...)整个解决方案的部署现在大约需要 15 分钟,最终结果总是很好...您还可以触发发布直接从 TFS、VSTS、Jenkins 或 TeamCity 创建和部署,这样您就可以拥有非常可靠的 CI/CD 方法。

希望这可以帮助。

于 2018-10-04T02:55:06.053 回答