"Процесс не может получить доступ к файлу 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 Версия это может помочь.

Другие вопросы по тегам