2010-11-18 65 views
4

我们在Subversion和MSBuild中使用TeamCity,并且我们遇到了由Subversion提交触发的连续构建的问题。渐进式建筑可与持续集成结合使用吗?

连续构建设置为增量构建(每晚构建完整且干净)。

如果开发人员在构建开始(提交触发)后但在构建使用该文件的对象之前第二次更改并提交文件,则会出现此问题。现在,目标文件获得第二次提交时间戳之后的时间戳。这会导致所有后来的增量构建跳过对文件的更改。

对于此额外的清晰度是时间线:

T1:开发商承诺file.cpp(file.cpp有时间T1)
T2:一是增量编译生成服务器上启动
T3:构建服务器获取最新变化的文件(file.cpp在T1)
T4:开发人员第二次提交file.cpp(file.cpp有T4)
T5:Buildserver将T1的file.cpp编译成file.obj(现在file.obj有时间T5)
T6:第一次建造完成(效果很好)
T7:第二增量编译生成服务器上启动
T8:建立服务器获取最新变化中的文件(在T4 file.cpp)

而现在的问题:

T9:构建服务器不会将file.cpp(T4)编译到file.obj中,因为file.obj是T5,因此编译器认为它比源文件更新。

这个问题很容易修复,但需要很长时间(30分钟没有单元测试)。

渐进式建筑是否可以与持续集成相结合?

编辑:此问题似乎只在使用服务器端结帐模式时发生。使用构建代理端检出模式更改的文件获取检索时间的时间戳,而在服务器端检出时,它们将提交时间作为时间戳。

+0

您的CI服务器可以询问您的VCS有关代码更改的信息。 – jfs 2010-11-18 19:37:59

+0

它的确如此。问题在于时机。如果在CI服务器获得prev后更改文件。版本,但在构建中实际使用它之前,似乎存在问题。 – Halt 2010-11-19 09:55:46

+0

@Halt:我的意思是你的VCS可以知道哪些文件真的发生了变化,所以你可以触摸它们以使你的构建系统正常工作。类似'svn diff -r PREV:HEAD --summarize | awk'{print $ 2}'| xargs touch' – jfs 2010-11-20 09:29:01

回答

2

是的,你一定有比赛条件。我想你可以尝试通过询问更改日志并触摸其中列出的任何文件来获得更高的灵活性 - 或者更好的是,如果支持,Subversion不会保留文件修改时间,而是将文件的日期戳记作为它们的日期更新位于。

我在附近看到的一个问题是大部分时间只能运行增量构建,但有一部分构建运行干净(可能每晚)。你可能会周期性地陷入这种竞争状态,但你会定期摆脱它。根据这种情况发生的频率,这种混合物可能已经足够好了。

+0

我想过定期清理,但是决定不要这样做,因为在问题发生之后,如果它打破了构建过程(这就是我们发现的),它会在每次构建之后破坏它。如果它没有破坏构建,你不能相信它包含你的改变,所以成功的测试不会意味着很多,直到下一次清理。 – Halt 2010-11-20 08:10:16

+1

“如果支持,Subversion不会保留文件修改时间,而是让文件的日期标记为更新日期”这是Subversion的默认行为,除非您明确设置了“use-commit-times”选项配置文件(http://svnbook.red-bean.com/nightly/en/svn.advanced.confarea.html#svn.advanced.confarea.opts.config) – slowdog 2010-11-24 23:51:50