【问题标题】:Delphi Build Server: find out which projects are affected by commitDelphi Build Server:找出受提交影响的项目
【发布时间】:2016-01-28 08:35:31
【问题描述】:

我目前正在尝试提高我们的构建机器的性能。每次提交 (svn) 后排队的标准构建大约需要 40 分钟。如果提交时已经有一个排队的构建,我们不会添加另一个。所以每个构建都有 1+ 提交的更改。由于提交可能没有对所有项目进行更改,因此可以通过仅重建受影响的项目来减少构建时间。

我不知道如何找出需要构建哪些项目。有没有办法可靠地找出触发构建的提交影响了什么?我首先考虑通过 .dpr 文件并检查引用文件中的更改,但并非所有文件都列在那里,因为我们也使用搜索路径...

如果没有,是否至少有一种方法可以确定项目是否肯定不会受到影响?老实说,我不太清楚如何解决这个问题......

【问题讨论】:

  • 听起来更棘手的问题之一是确定特定 DCU 是否需要重新编译,因为它依赖于其他单元的更改,这当然是一个递归问题,当然你d 需要复制编译器使用的重新编译逻辑。此处的实用程序forum.exetools.com/showthread.php?t=5196 可能会对此有所帮助。不过,投资一台更快的构建机器可能会少很多麻烦;=)
  • 是的,我正在各个方向“调查”以提高性能,例如像 RAM 磁盘...我会试试你的链接,谢谢
  • @MartynA 所有链接似乎都已关闭,只能通过论坛下载,并且需要注册,但已禁用...另一方面,我不知道我是否想投资在“黑客”DCU 上花了这么多时间,所以这不是什么大问题

标签: delphi svn version-control build


【解决方案1】:

以下不是您问题的“答案”,但可能有助于进一步思考。

抛开给定项目使用的其他类型的资源(例如 .RC 和 .Inc 文件),不知道它使用了哪些源文件,包括它的所有单元,我看不出你如何证明这个命题“这个项目不会受到影响。”通过给定的提交。

另一方面,大概您可以生成提交更改的项目和源文件的列表,因此通过偶尔重新编译所有项目,您可以获得作为结果生成的 DCU 列表。

通过对源文件的不同更改集多次重复上述过程,您应该能够收集 .Pas 更改与重新编译的结果 .DCU 之间以及重新编译的项目与生成的 DCU 之间的一些统计相关性。

通过分析这些相关性,您可以确定哪些项目在给定的 .Pas 文件发生更改时需要重新编译的可能性大于 X%。

我想你最终会得到一些启发式方法,可以确定在给定单元发生变化后应该重新编译哪些项目以及一些确定性规则。一个明显的问题是,一旦观察到对单元 A 的更改会引发对项目 Z 的重新编译,那么每当随后更改 A 时,都应该重新编译 Z。当然,一旦某个项目被确定性规则标记为肯定,则无需考虑提交中更改的其他源文件。

另一件事是,您可以回避需要分析 .Pas 文件的问题,使用依赖关系来确定给定项目所依赖的 .Pas 文件,方法是对项目进行完整构建并列出 .Pas 文件。结果生成的 DCU。

顺便说一句,由于这个问题似乎都是关于列表和规则的,所以在 Prolog 中编程会很有趣(Amzi Prolog 有一个很棒的 Delphi 逻辑引擎包装器,我过去曾用于类似的事情)。

【讨论】:

  • 有趣的是,我刚刚和一位同事谈论将所有为每个项目构建的 DCU 存储在数据库中,以便我可以关联提交的文件 - 我一定会试一试
【解决方案2】:

您可以尝试并行构建过程并使用 RAM 驱动器来加速它。 在我的工作中,我们使用 Ant 进行构建。它可以以并行方式运行某些目标,将编译性能提高 4 倍甚至更多倍(取决于线程数)。

如果您无法加快构建过程。我有两种方法:

  1. 您可以编写应用程序,该应用程序遍历项目文件 (.dpr) 并递归解析它使用的每个 .pas 文件。在此之后,您可以将文件列表与提交日志进行比较,并决定是否构建此项目。对所有项目重复此操作。

  2. 保存 dcc32.exe 构建日志并在下次构建时使用它来查找提交中的文件。如果找到文件,则必须重建项目。一个问题 - 未涵盖新文件,但如果在上次提交中添加了某些文件,您可以强制构建。

【讨论】:

  • 对不起,我不在这里寻找其他提高速度的可能性 - 我很清楚这不是实现更好构建性能的唯一方法,但这并不是真正的SO的主题
  • 好吧,再想想也许对 SO 没问题,但是,这不是我的问题的目的
  • 好的。如果你不能加快构建过程。您可以编写应用程序,它遍历项目文件 (.dpr) 并递归解析它使用的每个 .pas 文件。在此之后,您可以将文件列表与提交日志进行比较,并决定是否构建此项目。对所有项目重复此操作。
  • 遗憾的是,正如我的问题中提到的,通过 DPR 不会捕获所有使用的单位,因为我们还依赖搜索路径
  • 您可以从全局和本地 dcc32.cfg 中读取搜索路径,并通过此目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2022-01-16
  • 2011-06-27
相关资源
最近更新 更多