"Процесс не может получить доступ к файлу Default.rd.xml, поскольку он используется другим процессом". на AppVeyor CI
Я работаю над cordova-windows
( https://github.com/apache/cordova-windows), который использует AppVeyor для тестирования в Windows. Одной из вещей, которой не хватало, были тесты с Visual Studio 2017 (раньше для тестирования использовался только VS2015). Так что я добавил их, и это работает как шарм - в основном.
К сожалению, теперь у нас очень странный сбой теста: https://ci.appveyor.com/project/ApacheSoftwareFoundation/cordova-windows/build/1.0.458
Started
Creating Cordova Windows Project:
Path: testcreate 応用
Namespace: com.test.app
Name: 応用
Windows project created with cordova-windows@5.1.0-dev
Building project: C:\projects\cordova-windows\testcreate 応用\CordovaApp.Windows10.jsproj
Configuration : release
Platform : x64
Patching 10 in prebuild event...
Injected base.js reference to the www/index.html
Removing /( *)(<script\s+(?:type="text\/javascript"\s+)?src="\/\/Microsoft.WinJS.2.0\/js\/base.js">\s*<\/script>)(\s*)/ from www/index.html
Removing /( *)(<script\s+(?:type="text\/javascript"\s+)?src="\/\/Microsoft.Phone.WinJS.2.1\/js\/base.js">\s*<\/script>)(\s*)/ from www/index.html
CordovaApp.Windows10 -> C:\projects\cordova-windows\testcreate ??\build\windows\release\x64\win10\CordovaApp.Windows10_1.0.0.0_x64.appx
CordovaApp.Windows10 -> C:\projects\cordova-windows\testcreate ??\build\windows\release\x64\win10\Upload\CordovaApp.Windows10_1.0.0.0_x64.appx
CordovaApp.Windows10 -> C:\projects\cordova-windows\testcreate ??\AppPackages\CordovaApp.Windows10_1.0.0.0_Test\CordovaApp.Windows10_1.0.0.0_x64.appxbundle
CordovaApp.Windows10 -> C:\projects\cordova-windows\testcreate ??\AppPackages\CordovaApp.Windows10_1.0.0.0\CordovaApp.Windows10_1.0.0.0_x64.appxbundle
CordovaApp.Windows10 -> C:\projects\cordova-windows\testcreate ??\AppPackages\CordovaApp.Windows10_1.0.0.0_x64_bundle.appxupload
Your package has been successfully created.
Building project: C:\projects\cordova-windows\testcreate 応用\CordovaApp.Windows10.jsproj
Configuration : release
Platform : x86
Patching 10 in prebuild event...
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2975,5): error MSB3231: Unable to remove directory "build\windows\bld\PackageUploadLayout\". The process cannot access the file 'Default.rd.xml' because it is being used by another process. [C:\projects\cordova-windows\testcreate ??\CordovaApp.Windows10.jsproj]
C:\projects\cordova-windows\testcreate 応用\cordova\node_modules\q\q.js:155
throw e;
^
Error: C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe: Command failed with exit code 1
at ChildProcess.whenDone (C:\projects\cordova-windows\testcreate 応用\cordova\node_modules\cordova-common\src\superspawn.js:169:23)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:920:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:230:5)
Соответствующая часть это:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2975,5): error MSB3231: Unable to remove directory "build\windows\bld\PackageUploadLayout\". The process cannot access the file 'Default.rd.xml' because it is being used by another process. [C:\projects\cordova-windows\testcreate ??\CordovaApp.Windows10.jsproj]
Этого не происходит, когда я запускаю тесты локально, то есть я никоим образом не могу воспроизвести то, что здесь происходит.
Любая идея, что процесс может заблокировать это Default.rd.xml
файл или build\windows\bld\PackageUploadLayout\
?
Как я могу узнать в среде CI, как AppVeyor?
Обновить:
Изучил немного больше, добавив /clp:Verbosity=normal
к msbuild
звонки, которые выполняются.
Работает аналогично msbuild
звоните 3 раза (один раз на архитектуру). Первый успешен, но во втором происходит сбой. Имеет смысл, так как на первой итерации папка еще не существует, что подтверждается следующим выводом: Directory "build\windows\bld\PackageUploadLayout\" doesn't exist. Skipping.
,
Последний выход до сбоя Removing directory "build\windows\bld\PackageUploadLayout\".
что соответствует тому, что мы получаем в сообщении об ошибке. Нет индикатора, почему удаление не работает, хотя.
Супер странно: с /clp:Verbosity=detailed
добавлен в msbuild
вызов, сборка действительно удалась! Мое предположение: поскольку вывод занимает время, то, что бы ни блокировало папку или файл, оно освобождается.
1 ответ
Это не совсем ответ, а отчет о расследовании. Просто не хватает места комментировать, чтобы описать это. Вот что я сделал:
- раздвоил репо
- создал проект AppVeyor
- добавлен RDP
- связано с RDP
- установленный procmon
- добавлен фильтр для мониторинга объектов, которые
path
заканчиваетсяbld\PackageUploadLayout\Properties\Default.rd.xml
- бежать
npm test
вручную из CMD
Когда произошла та же ошибка, я вижу это:
Я не уверен, что понимаю, почему msbuild потерпел неудачу таким образом. я открыл SHARING VIOLATION
событие, переключился на процесс и увидел это:
Что бросается в глаза это msbuild
версия 14. Должно быть 15 на Visual Studio 2017 image
, У нас установлена версия 14 для определенных сценариев, но по умолчанию установлена 15 (запустить where msbuild
и ты увидишь C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe
). Я не уверен, где этот путь установлен в ваших скриптах, но я чувствую, если вы заставите его работать правильно msbuild
Версия это может помочь.