【发布时间】:2010-11-18 15:38:31
【问题描述】:
我们将 TeamCity 与 subversion 和 MSBuild 结合使用,但 Subversion 提交触发的持续构建存在问题。
设置连续构建以进行增量构建(每晚构建完整且干净)。
如果开发人员在构建开始后(提交触发)但在构建使用文件的对象之前第二次更改并提交文件,则会出现此问题。现在,目标文件获得了第二次提交时间戳之后的时间戳。这将导致所有以后的增量构建跳过对文件的更改。
为了更加清楚,这里是时间线:
T1:开发者提交 file.cpp(file.cpp 有时间 T1)
T2:第一个增量构建在构建服务器上开始
T3:构建服务器获取最新更改的文件(T1 处的 file.cpp)
T4:开发者第二次提交file.cpp(file.cpp有T4)
T5:Buildserver将T1的file.cpp编译成file.obj(现在file.obj有时间T5)
T6:首次构建完成(结果良好)
T7:在构建服务器上开始第二次增量构建
T8:构建服务器获取最新更改的文件(T4 的 file.cpp)
现在的问题是:
T9:构建服务器不会将(T4 的)file.cpp 编译成 file.obj,因为 file.obj 属于 T5,因此编译器认为它比源文件更新。
这个问题很容易通过完整的构建解决,但需要很长时间(没有单元测试需要 30 分钟)。
增量构建是否可以与持续集成相结合?
编辑:这个问题似乎只在使用服务器端结帐模式时发生。使用构建代理端签出模式更改的文件获取检索时间的时间戳,而使用服务器端签出它们将提交时间作为时间戳。
【问题讨论】:
-
您的 CI 服务器可以向您的 VCS 询问代码更改。
-
确实如此。问题在于时机。如果在 CI 服务器获取 prev 之后更改了文件。版本,但在实际用于构建之前似乎存在问题。
-
@Halt:我的意思是您的 VCS 可以判断哪些文件真正发生了更改,因此您可以触摸它们以使您的构建系统正常工作。类似
svn diff -r PREV:HEAD --summarize | awk '{print $2}' | xargs touch -
@J.F. Sebastian:这是一个很好的建议,但要使该建议起作用,TC 必须让代理而不是服务器进行结帐,否则您在构建代理上没有可用的版本化结帐。正如我发现我的问题只发生在不使用代理端结帐时。 (请参阅我在问题中的编辑)。
-
@Halt:1. 您可以将构建拆分为两个任务,并将第一个更新时间戳的任务固定到 CI 服务器。或者 2. 避免在构建过程中依赖时间戳(使用校验和,例如,
git svn客户端免费提供它们;make也可以被教导使用校验和)。
标签: build continuous-integration teamcity