IT박스

고정 된 비활성 msbuild.exe 프로세스, 잠긴 Stylecop.dll, Nuget AccessViolationException 및 CI 빌드가 서로 충돌하는 수수께끼

itboxs 2020. 12. 9. 07:58
반응형

고정 된 비활성 msbuild.exe 프로세스, 잠긴 Stylecop.dll, Nuget AccessViolationException 및 CI 빌드가 서로 충돌하는 수수께끼


관찰 :

  • Jenkins 빌드 서버에서 작업 완료 후 약 20MB의 메모리 사용량과 0 % CPU 활동으로 많은 msbuild.exe 프로세스 (~ 100)가 중단되는 것을 목격했습니다.

  • 다른 버전의 stylecop을 사용하는 빌드는 간헐적으로 실패했습니다.

    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가 다음 액세스 위반 오류 (0x0000005)와 함께 간헐적으로 종료되었습니다.

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

MsBuild는 'BuildInParallel'이 활성화 된 Jenkins Matrix 작업을 통해 다음과 같은 방식으로 시작되었습니다.

    `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`

많은 파고 들고 다양한 것을 시도한 , 결국 나는 거의 다른 일이 일어나지 않고 문제를 재현하는 새로운 최소 솔루션을 만들었습니다. 이 문제는 msbuild의 다중 코어 병렬화 ( 'm'매개 변수)로 인해 발생한 것으로 밝혀졌습니다.

  • 'm'매개 변수는 msbuild에게 "노드"를 생성하도록 지시합니다. 이들은 빌드가 종료 된 후에도 활성 상태로 유지되고 새 빌드에서 다시 사용됩니다!
  • StyleCop 'ViolationCount'오류는 ViolationCount가 지원되지 않는 다른 빌드의 작업 영역에서 stylecop.dll의 이전 버전을 재사용하는 특정 빌드로 인해 발생했습니다. CI 작업 영역에는 새 버전 만 포함되어 있기 때문에 이상했습니다. StyleCop.dll이 지정된 MsBuild 노드에로드되면 다음 빌드를 위해로드 된 상태로 유지되는 것 같습니다. StyleCop이 일종의 싱글 톤을 노드 프로세스에로드하기 때문이라고 생각할 수 있습니다. 이것은 또한 빌드 간의 파일 잠금을 설명합니다.
  • 너겟 액세스 위반 충돌이 이제 사라 졌으므로 (다른 변경 사항 없음) 이는 분명히 위의 노드 재사용 문제와 관련이 있습니다.
  • 'm'매개 변수의 기본값은 코어 수입니다 . 주어진 작업에 대해 빌드 서버에서 생성 된 24 개의 msbuild 인스턴스를 확인했습니다.

다음 게시물이 도움이되었습니다.

수정 사항 :

  • set MSBUILDDISABLENODEREUSE=1msbuild를 시작하는 배치 파일에 추가하십시오.
  • msbuild 시작 /m:4 /nr:false
  • 'nr'매개 변수는 msbuild에 "노드 재사용"을 사용하지 않도록 지시합니다. 따라서 msbuild 인스턴스는 빌드가 완료된 후 닫히고 더 이상 서로 충돌하지 않으므로 위의 오류가 발생합니다.
  • 작업 당 너무 많은 노드가 생성되지 않도록 'm'매개 변수가 4로 설정됩니다.

나는 같은 문제가 있었다. 내가 찾은 오래된 참조는 csproj 파일에 있습니다.

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

또한 Visual Studio를 닫은 후 sln 파일과 같은 폴더에있는 "Packages"폴더 전체를 삭제했습니다. VS가 폴더를 다시 빌드하고 이전 버전의 stylecop 캐시를 놓아 버리도록 트리거했습니다.


나는 한동안 같은 문제를 겪었고 일부 파기 후 빌드를 완료하는 데 6 분 이상이 걸렸으므로 노드 재사용 오류를 발견했기 때문에 / m : 4 / nr : false를 추가하여 즉시 내 문제를 수정했습니다.

참고 URL : https://stackoverflow.com/questions/13510465/the-mystery-of-stuck-inactive-msbuild-exe-processes-locked-stylecop-dll-nuget

반응형