12

我真的不知道如何在 Web 开发中正确执行从离线开发到实时网络服务器的部署。我主要依靠直觉,但这或多或少是我到现在为止所做的:我有一个用 python 或 php 编写的 Web 应用程序,并且我将它托管在一个实时网络服务器上。我用的是svn下的离线开发版本。

现在,当我开发离线版本时,我将对 svn 执行提交。当发布的时间到了,我可以:

  1. 将代码从离线服务器复制到实时网络服务器上的临时目录,然后将旧代码库与新代码库交换(例如,使用链接),或者...
  2. 让实时网络服务器在结帐 svn 上工作,然后运行 ​​svn 更新。

我通常做第二个,虽然如果我必须在实时部署之前升级数据库,我通常会编写升级 sql 脚本,然后先在实时数据库上运行它们,然后再结帐。

这项任务的最佳实践是什么?

4

6 回答 6

10

我建议利用 SVN 导出而不是结帐。这样,您就不会向世界公开任何 SVN 文件。它通常还会创建更清晰的文件夹结构。

我之前在舞台和生产之间移动文件时利用了 rsync。

我的典型部署过程如下:

  • 备份生产站点
  • 从备份恢复到暂存服务器
  • 从所有外部 IP 地址锁定服务器
  • 将代码从存储库导出到一个临时文件夹(可选地区分两个文件夹以进行小的更改)
  • rsyc 文件从临时文件夹到舞台服务器文件夹
  • 验证只有您希望更改的文件实际上已更改。
  • 将 SQL 脚本应用到数据库
  • 测试升级
  • 解锁网络服务器

现在,要部署到生产环境,请快速重播这些步骤。使用脚本会更容易。

于 2009-08-11T19:03:38.953 回答
4

您应该考虑一些部署脚本来自动化所有这些。这将有助于防止你犯错误。SQL 升级脚本是一种生活方式,但您应该始终在实时数据库的副本上测试它们,然后再在真实数据库上运行它们。

您可能会考虑拥有一台登台服务器。您进行本地更改,然后 svn checkout 到登台服务器并在那里运行升级脚本。您在登台服务器上进行验收测试。当一切正常时,您将 everhting 部署到实时服务器。这应该像运行一些脚本一样简单。即update-staging.pl 和update-prod.pl。

您可以通过将版本表添加到您的数据库来使您的 sql 脚本更容易自动化。每当您创建更新脚本时,您都会使用版本对其进行标记。然后部署脚本可以查看更新脚本的版本和数据库的版本,并根据需要应用更新。这也使得从备份恢复变得可行。如果您进行了更改,然后恢复到备份,您只需运行升级脚本,它就会通过并将数据库更新到当前版本。

于 2009-08-11T19:02:16.273 回答
3

我使用Capistrano编写脚本并自动执行部署过程。cap deploy以下是我从本地工作站进入时发生的情况的概要:

卡皮斯特拉诺会。. .

  1. 在我的网络服务器上的时间戳目录(例如 to /var/http/mywebsite.com/releases/20090715014527)中检出最新版本的源代码,如有必要,会在我的本地工作站提示我输入任何密码。

  2. 运行预处理脚本(例如更新数据库模式)

  3. 将站点软链接到实时目录:

    ln -sf /var/http/mywebsite.com/releases/20090715014527 /var/http/mywebsite.com/current

  4. 运行后处理脚本(例如,您可能需要重新启动 apache 之类的)

如果在此过程中出现任何问题,Capistrano 将回滚到之前的工作版本。

虽然 Capistrano 是用 Ruby 编写的,但它可以以任何语言/框架部署 Web 应用程序。有关想法,请参阅教程的“部署非 Rails 应用程序”部分。railsless -deploy似乎对于使用 Capistrano 管理部署 PHP 和 Python 应用程序特别有用。

于 2009-08-11T19:07:32.987 回答
1

理论上,我会将 svn 导出到网络服务器上的新区域。然后重新配置网络服务器以使用新区域并重新启动。

于 2009-08-11T19:01:42.983 回答
1

对于小型的、基于 php 的系统,我们以前做的是这样的:

对于代码更改,我们使用从 Eclipse 运行的 ant 脚本比较本地(dev)系统和远程(qa/prod/whatever)系统,然后压缩所有更改的文件,将 zip 压缩到远程系统并解压缩目标。当然我们有自动备份之类的。如果对此感兴趣,我将能够在接下来的几天内发布一个示例脚本。

对于 sql 更改,我们尝试为每个更改维护一个脚本(通常在我们的错误跟踪器中)并在目标系统上手动运行每个更改。

对于大型系统,您应该真正使用更强大的东西。

请注意,如果您的 prod 系统直接从 svn 中提取,那么您正在部署可能尚未正确测试的更改(您可能忘记提交某些内容,测试您的本地系统,并且一切都会在 prod 中中断......)

于 2009-08-11T19:08:04.203 回答
1

我会推荐第一个选项。如果您有一个结构,您可以放置​​代码版本并通过更改链接在它们之间切换,那么回滚比只有 svn checkout 容易得多。使用 svn 您必须与以前的版本合并才能恢复。

于 2009-08-11T19:09:17.570 回答