Tajemnica zablokowanego nieaktywnego msbuild.procesy exe, zablokowany Stylecop.dll, NuGet AccessViolationException i CI buduje zderzające się ze sobą

Uwagi:

  • Na naszym serwerze Jenkins widzieliśmy wiele msbuild.procesy exe (~100) kręcą się po zakończeniu zadania z około 20MB zużycia pamięci i 0% aktywności procesora.

  • Kompilacje wykorzystujące różne wersje stylecop były przerywane zawodzące:

    workspace\packages\StyleCop.MSBuild.4.7.41.0\tools\StyleCop.targets(109,7): error MSB4131: The "ViolationCount" parameter is not supported by the "StyleCopTask" task. Verify the parameter exists on the task, and it is a gettable public instance property.

  • Nuget.exe było przerywane wychodzenie z następującym błędem access violation (0x0000005):

    .\workspace\.nuget\nuget install .\workspace\packages.config -o .\workspace\packages" exited with code -1073741819.

MsBuild został uruchomiony w następujący sposób poprzez zadanie macierzy Jenkinsa z włączoną funkcją 'BuildInParallel':

    `msbuild /t:%Targets% /m
    /p:Client=%Client%;LOCAL_BUILD=%LOCAL_BUILD%;BUILD_NUMBER=%BUILD_NUMBER%;
    JOB_NAME=%JOB_NAME%;Env=%Env%;Configuration=%Configuration%;Platform=%Platform%;
    Clean=%Clean%; %~dp0\_Jenkins\Build.proj`
Author: Jon Rea, 2012-11-22

2 answers

Po serii grzebania i próbowania różnych rzeczy bez skutku, w końcu stworzyłem nowe Minimalne rozwiązanie, które odtworzyło problem z bardzo niewiele się dzieje. Problem okazał się być spowodowany równoległością wielordzeniową msbuild-parametrem "m".

  • parametr 'm' mówi msbuild, aby odradzał "węzły", które pozostaną żywe po zakończeniu kompilacji, a następnie zostaną ponownie wykorzystane przez nowe kompilacje!
  • błąd StyleCop 'ViolationCount' był spowodowane przez dany build ponowne użycie starej wersji stylecop.dll z obszaru roboczego innej kompilacji, gdzie ViolationCount nie było obsługiwane. Było to dziwne, ponieważ przestrzeń robocza CI zawierała tylko nową wersję. Wydaje się, że po StyleCop.dll został załadowany do danego węzła MsBuild, pozostanie załadowany do następnej kompilacji. Mogę tylko założyć, że to dlatego, że StyleCop ładuje jakiś singleton do procesów węzłów? Wyjaśnia to również blokowanie plików między kompilacjami.
  • nuget awaria naruszenia dostępu już zniknęła (bez innych zmian), więc jest ewidentnie związana z powyższym problemem ponownego użycia węzła.
  • ponieważ parametr' m ' domyślnie odpowiada liczbie rdzeni-widzieliśmy 24 instancje msbuild utworzone na naszym serwerze kompilacji dla danego zadania.

Następujące posty były pomocne:

Poprawka:

  • Dodaj linię set MSBUILDDISABLENODEREUSE=1 do pliku wsadowego, który uruchamia msbuild
  • Uruchom msbuild z /m:4 /nr:false
  • paremeter 'nr' mówi msbuild, aby nie używał "Node Reuse" - więc instancje msbuild są zamykane po zakończeniu kompilacji i nie kolidują ze sobą - co powoduje powyższe błędy.
  • parametr 'm' jest ustawiony na 4, Aby zatrzymać zbyt wiele węzłów spawania na zadanie
 59
Author: Jon Rea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:37

Miałem ten sam problem. Jedno stare odniesienie znalazłem w plikach csproj

<PropertyGroup>
<StyleCopMSBuildTargetsFile>..\packages\StyleCop.MSBuild.4.7.48.0\tools\StyleCop.targets</StyleCopMSBuildTargetsFile>

Usunąłem również cały folder "Packages", który znajduje się w tym samym folderze co plik sln po zamknięciu visual studio. Wywołało VS odbudować folder i puścić pamięć podręczną starej wersji stylecop

 1
Author: Jin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-01 10:37:55