生产环境和开发环境同步

3

我在本地电脑和带有ssh的web服务器上都有一个Web应用程序。问题是,我正在本地开发该应用程序,并且我想通过其他方式将其与服务器同步,而不是通过ftp复制文件。是否有其他方法?git?


你了解从开发机器部署的风险吗?也许你的网站不够复杂,这并不重要,但也有可能呢? - mpeterson
但是我想在应用程序在运行时继续开发,而不会出现错误!这就是为什么我正在寻找简单的同步方式的原因... - Dimitar Vouldjeff
5个回答

8
你没有说明涉及的操作系统或语言,这使得具体解答很困难。
Git(以及SVN和Mercurial等)非常适合版本控制,但保持系统同步通常需要更多的工作。如果您熟悉 Python,则可以阅读现代Python黑客工具Virtualenv、Fabric、Pip,它讲解了如何保持整个环境的同步,而不仅仅是代码。
对于简单的两个系统间文件同步,我推荐使用rsync。我将其用于各种任务,无论是在单台计算机上还是在多台计算机之间备份/同步目录。我们在南加州有一个客户,正在进行超过5TB数据的三级备份策略(2个本地,1个远程),其中心是rsync和rsnapshot

评论更新:

无论你的网站是用什么语言编写的,你都必须确保所有更改都能够到达生产环境。这通常是一个多步骤的过程。Fabric专门设计了封装这些步骤并将它们简化为一个命令。而Pip和virtualenv则更加针对Python,可以捕获其他库的变化等,但Ruby/Rails也可能有相应的工具。目标是使用一个单一命令从开发环境转移到预发布环境,再使用另一个单一命令从预发布环境转移到生产环境。
请注意:不要直接从开发机器自动同步到生产目录。始终先进入生产机器上的中间预发布目录。两台机器几乎肯定不会有100%相同的环境,而在开发环境中有效的东西在生产环境中可能根本不起作用。最好花费额外的一两分钟在预发布环境中进行测试,而不是导致整个生产网站出现500错误。

我有一台“开发机”,我想将我的应用程序同步到我的生产服务器上。在这种情况下,它是Rails应用程序。 - Dimitar Vouldjeff

3

通常我会建议在您的开发环境中使用git

通过指定要构建的标签(以使您的构建经过审核且可重复),您的构建将构建一些可部署的内容(例如 .tar.gz),然后您可以使用ssh/scp将其复制到您的服务器上。

我不建议直接从开发环境进行同步。因为您需要用于开发、实验、支持工具和文件等方面。


3
你的开发和生产构建都应该从源代码库中自动构建。你还应该有一个自动化脚本来在开发和生产环境中部署。
然后,在生产部署时,只需将您的开发代码检入,运行构建脚本,然后运行生产部署脚本即可。
这适用于您使用的任何软件/环境/工具。

自动化构建并非总是必需的。这是经典的“如果锤子是你唯一的工具,那么所有东西看起来都像钉子”的心态。我们在asp.net中开发和管理多个大型应用程序,我们的流程包括标记->构建->部署到暂存区->测试->将暂存文件部署到生产环境。这个流程运行良好,从未让我们失望。 - Chris
我同意并不总是必要的,但重要的是要有一个经过记录、一致、可靠和可复制的部署程序。自动化是其中一种标准方法。然而,在这种情况下,该流程已经出现问题,但很容易修复。 - Larry Watanabe

2

Capistrano最初是专门用于部署Rails应用程序的,但现在已被扩展为可部署任何类型的Web应用程序(称为无需Rails部署)。

一旦设置完成,工作流程如下:

  1. 编辑程序源代码。
  2. 将更改检入并将其推送到中央仓库(git / mercurial / svn / 等)。
  3. 在程序上运行cap deploy

第3步是Capistrano发挥魔力的地方,也是它被开发出来的目的。Capistrano会从代码库中检出新的代码副本,将该代码复制到一个新的"发布"目录(类似于20091028230834这样的时间戳),最后将目录current链接到您的最新副本。在此过程中,如果存在迁移,则可能会运行迁移。最终您将得到一个像这样的目录结构:

...deploy-to-path/current  ->  ./releases/20091028230834
...deploy-to-path/releases/
    20091028230834/
    20091028225623/
    ...    # You can configure the number of releases kept after deployment.
...deploy-to-path/shared/
    cached-copy/  # A cached copy of your repository, which Capistrano updates
    ...           # Any shared data, like file uploads, for your application.

Capistrano的文档不是很好。他们真的需要有人来编写连贯的文档。然而,你所做的实际上是编写一个文件(deploy.rb),其中包含以下信息:
  • 服务器在哪里?(例如:www.example.com)
  • 您的ssh凭据是什么?(用户名、密码)
  • 您的代码存储在哪里?(您的仓库URL)
  • 您想要将代码放在服务器上的哪里?
为了开始使用,我建议在应用程序上运行capify(给自己默认文件),并在测试服务器上(或服务器上的测试目录)上运行它,以查看它的作用。一旦您让它部署某些内容,您可以自定义它以执行额外的移动/符号链接操作。

0

你还应该考虑一下你想要如何发布东西...不断推送变化到生产环境可能会使跟踪问题变得非常困难。

正如其他人所提到的,你可以使用 Git 同步来管理你的代码。当你有一组新的更改认为已经准备好时,这些更改可以放在一个分支中,或者至少标记它们,以便知道一组更改一起发送了什么。

然后,你可以将这些更改同步到一个暂存目录,并在那里验证完成后切换到它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接