我公司正在从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使用empty environment启动了post-commit钩子,但我希望更改其中的目录应该在启动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}被描述为用户的当前工作目录。显然,根据我的实验,在批处理文件中的初始设置和关于工作目录的Java调用之间会有一些交叉。
Ant是否将工作目录更改为构建文件的位置?我没有找到任何建议它的文件,但我可能只是忽略了一些东西。我定义了%ANT_HOME%,但是给定Subversion的“空环境”,它不会被加载...也许这有效果?我需要调查,但希望有人可能只是知道这是如何工作的。
编辑(2012-06-22-16:38):
我尝试设置%ANT_HOME%,%JAVA_HOME%和%JAVA_CMD%,但无济于事。
答案 0 :(得分:1)
在执行各种挂钩的服务器上执行提交时,没有工作目录。这使得无法通过钩子做你想做的事。
我建议你看看Jenkins。 Jenkins是一个持续集成服务器,可以在每次提交后运行Ant脚本。 Jenkins执行工作目录所需的检出和更新,并且可以在每次提交后执行此操作。因为Jenkins有一个工作目录,它可以毫无问题地运行你的ant程序。
另外,由于Jenkins在提交完成后执行,因此您的提交不会等待,这会让您的开发人员有足够的时间来建立对您的仇恨。例如,如果你的钩子脚本需要20秒才能执行,开发人员必须等待整整20秒才能继续。
Jenkins还允许您将构建的对象存储在Jenkins中,因此它们不必存储在Subversion存储库中。这意味着很容易找到正确的版本,因为它在Jenkins很容易找到。它使您的Subversion存储库不会过快增长。
所以,看看Jenkins作为你想要做的事情的解决方案。