1

好的,所以我在我的服务器上设置了一个 SVN 存储库。我有一个提交后挂钩设置,它更新到“DEV”文件夹,这样当我提交更改时,它会自动推送到我服务器上的“DEV”子域。

我现在需要的是一种在我准备好时将其推送到我的“实时”子域的简单方法。“实时”子域位于同一台服务器上,实际上,它与 DEV 的 svn update /... 命令相同,但路径不同。

我在想我可以在我的仓库中有一个特定的文件,也许我可以更改这个文件,然后在我的提交后文件中设置某种条件,如果该特定文件已经更改,也可以更新到我的“实时”目录.

但我不知道如何编写该代码。目前我的提交后文件如下所示:

#!/bin/sh

REPOS="$1"
REV="$2"

svn update /var/www/dev/public

我需要它来基本上做到这一点(但显然有正确的语法)

#!/bin/sh

REPOS="$1"
REV="$2"

svn update /var/www/dev/public
if (pushLive.txt has changed) {
  svn update /var/www/live/public
}

有人有什么建议吗?

4

2 回答 2

3

我不会通过提交后挂钩来执行此操作,因为更新可能需要很长时间。这意味着用户必须等待您的更新完成,然后才能再次控制他们的工作站。

看看詹金斯

Jenkins 是一个持续构建服务器,但即使您没有build也可以使用它。在您的情况下,您可以使用它来查看活动域的 Subversion 存储库。当 Jenkins 检测到对该 Subversion URL 的提交时,它可以产生一个构建过程。在您的情况下,它将更新实时服务器上的文件。

如果您的服务器是运行 Jenkins 的同一台机器,您可以轻松地将 Jenkins 工作目录指定为 /var/www/live/public 目录。(默认情况下,Jenkins 将在 下创建构建目录$JENKINS_HOME/jobs/<jobname>/workspace,但在 Jenkins 中有一个选项,您可以在其中指定它)。然后,根本不涉及任何编程。这比使用提交后挂钩更快、更容易。

顺便说一句,如果你走这条路,我建议你创建一个新的更新到一个干净的目录,然后重命名这个目录。否则,随着 Subversion 更新您的服务器,您将同时拥有来自先前和当前 Subversion 修订版的文件。如果在进行更新时有人在服务器上,这可能会导致问题。

于 2012-01-30T19:54:35.793 回答
2

不确定这是否是最有效的方法,而且第一种情况在技术上适用于名为“pushLive.txt”的文件,无论目录如何,所以你可能想玩这个或确保文件是唯一的......

#!/bin/sh

LOOK=/usr/bin/svnlook
REPOS="$1"
REV="$2"

for changes in `$LOOK changed $REPOS | awk '{print $1 "=" $2;}'`;
do

  idx=`expr index "$changes" =`;
  directory=${changes:$idx};
  action=${changes:0:$idx-1};

  case "$directory" in
    *pushLive.txt )
      case "$action" in
        "U" )
           svn update /var/www/dev/test/public
           ;;
      esac
      ;;
  esac
done

exit 0
于 2012-01-31T03:36:53.463 回答