如何防止 TeamCity Build 代理删除工作文件夹
How to prevent TeamCity Build agent from removing work folders
我的构建脚本包含一个本地属性文件,用于设置特定于机器的值(例如构建的基目录)。对于将源下载到的每台计算机,这些都是唯一的。
当构建代理 运行 有一段时间未使用时,它会删除项目的工作文件夹并最终删除属性文件。当稍后进行更改时(在构建代理清理最近未使用的文件夹的一段时间后)构建中断,直到属性文件被恢复。
我不确定正确的方法是阻止 TeamCity 的构建代理删除那个 folder/file(不确定如何完成这个,这似乎是最简单的解决方案)或让构建脚本尝试生成构建为 运行 且属性文件不存在时的属性文件。
热切欢迎任何建议!
这个属性文件是从哪里来的?它是由您的脚本生成的吗?
TeamCity 从源服务器获取源文件,因此它可能会被清理,您不能依赖克隆后放入该源的文件。
您可以将此文件的副本保存在安全的地方,然后在您的脚本中将此文件复制到您需要的位置。
避免特定于机器的行为是构建服务器的目标之一,因此 TeamCity 的设计并不是为了让它变得简单。
关于您提到的具体 属性,如果构建的基目录始终是相对于结帐目录的相同路径,您可以在构建配置中设置一个环境变量,例如。设置 env.BASE_DIRECTORY = %system.teamcity.build.checkoutDir%/build
.
你的两个建议都会奏效。我最终从(签入的)模板文件生成文件并修改机器的属性。
@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>
我的构建脚本包含一个本地属性文件,用于设置特定于机器的值(例如构建的基目录)。对于将源下载到的每台计算机,这些都是唯一的。
当构建代理 运行 有一段时间未使用时,它会删除项目的工作文件夹并最终删除属性文件。当稍后进行更改时(在构建代理清理最近未使用的文件夹的一段时间后)构建中断,直到属性文件被恢复。
我不确定正确的方法是阻止 TeamCity 的构建代理删除那个 folder/file(不确定如何完成这个,这似乎是最简单的解决方案)或让构建脚本尝试生成构建为 运行 且属性文件不存在时的属性文件。
热切欢迎任何建议!
这个属性文件是从哪里来的?它是由您的脚本生成的吗?
TeamCity 从源服务器获取源文件,因此它可能会被清理,您不能依赖克隆后放入该源的文件。
您可以将此文件的副本保存在安全的地方,然后在您的脚本中将此文件复制到您需要的位置。
避免特定于机器的行为是构建服务器的目标之一,因此 TeamCity 的设计并不是为了让它变得简单。
关于您提到的具体 属性,如果构建的基目录始终是相对于结帐目录的相同路径,您可以在构建配置中设置一个环境变量,例如。设置 env.BASE_DIRECTORY = %system.teamcity.build.checkoutDir%/build
.
你的两个建议都会奏效。我最终从(签入的)模板文件生成文件并修改机器的属性。
@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>