TeamCity c++渐变构建删除工件依赖项

TeamCity c++ gradle build deletes artifact dependencies

本文关键字:依赖 删除 c++ 渐变 构建 TeamCity      更新时间:2023-10-16

我是TeamCity的新手,从不同的CI产品迁移过来,并试图了解如何在TeamCity的9.1.6版本上为c++项目配置工作构建。

我遇到的问题是,代理在组件构建之前(或期间)删除了我的依赖目录,而我在构建日志中找不到为什么会发生这种情况的记录。

系统中任何组件的构建布局如下所示:

<base-dir>
  |
  +---<to-be-built>
  +---<dependency-1>
         +---Include
         +---Lib
  +---<dependency-2>
         +---Include
         +---Lib

因此,无论组件的checkoutDir是什么,都假设所有依赖项都将在对等目录中找到,以依赖项命名,而文件夹名称中没有版本信息。

例如,如果"MyExe"的3.0.2版本依赖于"SomeLibA"的1.1.0版本和"SomeLibB"的2.1.0版本,则文件系统应该如下所示:

MyExe_3.0.2
  |
  +---MyExe
  +---SomeLibA
         +---Include
         +---Lib
  +---SomeLibB
         +---Include
         +---Lib

因此,为了创建这个构建布局,"MyExe"3.0.2版本的构建配置指定了一个自定义签出目录,如:"MyExe_3.0.2/MyExe"。

到目前为止,一切都很好。依赖项被配置为工件依赖项,并且它们的目标目录被指定为"../"。这似乎也很简单。

然而,当我开始构建时,我看到要构建的组件被检索,然后我看到依赖项到达,然后我为构建配置的渐变任务运行,就在那一刻,或者就在那之前,所有的依赖目录(SomeLibA和SomeLibB)都被删除了,当然,组件找不到任何依赖项的include文件,编译失败。

我已经关闭了组件上的"清除签出目录中的所有文件"和所有依赖项上的"下载工件前清除目标路径",但这没有任何效果。

我只发现了两个可能与这种行为有关的提示,但我不确定为什么它们中的任何一个会导致这个问题。

第一个是"MyExe"的"版本控制设置"选项卡上的一个小警告符号,上面写着"该目录可能在构建之前由TeamCity清理",指的是自定义目录。但是,在构建运行期间被清除的目录不是签出目录,而是签出目录的父目录。

我能找到的唯一其他可能的候选者是,我配置的渐变任务并不是构建运行时指定的唯一任务。我看到的不是构建日志中的"gradlew.bat myGradleTask",而是"gradleo.bat--init script C:\TeamCity\BuildAgent\plugins\gradle runner\scripts\init.gradle myGradleTask"。

但是,我已经查看了init脚本,没有发现任何与目录清理有关的内容。

我被难住了。有人知道发生了什么吗?以及如何解决这个问题,使这个构建能够成功完成?可接受的解决方案必须保留上述构建布局要求。

这里的问题是禁用"在构建之前清理签出目录中的所有文件"。

禁用此复选框的效果是清除签出目录的整个路径的内容。

有关参考,请参阅此处的文档:https://confluence.jetbrains.com/display/TCD9/Clean+结账

相关摘录如下:

自动清洁结账

如果未启用干净签出,TeamCity将更新checkout目录递增到所需状态。TeamCity尝试检测签出目录中的源是否对应于预期状态,并在中触发清理签出这样的情况,以确保来源是适当的。

这意味着在某些情况下TeamCity可以检测到干净即使在VCS设置中未启用签出,也必须进行签出并且不是由用户从web UI请求的。在这种情况下签出目录的内容将被删除,并由重新填充从零开始的来源。如果在决定,在与签出相关之前将它们添加到构建日志中日志记录。

启用此复选框的效果是保留依赖目录。