Ответ 1
После долгих разрастаний и попыток разного рода действий я в конечном итоге закончил создание нового минимального решения, которое воспроизвело проблему с очень небольшим продолжением. Проблема оказалась вызвана многоядерной параллелизацией msbuild - параметром "m".
- Параметр "m" указывает msbuild на "узлы", они останутся в живых после завершения сборки и затем снова будут использованы новыми сборками!
- Ошибка StyleCop 'ViolationCount' была вызвана тем, что данная сборка повторно использовала старую версию stylecop.dll из другого рабочего пространства сборки, где ViolationCount не поддерживался. Это было странно, потому что рабочее пространство CI содержало только новую версию. Похоже, что когда StyleCop.dll был загружен в данный MsBuild node, он останется загруженным для следующей сборки. Я могу только предположить, что это связано с тем, что StyleCop загружает какой-то одноэлемент в процессы узлов? Это также объясняет блокировку файлов между сборками.
- Теперь произошел сбой в доступе к доступу к nuget (без каких-либо изменений), поэтому, очевидно, связано с проблемой повторного использования node.
- По умолчанию для параметра "m" задано количество ядер - мы видели 24 экземпляра msbuild, созданных на нашем сервере сборки для заданного задания.
Следующие сообщения были полезны:
- msbuild.exe остается открытым, блокирует файлы
- http://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspx
- http://stylecop.codeplex.com/discussions/394606
- https://github.com/Glimpse/Glimpse/issues/115
- http://msdn.microsoft.com/en-us/library/vstudio/ms164311.aspx
Исправление:
- Добавьте строку
set MSBUILDDISABLENODEREUSE=1
в пакетный файл, который запускает msbuild - Запустите msbuild с помощью
/m:4 /nr:false
- Параметр 'nr' указывает msbuild не использовать "Node Reuse" - поэтому экземпляры msbuild закрываются после завершения сборки и больше не сталкиваются друг с другом, что приводит к вышеуказанным ошибкам.
- Параметр "m" установлен в 4, чтобы остановить слишком много нерестовых узлов для каждого задания.