我最近加入了一家公司,担任发布工程师,该公司的大量开发团队以各种语言开发大量服务、应用程序、Web 应用程序,它们之间存在各种相互依赖关系。
我正在尝试找到一种方法来简化并最好自动化发布。目前,发布团队正在执行以下操作来“发布”软件:
目前的发布过程
- 在 QA 和 INTEGRATION 分支之间区分来自 SCM 的最新版本。
- 在这些分支之间手动复制/粘贴“相关”更改。
- 将最新的二进制文件复制到正确的位置(这是使用 .cmd 脚本自动完成的)。
- 重启任何服务
我的问题
我希望完全避免第 1 步和第 2 步(显然),但我遇到了环境之间的差异导致配置文件因不同环境而异(例如 QA 与集成)的问题。这是一个示例:
在 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>
上面两个标签之间的唯一区别就是标签中的 URL <value>
。这是因为 QA 和 INTEGRATION 环境位于不同的数据中心,并且稍微不同步(随着开发变得更快/更好/更强,它们会逐渐分开)。在“发布”期间将忽略诸如此类 URL/端点不同的更改(即,这些不是从 QA 合并到集成的“相关”更改)。
即使在常规版本中(大约每周一次),我也必须处理必须从 QA 发布到集成的十几个配置文件更改,并且我必须手动检查每个配置文件并在文件。我不能简单地获取 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 和 INTEGRATION 的示例,但实际上有 QA(由开发人员 + 测试人员管理)、INTEGRATION(由我的团队管理)、STABLE(由我的团队发布到 STABLE 但由 Production Ops 支持)、PRODUCTION(由生产操作)。这些是官方环境 - 其他目前是非官方的,但开发人员或测试团队还有一些。我最终也想开始标准化/整合这些非官方的环境,因为开发人员+测试不应该担心做这种事情。
- 使用 DeployIT ( http://www.xebialabs.com/products ) 等工具来标准化二进制文件的部署方式有很多工作要做,这可能会提供一些方法来简化这些配置更改。
- 开发团队很敏捷并且经常发布,但这仅仅意味着更多的工作来区分配置文件。
团队成员建议的解决方案:
- 当前的心态是使用 LoadBalancer 并在不同环境中标准化名称,但我不确定这样的“流程”是否是正确的解决方案。必须有一种更好的方法可以从开发人员如何编写配置到发布环境如何满足依赖关系开始。
- 或者,一些团队成员正在研究安装脚本(InstallShield / MSI)以自动查找/替换或 envs 之间的 URL/enpoints。我希望这不是解决方案,但它是可行的。
如果我遗漏了什么或应该提供更多信息,请告诉我。
谢谢
[更新] 参考资料:
- 在部署环境之间管理复杂的 Web.Config 文件- 特定于 C# web.config,虽然是一个很好的开始。
- http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx - 好的,虽然乍一看,这似乎相当初级,可能很容易破坏。