【问题标题】:Is incremental building possible in combination with Continuous Integration?增量构建是否可以与持续集成相结合?
【发布时间】: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


【解决方案1】:

是的,你肯定有竞争条件。我想您可以通过查询更改日志并触摸其中列出的任何文件来尝试变得聪明——或者更好的是,如果支持它,Subversion 不会保留文件修改时间,而是让文件的日期戳是它们的日期更新位置。

我在这方面看到的其中一个问题是大部分时间只运行增量构建,但有一部分构建运行干净(可能是每晚)。您可能会定期陷入这种竞争状态,但您会定期摆脱它。根据这种情况发生的频率,这种组合可能就足够了。

【讨论】:

  • 我考虑过定期清理,但决定不这样做,因为在问题发生之后,如果它破坏了构建(这就是我们发现的方式),它会破坏之后的每个构建。如果它没有破坏构建,你就不能相信它会包含你的更改,所以在下一次清理之前成功的测试并不意味着什么。
  • "如果支持 Subversion 则不保留文件修改时间,而是将文件的日期戳作为更新日期" 这是 subversion 的默认行为,除非您明确设置“使用-commit-times" 配置文件中的选项 (svnbook.red-bean.com/nightly/en/…)
猜你喜欢
  • 2011-07-13
  • 2010-09-29
  • 2023-03-23
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2012-04-25
相关资源
最近更新 更多