我最近加入了一家公司作为发布工程师,大量的开发团队开发了大量的服务,应用程序,各种语言的Web应用程序,并且具有各种相互依赖关系。
我正试图找到一种简化方法,最好是自动发布。目前,发布团队正在执行以下操作来“发布”该软件:
当前发布流程
我的问题
我希望完全(显然)避免步骤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概要
团队成员建议的解决方案:
如果我遗漏了任何内容或应提供更多信息,请告知我们。
由于
[更新] 参考文献:
答案 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/143189,https://stackoverflow.com/a/16246598/143189),但我觉得他们没有帮助我解决我所面临的根本问题,并重申了说清楚。
上述答案中的建议是为每个环境(environment-config)存储1个配置文件。这是可能的,但任何添加/删除/编辑非环境设置都必须移植到每个environment-config。
经过一番研究,我想知道以下情况是否会更好?
以上不是一个独特的想法。现有的一些实现已经解决了上述解决方案:
简而言之,虽然存在特定于编程语言的解决方案和与编程语言无关的解决方案,但我认为最大的缺点是发布管理在开发过程中也需要考虑,否则会导致部署问题 - 我不会不喜欢这样,因为它听起来像“开发应该知道将要设计什么样的测试”。是否需要以及避免这种情况的方法,是一个很大的问题。
答案 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参数化将起到重要作用。
我还打算在重构配置文件时非常积极,以便在不同的地方不会重复多次相同的信息。
祝你好运!