使用FTP从SVN部署PHP到远程服务器,每次提交后都需要进行部署。

17

每次提交后,我找不到将Php部署到远程服务器并使用FTP的解决方案。如何通过FTP上传仅已添加或已编辑的文件,并从SVN中删除已删除的文件?我考虑编写post-commit脚本...


2
Post-commit脚本挂钩是正确的,但您不应该使用FTP而是使用rsync将其传输到新主机。 FTP无法确定哪些内容已被编辑,哪些未被编辑。像Pekka建议的那样检查Phing以及这篇博客文章:http://blog.fedecarg.com/2008/07/21/filesynctask-using-phing-to-synchronize-files-and-directories/ - Gordon
1
如果可能的话,也考虑在远程服务器上使用 SVN。给它只读限制访问,并在仓库上安装一个 post-commit 钩子,通知远程服务器首先还原,然后更新其工作副本。在这种情况下,您可能还需要拒绝对任何“.svn”文件夹的网络访问。此外,考虑使用分支来确保服务器不会检出从主干提交的每个提交。 - Arc
我不认为解决方案需要基于PHP,只是为了转移一个PHP网站。 - Mark W
9个回答

13

很好的问题!

我不确定是否存在仅使用PHP来同步文件的方法。

通常我会使用第三方FTP同步工具,如rsyncScriptFTP(商业软件)来完成同步部分。

可以看看phing,它有一些FTP扩展(称为“任务”)。但我没有实际经验。

这篇博客文章提供了许多思路和方法:使用Phing与共享主机同步文件


我没有使用Phing,而是使用Ant,结果是我只能将所有新的源代码从SVN复制到远程服务器。不能仅同步新提交的文件。远程服务器可能是Windows操作系统,因此我无法使用rsync。 我只想模拟Springloops.com的部署过程。 他们在这方面做得非常完美。 - user312729

6

您可以使用svn2web通过FTP将每个提交的文件上传到服务器。Svn2web是一组PHP脚本,可用作svn挂钩。您可以将FTP服务器的地址、用户名和密码设置为目录上的svn属性。非常好用!


感谢您的回答。但是提交可能会在svn上删除一些文件。我需要将svn与部署服务器同步。 - user312729
如果您在存储库中删除文件,svn2web 也会将其从 FTP 中删除。这不是一件好事吗? - murze

3

我使用http://svn2ftp.com,它是一个SVN主机,允许在每次提交时远程部署到S/FTP!


(注:SVN是一种版本控制工具,S/FTP是指安全文件传输协议)

3
如果您不想自己管理脚本,但只是想要一个可用的东西,您可以尝试使用托管服务。我使用的是Deploy,它非常适合您所描述的情况。而且,如果您只有一个需要部署的项目,甚至是免费的。

2

1
我喜欢你的回答,因此你有我的悬赏奖励。 - Mark W

1

可能是一个 cron + bash 脚本,用来进行 svn up 操作?


1

你有考虑过 Beanstalk 吗?它可以让你一键部署你的 Subversion 和 Git 项目到 FTP 服务器上。不过它是收费的。另一个免费的替代方案是设置一个持续集成服务器,该服务器将运行一个 Rake 脚本来执行你的部署。


1
你可以将SVN检出到你的服务器上(从SVN创建工作副本到生产服务器),每当你想要部署新版本时,只需通过SSH连接到服务器并键入“svn update”,然后你就完成了。只有最近编辑过的文件会被部署,不到一秒钟的时间,你就可以在生产环境中更新到最新版本。

0

如果您的服务器是基于Linux的,最好的方法是将SVN导出到一个新目录,然后将新目录移动以替换旧目录(最好使用符号链接来连接不同版本的站点)。这样,在同步文件时,如果单个文件发生了重大变化,则网站会中断,而如果您使用rsync并且有一个大型站点,则网站将在所有文件同步之前被破坏。

至于启动此过程的最佳方法是使用svn钩子。在发布之前进行一些自动化测试(用于基本功能),因为有时可能会严重破坏您的主干,并且该站点肯定会关闭:)

我们目前正在将上述方法应用于生产环境,设置如下:

  • 提交进入主干
    • 在实际提交之前,对代码运行测试以查看是否一切正常
  • 经过几次提交后,进行部署(通常由开发人员监督)
    • 再次运行测试
    • 如果测试成功-一切正常
    • 如果失败,则返回旧的导出文件夹,网站将完全恢复正常

所有内容都是使用标准控制台命令编写的PHP。


我不想将svn上新版本的所有文件都导出到远程部署文件夹中。 我只想通过上传新文件、覆盖编辑过的文件以及根据提交删除文件来进行同步。请给我展示一个例子。 - user312729
3
那么,你为什么不将你的产品网站设为svn检出,并在提交时进行更新呢?另外,你应该禁止访问.svn文件夹,这样它就能按照你想要的方式工作。如果SVN仓库与网站位于同一服务器上,只需将/path/to_svn/repos/someproject/hooks/post-commit制成可执行文件,并使其看起来像:#!/bin/bash <newline> svn update /path/to/website<endfile>即可。 - bisko

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