【问题标题】:Moving TFS CI Build def to VSTS - VSTS CI build def gets everything and builds everything将 TFS CI Build def 移动到 VSTS - VSTS CI build def 获取一切并构建一切
【发布时间】:2018-11-22 06:31:37
【问题描述】:

我们开始将旧的 xaml 构建定义迁移到 VSTS 基于 Web 的构建定义。对于每个分支,我们都有一个 debug build def 和一个 release build def。调试构建定义设置为持续集成构建。作为测试,我修改了一个源文件并将其签入。旧的 xaml build def 签出了 1 个文件,并且似乎只构建了更改的项目(我们在 CI 构建中想要和期望的)。在 xaml 构建日志中,我看到以下内容:

<InformationField Name="Message" Value="1 file(s) were downloaded with a total size of 0.29 MB." />

它在 3.3 分钟内运行构建。

在新的 VSTS 版本中 - 我看到它执行“tf get /version:170936”并获取变更集 ID“170936”中的所有文件:

2018-06-12T15:08:39.8409262Z Checking if artifacts directory exists: C:\BuildAgent\agent2\_work\1\a
2018-06-12T15:08:39.8409262Z Deleting artifacts directory.
2018-06-12T15:08:39.8409262Z Creating artifacts directory.
2018-06-12T15:08:39.8564882Z Checking if test results directory exists: C:\BuildAgent\agent2\_work\1\TestResults
2018-06-12T15:08:39.8564882Z Deleting test results directory.
2018-06-12T15:08:39.8564882Z Creating test results directory.
2018-06-12T15:08:39.8877401Z Starting: Get sources
2018-06-12T15:08:39.9033640Z Entering TfvcSourceProvider.PrepareRepositoryAsync
2018-06-12T15:08:39.9033640Z localPath=C:\BuildAgent\agent2\_work\1\s
2018-06-12T15:08:39.9033640Z clean=False
2018-06-12T15:08:39.9033640Z sourceVersion=170936
2018-06-12T15:08:39.9033640Z mappingJson={"mappings":[{"serverPath":"$/Path/To/Branch","mappingType":"map","localPath":"\\"}]}
2018-06-12T15:08:39.9033640Z Syncing repository: Project Name (TFVC)
2018-06-12T15:08:39.9033640Z workspaceName=ws_1_45
2018-06-12T15:09:06.7318304Z Workspace Name: ws_1_45;a6060273-b85e-4d4b-ac63-3fbbcafc308b
2018-06-12T15:09:06.7630780Z tf get /version:170936
2018-06-12T15:09:21.6070136Z Getting C:\BuildAgent\agent2\_work\1\s;C124440
2018-06-12T15:09:21.6070136Z Getting C:\BuildAgent\agent2\_work\1\s;C124440
2018-06-12T15:09:21.6226405Z Getting C:\BuildAgent\agent2\_work\1\s\.nuget;C158533
2018-06-12T15:09:21.6226405Z Getting C:\BuildAgent\agent2\_work\1\s\Build Scripts;C141602
2018-06-12T15:09:21.6226405Z Getting C:\BuildAgent\agent2\_work\1\s\Databases;C124440
~ 
~ The rest of branch...
~

然后似乎重建所有项目需要 13.2 分钟才能运行,比旧的 xaml 构建长了近 10 分钟。

我是否缺少新构建定义的某些内容?我没有在 VS Build 任务中选中“清理”按钮。我确实有一个 build.clean 变量,但默认情况下它是空白的 - 有时我们想要清理,所以我们可以在排队时将其设置为“全部”。

在网络上点击 about 会显示以下 MS VSTFS 版本:15.105.25910.0

非常感谢任何帮助。

【问题讨论】:

  • 我不确定到底是什么问题。如果它是第一次在给定的构建代理上运行,它自然必须同步所有源代码。如果您的步骤指定构建某些项目,它将构建所有这些项目。这与 XAML 构建所展示的行为相同。
  • 问题是 - 在我的 xaml CI 构建定义中,在构建日志中,我在整个日志中看到以下内容,并且它不会重建自上次签入以来未更改的任何项目:“所有输出都是最新的。”在新的 Web 构建日志中 - 当我希望看到相同的内容时,它会重新构建所有项目。
  • 当您使用相同的变更集多次排队构建时是否总是发生这种情况?
  • 是的,它似乎做了一个完整的获取,您可以看到所有文件及其对应的变更集 ID 的 C{###}。当我转到源目录时,我会看到所有带有今天日期的文件。当我重新运行构建时,我看到了同样的事情。旧的 xaml Build Def - 只有更改的文件才有今天的日期。就像我说的那样,旧的 build def build 需要大约 3 分钟来运行构建,而新的 build def 需要超过 13 分钟才能运行 - 这告诉我它正在重建所有项目,而旧的只构建已更改的项目 -这是预期的结果。
  • 根据您的描述,似乎构建实际上并没有执行增量构建(Clean 选项已禁用,Clean = Flase),看看这个线程Clean the local repo on the agent 是您使用多个构建代理?此构建可能不会每次都针对同一个构建代理运行。这可能是根本原因。

标签: tfs continuous-integration azure-devops


【解决方案1】:

对于多个构建代理,即使您没有选中 VS Build 任务的 Clean 复选框,并且 Repository 中的 clean 选项设置为“false”。

由于代理是随机挑选的,之前可能不包含您的源代码。这就是为什么您会看到 TFS 执行 tf get /version:170936 并获取变更集 ID“170936”中的所有文件并构建所有项目的原因。

对于构建定义的选项选项卡中的多配置。请参考官方文章:How do I build multiple configurations for multiple platforms?

之后,它会在构建过程中将配置拆分为多个构建。

既然您的构建定义成功构建了多个配置,您可以继续并启用并行构建以减少构建的持续时间/反馈时间。您将其指定为 选项 页面上的附加选项:

看看这个帖子Building multiple configurations and/or platforms in Build 2015

要缩小问题是否与多个构建代理有关,您还可以按需send TFS build to a specific agent,并在同一构建代理中使用clean=false 多次排队构建,它应该只构建更改的项目(CI)。

【讨论】:

  • 嗨帕特里克,感谢您的详细回答。正如你所展示的,我确实有我的构建定义设置。但是,我只是不认为您能够与多个代理并行进行增量构建。我在 4 台不同的机器上有 8 个代理。查看日志时 - 我看到一个特定的 BuildConfig|Platform,它每次都在不同的代理上运行。这是导致完全重建的原因吗?不确定。即使只有一个项目可能发生了变化,它也可以完整地了解所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
相关资源
最近更新 更多