我是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”。
到目前为止,这么好。依赖项配置为工件依赖项,其目标目录指定为“../”。这似乎也很简单。
当我开始构建时,我看到要检索的待构建组件,然后我看到依赖关系到达,然后我为构建运行配置的gradle任务,就在那一刻或者就在之前,所有依赖目录(SomeLibA和SomeLibB)都被清除了,当然组件找不到任何依赖项的包含文件和编译失败。
我已经关闭了组件上的“清理checkout目录中的所有文件”和“在下载工件之前清理目标路径”所有依赖项,但这没有任何效果。
我只发现了可能与此行为相关的2个提示,但我不确定为什么它们中的任何一个都会导致此问题。
第一个是“MyExe”的“版本控制设置”选项卡上的一个小警告符号,其中显示“此目录可能在构建之前由TeamCity清除”,指的是自定义目录。但是,在构建运行期间清理的目录不是checkout目录,它是checkout目录的父目录。
我能找到的唯一其他可能的候选者是我配置的gradle任务不是构建运行时指定的唯一任务。我没有在构建日志中看到“gradlew.bat myGradleTask”,而是看到“gradlew.bat --init-script C:\ TeamCity \ BuildAgent \ plugins \ gradle-runner \ scripts \ init.gradle myGradleTask”。
但是,我查看了那个init脚本,并没有看到任何与目录清理相关的内容。
我很难过。有没有人知道发生了什么,以及如何解决它,以便这个构建可以成功完成?可接受的解决方案必须保留上面的构建布局要求。
答案 0 :(得分:0)
此处的问题是禁用“在构建之前清除结帐目录中的所有文件”。
禁用此复选框可以消除结帐目录的整个路径的内容。
供参考,请参阅此处的文档: https://confluence.jetbrains.com/display/TCD9/Clean+Checkout
......相关的摘录是:
自动清洁结帐
如果未启用清除结帐,则TeamCity会更新中的源 checkout目录递增到所需的状态。 TeamCity尝试 检测结帐目录中的源是否不是 对应于预期状态并触发清理结账 这种情况确保来源是合适的。
这意味着在某些情况下TeamCity可以检测到干净 即使未在VCS设置中启用,也必须结帐 而不是用户从Web UI请求的。在这种情况下所有的 结帐目录的内容将被删除,并重新填充 从头开始的消息来源。如果有任何详细信息 决定,它们会在结帐相关之前添加到构建日志中 日志记录。
启用此复选框会使依赖目录保持不变。