it-swarm.cn

部署复杂的变更

有时,我们需要对网站部署相当复杂的更改,这些更改需要更改数据库(新表或更改的表)和动态源代码(例如PHP或ColdFusion)。在不破坏实时网站上的所有内容的情况下,快速打包和部署这些更改的最佳方法是什么?

4
Justin Scott

简短的回答:这是一个痛苦的脖子!

我不得不多次这样做(每次都让我想在我下一个项目中更多地考虑我的设计)。我所做的是将代码库分叉到开发部分(或文件夹或服务器等),以便我可以单独处理它,以确保在迁移到部署之前所有的错误都已经完成。然后我创建一个始终具有相同前两行的SQL脚本:

DELETE IF EXISTS newDatabaseName;
CREATE DATABASE newDatabaseName;

这将确保脚本将所有内容放入一个完全新鲜且空的数据库中。脚本的其余部分将重新创建我从旧数据库重用到新数据库的所有表。然后我将新的(或修改的)表创建到新数据库中。最后,我将把所有数据从实时服务器移动到开发服务器。这可能需要很长时间,具体取决于您移动的数据量以及移动速度,因此我建议您仔细考虑脚本,因为您被迫运行的越少越好。

在我启动并运行新的开发数据库之后,剩下的就是创建新的代码来使用它。一旦被清除,那么部署应该相对容易(尽管可能很耗时)。只需使用相同的脚本将所有新的实时数据复制到部署服务器上的新数据库,并将所有新代码复制到那里,您就完成了!

这就是我这样做的方式,虽然很痛苦,但确实有效。如果有更好的方法,我会很高兴听。

更新:在回应Tchalvak的评论时,是的,我通常使用以下内容来获取所有表定义而没有他们的实际数据:

mysqldump --databases --no-data databaseName > newScript.sql

然后,我将如上所述更改此脚本。

3
Mike

为了获得“回滚能力”,我真的建议了解(好) gitMercurial(分布式版本控制系统)

您应该在平面文件中使用源代码的日子已经过去了(现在您应该在平面文件中使用它,但有一个非常强大的变更控制系统跟踪它们)。

2
Kzqai

我一般都做(对于LAMP风格的网站):

  1. 定义你的更改然后编写一个脚本来应用它们(我使用Makefile)。
  2. 测试您对代表真实环境的数据样本的更改
  3. 测试再次确认
  4. 给自己一个出路,有能力回滚

如果您正在运行群集,那么您可能会遇到更大的问题,包括站点状态,缓存等。

0
Aiden Bell