鉴于一个大型软件项目,其中包含使用不同语言编写的多个组件,配置文件,配置脚本,环境设置和数据库迁移脚本 - 部署到生产的常见做法是什么?
需要考虑哪些困难?可以使用Ant或Maven等工具简化流程吗?如何处理回滚和数据库管理?是否建议对生产环境使用版本控制?
答案 0 :(得分:10)
答案 1 :(得分:3)
免责声明:在我工作的地方,我们使用我写的内容,我将提及
我会告诉你我是怎么做的。
对于配置设置以及代码和内容的一般部署,我使用NAnt,CI服务器和dashy(自动部署工具)的组合。您可以将dashy替换为任何其他“东西”,自动上传到您的服务器(可能是capistrano)。
对于数据库脚本,我们使用RedGate SQL Compare获取脚本,然后对于大多数更改,我实际上手动创建(如果适用)。这是因为有些变化有点复杂,我觉得手工操作更舒服。您实际上可以使用此工具为您执行此操作(或至少生成脚本)。
根据您的语言,有一些工具可以为您编写数据库更新脚本(我想这个论坛上有人写了一个;希望他会回复),但我没有经验。这是我想补充的内容。
<强>难点强>
我忘了回答你的一个问题。
更新任何非常复杂/分布式站点的最大问题是数据库同步。您需要考虑是否有任何停机时间,如果这样做,DB会发生什么。你会关闭所有东西,以便不能处理任何交易吗?或者您将所有内容转移到一台服务器,更新DB B,然后同步DB A&amp; B,然后更新DB B?或其他什么?
无论你选择什么,你都需要选择它,并且要么说“每次更新都好,将有X停机时间”,或者其他什么。请记录下来。
你可以做的最糟糕的事情是某人交易失败,中间处理,因为你正在更新该服务器;或以某种方式只留下部分系统运作。
答案 2 :(得分:1)
我认为您对使用版本控制没有任何选择。
你不能没有版本控制(如评论中所述)。
我正在谈论经验,因为我目前正在一个网站上工作,我们有几个必须一起工作的项目:
这是有效的,因为我们使用版本控制,但我必须承认我们的数据库非常简单,并且因为部署是自动化的。
版本控制意味着我们实际上在任何时间点都有几个并发版本的消息,数据库,静态资源和Java小程序。
在“后退”事件中尤为重要。如果你在加载新软件时发现了一个缺陷并且突然你负担不起,那么如果你没有版本化就会出现危机,如果有的话,你只需加载旧软件。
正如我所说,部署是脚本化的: - 首先部署静态资源(+ Java applet) - 接下来是数据库,几个配置同步,因为它们是版本化的 - 软件在“酷”时间窗口排队等待(当我们的流量处于最低点时,所以在晚上)
当然,我们会处理外部服务器的向后/向前兼容性问题,这不应该被低估。