SVN Apache post-commit更新Web文件

时间:2012-12-01 18:17:47

标签: php apache svn centos

所以我在我们的网络服务器上安装了SVN。我们的想法是将工作副本加载到开发人员计算机上,当它们提交(冲突协助)时,服务器执行提交后的bash。

存储库是基于每个项目的,想法是在提交后,bash文件需要强制删除整个项目文件夹和文件,并将更新的repo导回到项目文件夹中,以通过SVN保持网站更新......我知道这种方法肯定存在一些分歧,但它对我们有用......除了一件事......

当服务器重新导出项目时,对网站的任何请求都会引发错误,因为缺少大量的文件......有什么办法在SVN导出时“排队”apache / php,然后“恢复” “请求?

服务器很快导出文件,但有人抓住服务器并引发PHP错误的几毫秒......

请告诉我是否有一种典型的解决方法......

由于

4 个答案:

答案 0 :(得分:2)

您可以通过在新目录树中构建内容然后重命名来来最小化中断。也就是说,假设您的内容在/var/www/myproject下可用,您的更新后脚本将:

  • 填充/var/www/myproject.new
  • /var/www/myproject重命名为/var/www/myproject.old
  • /var/www/myproject.new重命名为/var/www/myproject
  • 删除/var/www/myproject.old

虽然不是原子更新,但执行两次重命名所需的时间很短,应该会大大改善这种情况。

答案 1 :(得分:1)

  1. 您不能导出整个树,而只能导出此修订中受影响的文件并替换文件而不删除网站
  2. 您仍然可以执行完全导出和完全替换,但不能删除挂钩的网站,只覆盖旧文件(在修订文件中删除,您在网站上保留完整,不会因为它们无关而破坏)并在夜间执行完全同步(每天或每周)cron-job

答案 2 :(得分:0)

我不知道以下是否对您的案例有用,但您可以制作两步代码升级脚本:

  1. tempdir中的SVN结帐
  2. 将生产目录中的所有代码替换为tempdir
  3. 中包含的数据
  4. 删除tempdir
  5. 你永远不会经历冲突。

    BTW我不认为这是最佳做法。您应该解决客户端开发人员计算机上的冲突。

答案 3 :(得分:0)

我真的觉得@Larsks的回答足够实用,可以提供当时几乎原子性和需要的解决方案,所以我保持他的回答是“正确的”,但我认为我会考虑This Post考虑以及:

假设mv是完全原子的,post-commit hook bash可能如下所示:

svn export file:///svn/repo /var/www/projectdir_NEW --force
mv /var/www/projectdir /var/www/projectdir_OLD
mv /var/www/projectdir_NEW /var/www/projectdir
rm -rf mv /var/www/projectdir_OLD

唯一的事情是2 mv命令之间的几秒钟,这是最接近原子和最干净的方式来做到这一点......但是,对于完全原子的影响,让我说我不介意使用小PHP,因为我的项目有一个全局的init.php,post-commit可以做到这一点:

date > /var/www/projectdir.updating
svn export file:///svn/repo /var/www/projectdir_NEW --force
mv /var/www/projectdir /var/www/projectdir_OLD
mv /var/www/projectdir_NEW /var/www/projectdir
rm -rf mv /var/www/projectdir_OLD
rm /var/www/projectdir.updating

创建一个名为“projectdir.updating”的临时文件,其中包含日期,执行更新,然后删除临时文件,我现在可以使用我的init.php来“限制”任何请求:

while (file_exists("/var/www/projectdir.updating")) usleep(200);

此外,我可以检查临时文件中保存的日期详细信息,以查找带错误的退出...(如果导出失败以删除.updating文件)