好的,我的服务器上有一个SVN repo设置。我有一个post-commit钩子设置,更新到“DEV”文件夹,这样当我提交更改时,它会自动推送到我服务器上的“DEV”子域。
我现在需要的是在我准备好时将其推送到“实时”子域的简单方法。 “实时”子域位于同一服务器上,实际上,它与使用DEV的svn update / ...命令相同,但是与不同的路径相同。
我原以为我可以在我的仓库中有一个特定的文件,也许我可以更改这个文件,然后在我的post-commit文件中创建某种条件,以便更新到我的“live”目录,如果具体的话文件已更改。
但我不知道如何编写该代码。目前我的提交后文件如下所示:
#!/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
}
有人有什么建议吗?
答案 0 :(得分:3)
我不会通过post-commit钩子这样做,因为更新可能需要很长时间。这意味着用户必须等待更新完成才能再次控制其工作站。
看看Jenkins。
Jenkins是一个连续构建服务器,但即使您没有构建,也可以使用它。在您的情况下,您可以使用它来查看实时域的Subversion存储库。当Jenkins在Subversion URL上检测到提交时,它可以生成 build 进程。在您的情况下,它将更新实时服务器上的文件。
如果您的服务器是运行Jenkins的同一台计算机,您可以轻松地将Jenkins工作目录指定为/ var / www / live / public目录。 (默认情况下,Jenkins将在$JENKINS_HOME/jobs/<jobname>/workspace
下创建构建目录,但在Jenkins中有一个可以指定它的选项)。然后,根本没有编程。这比使用post-commit钩子更快更容易。
顺便说一句,如果您采用这种方式,我建议您创建一个干净目录的新更新,然后重命名该目录。否则,当Subversion更新您的服务器时,您将同时拥有来自先前和当前Subversion版本的文件。如果在更新发生时有人在服务器上,这可能会导致问题。
答案 1 :(得分:2)
不确定这是否是最有效的方式,而且这第一种情况在技术上将工作在一个名为“pushLive.txt”的文件而不管dir,所以你可能想玩那个或确保文件是唯一的..
#!/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