【发布时间】:2013-04-21 05:15:39
【问题描述】:
我最近加入了一家公司,担任发布工程师,该公司的大量开发团队以各种语言开发大量服务、应用程序、网络应用程序,它们之间存在各种相互依赖关系。
我正在尝试找到一种方法来简化并最好自动化发布。目前,发布团队正在执行以下操作来“发布”软件:
目前的发布过程
- 在 QA 和 INTEGRATION 分支之间区分来自 SCM 的最新版本。
- 在这些分支之间手动复制/粘贴“相关”更改。
- 将最新的二进制文件复制到正确的位置(这是使用 .cmd 脚本自动完成的)。
- 重启所有服务
我的问题
我希望完全避免步骤 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> 标记中的URL。这是因为 QA 和 INTEGRATION 环境位于不同的数据中心,并且稍微不同步(随着开发变得更快/更好/更强,它们会逐渐分开)。此类 URL/端点不同的更改在“发布”期间将被忽略(即这些不是“相关”更改以从 QA 合并到 INTEGRATION)。
即使在常规版本中(大约每周一次),我也必须处理必须从 QA 发布到集成的十几个配置文件更改,并且我必须手动检查每个配置文件并复制/粘贴非 URL 相关文件之间的变化。我不能简单地拿 CI 工具从 QA(或 QA 之后)吐出的整个包,因为 URL/端点不同。
由于使用了多种编程语言,上面的配置文件示例可以是 C#、C++ 或 Java。所以我希望任何解决方案都与语言无关。
环境/编程语言/操作系统/等的总结。
- 多种编程语言 - C#、C++、Java、Ruby。管理层意识到这是问题之一,因为发布团队必须是万事通并正在解决这个问题。
- 多操作系统 - Windows 2003/2008/2012、CentOS、Red Hat、HP-UX。管理层也在解决这个问题 - 开始整合并限制在 Windows 2012 和 CentOS。
- SCM - Perforce,TFS。管理层正试图让每个人都使用单一工具(可能是 TFS)
- CI 被提倡,但不是强制性的 - 管理层正在推动变革,但需要时间。
- 我已经给出了 QA 和集成的示例,但实际上有 QA(由开发人员+测试人员管理)、INTEGRATION(由我的团队管理)、STABLE(由我的团队发布到 STABLE 但由 Production Ops 支持)、PRODUCTION (由生产运营支持)。这些是官方环境 - 其他目前是非官方的,但开发人员或测试团队还有一些。我最终也想开始标准化/整合这些非官方环境,因为开发人员+测试不必担心做这类事情。
- 使用 DeployIT (http://www.xebialabs.com/products) 等工具来标准化二进制文件的部署方式需要做大量工作,这可能会提供一些方法来简化这些配置更改。
- 开发团队很灵活并且经常发布,但这只是意味着需要更多的工作来区分配置文件。
团队成员建议的解决方案:
- 目前的想法是使用 LoadBalancer 并在不同环境中标准化名称,但我不确定像这样的“流程”是否是正确的解决方案。一定有更好的方法可以从开发人员如何编写配置到发布环境如何满足依赖关系开始。
- 另外,一些团队成员正在开发安装脚本 (InstallShield / MSI),以在 env 之间自动查找/替换或 URL/enpoints。我希望这不是解决方案,但它是可行的。
如果我遗漏了什么或应该提供更多信息,请告诉我。
谢谢
[更新] 参考资料:
- Managing complex Web.Config files between deployment environments - 特定于 C# web.config,虽然是一个很好的开始。
- http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx - 好的,虽然乍一看,这似乎相当简陋,很容易坏。
【问题讨论】:
-
一件事 - 如果您使用 TFS,您将失去在非 MS 平台上执行构建的能力。此外,TFS 在 Visual Studio 中仍然工作得最好。我根本不会向跨平台团队推荐它,无论如何我也不会真正推荐它 TBH - FOSS 工具同样好,如果不是更好的话(或者 TFS 现在不会有半支持的 git 会不会!)。 Jenkins 作为 CI,Redmine 作为 PM,SVN(或 git)作为 SCM,你拥有比 TFS 更好的功能集。
标签: deployment language-agnostic release-management