2

我的公司正在从 Visual Source Safe 过渡到 Subversion;我们的管道管理工具依赖于 VSS 提供的“影子文件夹”的存在,以便将代码从版本控制移动到各种测试环境。注意:我们使用一种解释性语言并将我们的源代码翻译成目标代码——目前,源代码和目标代码都处于版本控制之下(特别是为了满足管道管理机制的需要)。

作为一个迭代步骤,我试图用一点天赋来模仿影子文件夹功能,因为我希望在提交时开始翻译,这样我们就不需要在 Subversion 中存储源代码和目标代码。注意:我不得不破解这个过程,从执行所有内容的干净“构建”到只在提交期间翻译受影响的文件,因为否则它需要太长时间才能成为实时提交操作(将来我希望我们会放弃这个过程有利于一些不太互动的东西,例如每小时构建或诸如此类的东西)。

所有这些背景故事只是为了问一个问题:${user.dir} 属性是如何设置的?

这是我的提交后挂钩批处理文件(一切都在 Windows 上完成):

SET REPO=%1
SET REV=%2

FOR %%* IN (%REPO%) DO SET REPONAME=%%~n*

SET BUILDROOT=E:\builds
IF NOT EXIST %BUILDROOT% ( MKDIR %BUILDROOT% )
SET BUILDDIR=%BUILDROOT%\%REPONAME%
IF NOT EXIST %BUILDDIR% ( MKDIR %BUILDDIR% )
CD %BUILDDIR%

ECHO %CD%
ECHO %BUILDDIR%

C:\apache-ant-1.8.3\bin\ant -f C:\dev\shadow\build.xml -DWorkingDir=%BUILDDIR%\!build_work_dir -DSvnRepoUrl=file:///%REPO% -DFromRevision=%REV% > %BUILDDIR%\!last_build_result.txt 2>&1

最后一行是实际的 Ant 调用;您可以看到我正在将输出重定向到一个文件,该文件位于 %BUILDDIR% 或 E:\builds\ 中。该文件按预期创建,这表明 %BUILDDIR% 已正确设置,因此:

CD %BUILDDIR%

行应该已经执行。我知道 SVN 使用空环境启动提交后挂钩,但我希望更改其中的目录应该在启动 Ant 后保留状态。

后来,在我的 Ant 脚本中,我设置了我的 ${build.dir} 属性:

<property name="build.dir" value="${user.dir}\.build.${build.time}" />
<!-- delete the build.dir, just in case we attempt a new build within the same minute...
     TODO: we may need to account for concurrent builds; does SVN single-thread commits? -->
<delete dir="${build.dir}" />
<mkdir dir="${build.dir}" />

如果 %REPONAME%(在批处理文件中)是 DEMO,我预计当前工作目录是:E:\builds\DEMO,因此 ${build.dir} 应该类似于:E:\builds\DEMO.build。 20120622.1127,但它是:C:\dev\shadow.build.20120622.1127,而不是。

据我了解,Ant 只是从 Java 中提取System.Properties来获取 ${user.dir} 之类的东西—— ${user.dir} 被描述为User's current working directory。显然,根据我的实验,批处理文件中的初始设置和关于工作目录的 Java 调用之间存在交叉。

Ant 是否将工作目录更改为构建文件的位置?我没有找到任何文件表明它确实如此,但我可能只是忽略了一些东西。我已经定义了 %ANT_HOME%,但是考虑到 Subversion 的“空环境”,它不会被加载......也许这有效果?我需要进行调查,但希望有人可能会简单地知道这是如何工作的。

编辑(2012-06-22-16:38):

我尝试设置 %ANT_HOME%、%JAVA_HOME% 和 %JAVA_CMD%,但无济于事。

4

1 回答 1

1

当您在执行各种钩子的服务器上执行提交时,没有工作目录。这使得不可能通过钩子做你想做的事。

我建议你看看Jenkins。Jenkins 是一个持续集成服务器,可以在每次提交后运行您的 Ant 脚本。Jenkins 执行工作目录所需的检查和更新,并且可以在每次提交后执行此操作。因为 Jenkins 有一个工作目录,所以它可以毫无问题地运行你的 ant 程序。

另外,由于 Jenkins 是在提交完成后执行的,因此您的提交不会等待,这给了您的开发人员足够的时间来建立对您的仇恨。例如,如果您的钩子脚本执行需要 20 秒,则开发人员必须等待整整 20 秒才能继续。

Jenkins 还允许您将构建的对象存储在 Jenkins 中,因此它们不必存储在您的 Subversion 存储库中。这意味着很容易找到正确的版本,因为它在 Jenkins 中很容易找到。它可以防止您的 Subversion 存储库增长过快。

因此,请查看 Jenkins 作为您想要做的事情的解决方案。

于 2012-06-22T20:45:53.903 回答