将管理发布到不同的环境(Dev / QA / Integration / Stable)

时间:2013-04-26 23:05:29

标签: deployment language-agnostic release-management

我最近加入了一家公司作为发布工程师,大量的开发团队开发了大量的服务,应用程序,各种语言的Web应用程序,并且具有各种相互依赖关系。

我正试图找到一种简化方法,最好是自动发布。目前,发布团队正在执行以下操作来“发布”该软件:

当前发布流程

  1. 在QA和INTEGRATION分支之间区分SCM的最新版本。
  2. 在这些分支机构之间手动复制/粘贴“相关”更改。
  3. 将最新的二进制文件复制到正确的位置(使用.cmd脚本自动完成)。
  4. 重新启动任何服务
  5. 我的问题

    我希望完全(显然)避免步骤1.和2.但是我遇到的问题是环境之间的差异导致配置文件对于不同的环境(例如QA与INTEGRATION)不同。这是一个示例:

    在QA环境中:

    <setting name="ServiceUri" serializeAs="String">
            <value>https://servicepoint.QA.domain.net/</value>
    </setting>
    

    在整合环境中:

    <setting name="ServiceUri" serializeAs="String">
            <value>https://servicepoint.integration.domain.net/</value>
    </setting>
    

    如果你仔细观察,那么上面两个<setting>标签之间的唯一区别就是<value>标签中的网址。这是因为QA和INTEGRATION环境位于不同的数据中心,并且几乎没有同步(随着开发变得越来越快/越来越好/越来越强大,它们也越来越分开)。在“发布”期间,URL /端点不同的更改将被忽略(即这些非“相关”更改以从QA合并到INTEGRATION)。

    即使在常规版本中(大约每周一次),我也必须处理十几个配置文件更改,这些更改必须从QA发布到集成,我必须手动浏览每个配置文件并复制/粘贴非URL相关文件之间的变化。我不能简单地使用CI工具从QA(或QA之后)吐出的整个包,因为URL /端点是不同的。

    由于使用了多种编程语言,上面的配置文件示例可能是C#,C ++或Java。所以我希望任何解决方案都与语言无关。

    环境/编程语言/ OS / ETC概要

    1. 多种编程语言 - C#,C ++,Java,Ruby。管理层意识到这是一个问题,因为发布团队必须成为所有行业的王者并正在解决这个问题。
    2. 多个操作系统 - Windows 2003/2008/2012,CentOS,Red Hat,HP-UX。管理层也正在解决这个问题 - 开始整合和限制Windows 2012和CentOS。
    3. SCM - Perforce,TFS。管理层正试图将每个人都转移到一个工具(可能是TFS)
    4. CI正在被提倡,虽然不是强制性的 - 管理层正在推动变革,但需要时间。
    5. 我举了QA和INTEGRATION的例子,但实际上有QA(由开发人员+测试人员管理),INTEGRATION(由我的团队管理),STABLE(由我的团队发布到STABLE但由生产行动支持),PRODUCTION (由生产行动支持)。这些是官方环境 - 其他人目前都是非正式的,但开发人员或测试团队还有一些。我最终也想开始标准化/巩固这些非正式的环境,因为开发人员+测试不应该担心做这种事情。
    6. 使用DeployIT(http://www.xebialabs.com/products)等工具来标准化二进制文件的部署方式正在做很多工作,这可能会提供一些简化这些配置更改的方法。
    7. 开发团队很敏捷并且经常发布,但这只意味着更多的工作差异配置文件。
    8. 团队成员建议的解决方案:

      1. 目前的思维方式是使用LoadBalancer并在不同的环境中标准化名称,但我不确定这样的“过程”是否是正确的解决方案。必须有一种更好的方法可以从开发人员如何编写配置文件来解决发布环境如何满足依赖关系。
      2. 或者,一些团队成员正在使用安装脚本(InstallShield / MSI)来自动执行env之间的查找/替换或URL / enpoint。我希望这不是解决方案,但它是可行的。
      3. 如果我遗漏了任何内容或应提供更多信息,请告知我们。

        由于

        [更新] 参考文献:

        1. Managing complex Web.Config files between deployment environments - 特别是C#web.config,虽然是一个非常好的开始。
        2. http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx - 好的,虽然初看起来似乎相当简陋,可能很容易破解。

4 个答案:

答案 0 :(得分:0)

通常问题并不太难 - 您需要为每个环境分支分支,并为它们建立CI构建设置。因此,与QA分支的合并将触发该代码的构建和QA的自定义部署。简单。

现在管理多个配置文件并不容易(除非每个环境都有1个,在这种情况下你只需要将它们称为Int.config,QA.config等,将它们全部存储在SCM中,并选择适当的在每个分支的部署脚本中使用一个 - 例如,当QA的构建运行时,它选择qa.config并将其复制到正确的位置并将其重命名为正确的名称)(顺便说一句,这是我倾向于使用的方法它非常简单。)

如果您需要使用多个配置,那么它始终是一个手动过程 - 但您可以通过将所有相关配置复制到管理员将用于执行部署的构建暂存区域来帮助自己。它是一个很好的第一步,因为它们在暂存目录中的构建对他们来说是正确的,他们只需选择在哪个配置中使用(例如作为安装程序中的选项)或手动复制适当的配置结束了。

我不会尝试管理一些在源代码管理中获取单个配置文件并使用构建中的不同数据或预部署步骤重写它的自动方式。这种方式就是疯狂,以及为维护数据和工具而进行的大量持续麻烦。保持单独的配置,并确保开发人员知道在他们进行更改时更新所有配置。 (或者,你可以在SCM树中保存1个配置,并确保他们知道合并他们的更改不得覆盖任何现有的修改 - 多个配置更容易)

答案 1 :(得分:0)

我同意@gbjbaanb。为每个环境配置一个配置。让开发人员编写从配置文件中读取其属性(包括其URL)的应用程序,并为每个环境提交配置文件。这不仅有助于您进行部署,而且修订控制下的配置文件还提供了可重复性,完全透明性以及环境特定设置的审计跟踪。

就个人而言,我更喜欢通过包含所有环境配置(甚至是您未使用的环境配置)来创建适用于任何环境的单个可部署包。然后,您可以使用一些部署自动化来确定应用程序应使用哪些配置文件并对其进行适当设置。

答案 2 :(得分:0)

感谢@gman和@gbjbaanb的答案(https://stackoverflow.com/a/16310735/143189https://stackoverflow.com/a/16246598/143189),但我觉得他们没有帮助我解决我所面临的根本问题,并重申了说清楚。

  • 代码似乎非常了解它们运行的​​环境。如何编写与环境无关的代码?

上述答案中的建议是为每个环境(environment-config)存储1个配置文件。这是可能的,但任何添加/删除/编辑非环境设置都必须移植到每个environment-config。

经过一番研究,我想知道以下情况是否会更好?

  • 保持配置文件的结构一致/标准化,例如XML。尝试将特定于环境的端点保留在此配置文件中,但以允许轻松访问特定单个节点/设置的方式存储它们(例如,使用XPath)。
  • 部署到特定环境时,您的部署工具应该能够解析(例如使用XPath)并将特定于环境的端点更新为您要部署的特定环境的值。

以上不是一个独特的想法。现有的一些实现已经解决了上述解决方案:

  1. http://www.iis.net/learn/develop/windows-web-application-gallery/reference-for-the-web-application-package&amp; http://www.iis.net/learn/publish/using-web-deploy/web-deploy-parameterization(WebDeploy)
  2. http://docs.xebialabs.com/releases/3.9/deployit/packagingmanual.html#using-placeholders-in-ci-properties(DeployIt)
  3. 使用XPath查找和替换的主页解决方案。
  4. 简而言之,虽然存在特定于编程语言的解决方案和与编程语言无关的解决方案,但我认为最大的缺点是发布管理在开发过程中也需要考虑,否则会导致部署问题 - 我不会不喜欢这样,因为它听起来像“开发应该知道将要设计什么样的测试”。是否需要以及避免这种情况的方法,是一个很大的问题。

答案 3 :(得分:0)

我正在为Web应用程序创建一个“部署管道”的过程,并且正在筛选我遇到的类似问题。你的环境听起来比我们的环境更复杂,但我有一些想法。

首先,阅读本书,我是2/3通过它的方式,它回答了我曾经遇到过的关于软件交付的每一个问题,以及许多我从未想过要问的问题:http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912/ref=sr_1_1?s=books&ie=UTF8&qid=1371099379&sr=1-1

版本控制系统是您最好的朋友。绝对应该可以从您的VCS中检索构建可部署包所需的所有内容。

使用Continuous Integration服务器,我们使用TeamCity,到目前为止对它非常满意。

CI服务器构建与最终目标环境完全无关的软件包。我们仍然有很多“知道”目标环境的代码,这当然意味着如果我们添加一个新环境,我们必须修改所有这些代码以确保它能够应对,然后重新测试它以确保我们没有在这个过程中破坏任何东西。我现在看到这很容易出错,完全可以避免。

像Visual Studio这样的工具支持配置文件转换,我们简要地看了一下,但很快意识到它依赖于用代码编写的特定于环境的配置文件,由开发人员添加到包中。相反,将特定于特定环境的任何设置分解为其自己的配置机制(例如,另一个xml文件),并让部署工具在部署时将其应用于包。将这些文件保存在VCS中,但使用单独的存储库,以便配置的修订不会触发新的构建并导致构建号错误地膨胀。

这样,您的特定于环境的配置文件仅包含基于每个环境更改的内容,并且仅当该环境需要与默认环境不同的内容时才包含。与@ gbjbaanb的建议相反,我们计划做任何必要的事情来保持包“纯”和特定于环境的配置分开,即使它需要自定义脚本等等所以我想我们正走在疯狂的道路上。 : - )

对我们来说,Powershell,XML和Web Deploy参数化将起到重要作用。

我还打算在重构配置文件时非常积极,以便在不同的地方不会重复多次相同的信息。

祝你好运!