我的构建脚本包含一个本地属性文件,用于设置特定于机器的值(例如构建的基本目录)。这些对于下载源的每台计算机都是唯一的。
如果构建代理程序尚未运行一段时间,它将删除项目的工作文件夹并最终删除属性文件。稍后进行更改时(在构建代理清理最近未使用的文件夹的一段时间之后),构建会中断,直到恢复属性文件。
我不确定正确的方法是阻止TeamCity的构建代理删除该文件夹/文件(不确定如何完成此操作,这似乎是最简单的解决方案),或者让构建脚本尝试生成属性文件时运行构建并且属性文件不存在。
热切欢迎任何建议!
答案 0 :(得分:1)
此属性文件来自哪里?它是由您的脚本生成的吗?
TeamCity从源服务器获取源文件,因此可以清除它,您不能依赖于克隆后放入该源的文件。
您可以做的是将此文件的副本放在安全的地方,并在脚本中将此文件复制到您需要的位置。
答案 1 :(得分:0)
避免特定于机器的行为是构建服务器的目标之一,因此TeamCity的设计并不容易。
关于您提到的特定属性,如果构建的基本目录始终是相对于checkout目录的相同路径,则可以在构建配置中设置环境变量,例如。设置env.BASE_DIRECTORY = %system.teamcity.build.checkoutDir%/build
。
答案 2 :(得分:0)
你的两个建议都有效。我最终将从(签入)模板文件生成文件并修改机器的属性。
@Mark Raymond:您的评论非常有效。 TeamCity绝对不会让事情变得简单。您的解决方案可行,但我赞成修改构建脚本以生成文件,因为它可以帮助其他开发人员,他们下载新代码,在不构建特定于构建机器的解决方案的情况下启动和运行。
@Gerald:那就是最终,我必须要做的事情。我在下面发布了我的Nant目标供参考:具体问题是设置一个基本目录,可以相对设置其他路径。以下是我最终采用的解决方案:
<target name="assert.local.properties.exists">
<if test="${not file::exists('local.properties.xml')}">
<copy file="local.properties.xml.template" tofile="local.properties.xml" overwrite="false"/>
<xmlpoke
file="local.properties.xml"
xpath="/properties/property[@name = 'base.dir']/@value"
value="${directory::get-current-directory()}" />
<include buildfile="local.properties.xml" />
</if>
</target>