我有一个CMake项目,我的一个版本是在TeamCity构建服务器上使用MSBuild在Visual Studio上进行的。
我看到的是运行git clean -f -d -x
时经常发生故障(TeamCity在初始化构建时作为资源检出的一部分自行执行的步骤)。失败的原因是因为.tlog
文件正在生成到我的CMake构建文件夹中-到CMake的内部CompilerIdC
项目中,CMake用来标识本地C编译器。
.tlog
的用途是什么,什么触发了它们的创建?我还没有找到文档。
我不明白为什么在CMake运行和构建后它们会出现在 中。我尤其不明白为什么在CompilerIdC
的所有源文件和项目文件都被删除后十五分钟内创建它们。
文件正在生成到${CMAKE_BUILD_DIR}/CMakeFiles/3.5.2/CompilerIdC/Debug/CompilerIdC.tlog
中。它们都是link-VCTIP.(read|write|delete).*.tlog
形式。
这是在git clean
上失败并在08:41(截至09:30的当前停止)的构建的文件夹状态:
-rw-r--r-- 1 CI 197121 570 Jun 28 08:57 link-VCTIP.delete.1.tlog
-rw-r--r-- 1 CI 197121 1422 Jun 28 08:57 link-VCTIP.delete.26.tlog
-rw-r--r-- 1 CI 197121 7062 Jun 28 08:57 link-VCTIP.read.1.tlog
-rw-r--r-- 1 CI 197121 402 Jun 28 08:50 link-VCTIP.read.103.tlog
-rw-r--r-- 1 CI 197121 402 Jun 28 08:55 link-VCTIP.read.120.tlog
-rw-r--r-- 1 CI 197121 418 Jun 28 08:57 link-VCTIP.read.26.tlog
-rw-r--r-- 1 CI 197121 286 Jun 28 08:57 link-VCTIP.read.27.tlog
-rw-r--r-- 1 CI 197121 286 Jun 28 08:57 link-VCTIP.read.28.tlog
-rw-r--r-- 1 CI 197121 286 Jun 28 08:57 link-VCTIP.read.29.tlog
-rw-r--r-- 1 CI 197121 402 Jun 28 08:45 link-VCTIP.read.87.tlog
-rw-r--r-- 1 CI 197121 600 Jun 28 08:57 link-VCTIP.write.1.tlog
-rw-r--r-- 1 CI 197121 286 Jun 28 08:57 link-VCTIP.write.26.tlog
构建日志如下:
[08:39:58][VCS Root: MyVCS] [D:\TeamCity\buildAgent\work\58a2d5637a76fb3e]: "C:\Program Files\Git\bin\git.exe" clean -f -d -x
[08:41:26][VCS Root: MyVCS] warning: failed to remove build/Windows-x64-Release/: Directory not empty
[08:41:27]
[Updating sources] Failed to perform checkout on agent: '"C:\Program Files\Git\bin\git.exe" clean -f -d -x' command failed.
stdout: Removing Artifacts/x64/
<snip>
Removing build/Windows-x64-Release/CMakeFiles
<snip>
stderr: warning: failed to remove build/Windows-x64-Release/: Directory not empty
我正在使用的工具是:
答案 0 :(得分:4)
.tlog
文件?它们是由MSBuild的文件跟踪器输出的,该文件跟踪器包装了Visual C ++构建可执行文件(例如cl.exe
和link.exe
),以跟踪其写入和读取的文件。它将这些文件路径记录在中间目录的.tlog
文件中,并依靠它们定义应如何构建增量构建。
(来源:Inside the Microsoft Build Engine: Using MSBuild and Team Foundation Build,Sayed Hashimi和William Bartholomew。)
任何使用MSBuild都可以触发.tlog
文件的创建或更新。
.tlog
是写入vctip.exe
文件的过程之一。 2018年3月,微软工程师Ian Bearman(VC ++遥测所有者)explained:
这个小应用程序是一个在构建过程中运行的后台进程,它允许VC ++工具与VS Telemetry Service(也称为VS Experience Improvement Program)进行通信。构建后该应用程序将保持运行,以防立即启动另一个构建以帮助加快编译速度。
我知道当前的超时时间(大约15分钟)太长了。
因此,答案是:即使构建结束后(在这种情况下,甚至在所有相关文件都删除之后),后台进程仍保持活动状态,并继续尝试将遥测文件写入其目录。
贝尔曼建议two solutions:
即将发布的Visual Studio版本(从VS 2017 15.7开始,现在处于预览状态)会将其持续运行的时间缩短到上次构建后的15秒。希望这能解决您在继续运行该程序时遇到的任何问题。
(我尚未尝试升级,因此无法确认是否解决了该问题。我还怀着兴趣an earlier bug report注意到了几乎相同的问题,a promise in March 2018回答说最近更新已解决了该问题。)
vctip.exe
。 同时,要解决此问题,请随时随时手动杀死vctip.exe。您可以使用Windows命令
taskkill /IM vctip.exe
立即将其停止。这样做总是安全的,不必担心数据丢失或损坏。
在我自己的TeamCity案例中,很容易在MSBuild完成后将其作为附加的构建步骤添加到构建配置中-运行脚本:
taskkill /IM vctip.exe /f >nul 2>&1
请注意,此解决方案确实对您的构建系统进行了某些假设,例如它不会一次运行多个版本。并且一定要很好地记录下来,因为稍后弄清楚它的来源将是一件令人头疼的事...
答案 1 :(得分:1)
这里的实际根本原因修复项目可能是:
https://visualstudio.microsoft.com/team-services/support/build-troubleshooting-guidance/
MSBuild和/ nodeReuse:false
如果在构建过程中调用MSBuild,请确保传递参数/ nodeReuse:false(缩写为/ nr:false)。否则,在构建完成后,MSBuild进程将继续运行。该过程会保留一段时间,以期可能会出现后续构建。
由于与MSBuild进程的工作目录存在冲突,MSBuild的此功能可能会干扰尝试删除或移动目录。
MSBuild和Visual Studio Build任务已经将/ nr:false添加到传递给MSBuild的参数中。但是,如果您从自己的脚本中调用MSBuild,则需要指定参数。
? (如果实际上是这里的正确处理方法, 比起更精确的治疗 需要随机杀死随机非拥有进程的不确定性变通方法
请注意 如果这是根本原因,那么 这可能也需要在CMake生成器源代码(msbuild invocation [,有条件/智能地])中进行修复...
旁注:我考虑了保持后台进程运行的机制-喘不过气来! -遥测的目的是相当不精确的/不受控制的方式(占用目录等),而这据称是精确控制/执行/确定性的构建过程,相当可疑[/令人反感]。