使开发、测试、预发布和生产环境有所不同的良好策略

3

我终于开始使用IDE(IntelliJ),惊讶地发现它在上个项目中节省了我大量的时间。在我的下一个项目中,我想沿用使用好的工具的趋势,这些工具将节省我更多的时间。

我正在为新项目设置开发环境,并希望设置我的开发环境,以便我花费更多的时间编码,而不是部署和手动测试。我想要使用像 Git、Vagrant 以及所有的开发工具,这些工具能够长期节省时间,一旦你学会了它们。

我希望能够在我的笔记本电脑上运行开发环境,一个暂存环境放在网络上(某些集成,如 Facebook 很难在没有实际网站的情况下测试;我还希望暂存环境与生产环境几乎完全相同),以及发布时的生产环境。

相对于生产环境,开发环境和暂存环境需要进行小的更改:例如,不希望暂存环境可以不小心向实际客户发送电子邮件。

我认为有必要在代码中有某些地方根据代码运行的环境使用不同的域名,或者使用模拟API而不是实际的API,也许所有电子邮件都被转储到测试域名中等等。

似乎最安全的方法是假设代码正在运行开发模式,除非已经告诉代码它在暂存或生产环境中。

有哪些好的技术可以告诉代码它正在运行的环境?环境变量?包含在库中的常量?

人们用什么构建工具来处理HTML等事情,其中“编译”可能涉及放置在生产或暂存域名中,并进行缩小处理等?

我喜欢编辑我的代码并重新加载浏览器,因为这样我可以在开发过程中看到效果——也许这是一个我应该停止使用的依赖,但我想要一个使这样做变得容易的工作流程。

我也希望能够防止出错。我不想不小心在开发模式下部署代码到生产中。我从未使用过 CI 工具,这是人们使用 CI 工具的原因吗?当你还没有一个庞大的团队时,值得使用吗?

特别是对 IntelliJ 的建议将不胜感激。

2个回答

5
最佳策略是不要告诉代码它正在运行的环境。让环境告诉代码它需要在哪个环境下运行。
你的代码不应该特别检查它是否处于开发或暂存或其他状态。(如果这样做,每当添加、删除或重命名环境时,你就需要更改你的代码)。相反,每当你的代码需要执行某些依赖于环境的操作时,它应该查看特定于该操作的配置。如果你需要在dev、staging和production中使用不同的资产服务器,请为你的资产服务器定义一个配置变量,并在不同的环境中分别设置该变量。如果你有一些只应在某些环境中运行的功能,比如发送邮件,请定义一个配置变量,表示是否使用该功能。
通常定义环境配置的方法是环境变量或配置文件。在你使用的Web框架中可能有一些标准方式来定义配置;如果有,请使用它。
无论是Java还是HTML,你的代码在所有环境中都应该是相同的。你希望编写和编译你的Java一次,并在所有环境中使用已编译的类而无需重新编译。在环境之间不同的所有内容都应该在配置中不同,而不是在代码中不同。(没有库常量。)因此,关于将错误的代码部署到错误的环境中的问题是不存在的;代码总是相同的。
你确实需要将正确的配置放在正确的环境中。如何做到这一点取决于你如何配置(再次检查你的框架文档),但通常只需在部署期间将环境变量设置或复制配置文件到位即可,不需要在此期间进行任何手动操作。
避免部署出错的方法是完全自动化,这样你只需要“按一个按钮”(实际上是运行一个脚本)就可以部署,没有手动细节会搞砸。
持续集成虽然必不可少,即使对于一个人也很有用(你想每次都手动运行构建吗?),但与你的问题主要无关。IntelliJ虽然很棒,在这里也不太相关。你的部署应该仅依赖于命令行工具。目前的最佳实践是为您的应用程序编写完整的自动化测试套件,在CI中自动运行它,并在测试通过时自动部署(“持续部署”),但这显然涉及到另一个主题。

1
正如Dave所建议的那样,针对每个环境可以更改的所有配置(包括第三方API连接、数据库连接、电子邮件处理、路径、日志设置等),都应该使用特定于环境的配置文件。这样,只要正确设置了该配置文件,软件就可以在任何平台上运行。请注意,这是特定于环境的配置... 应用程序本身的配置设置可能存储在其他地方(例如数据库、另一个文件等)。
更一般地说,此问题详细介绍了我们构建BuildMaster的原因。它更像是持续交付而不是持续集成工具(尽管它旨在执行两者或与现有工具(如Jenkins)集成),但它可以帮助您完成您在问题中列出的所有事情,特别是关于配置文件管理和意外部署预防的部分。它可以强制您按照特定的环境顺序进行操作,以确保代码在最终到达生产环境之前在每个环境中都经过测试,并通过将简单的操作添加到部署计划来自动处理特定于环境的配置文件部署。
虽然它不能直接与IntelliJ集成,但您应该使用某种形式的源代码控制 - 而CI方面可以在您签入更改或手动“创建构建”时检测到这些更改。
如果您感兴趣,我会从这里开始,并且应该很容易找出如何扩展流程以遵循您所想的流程。虽然示例基于 .NET,但是将这些操作替换为基于 Java 的操作很容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接