비활성 상태 인 msbuild.exe 프로세스의 잠김, Stylecop.dll 잠김, Nuget AccessViolationException 및 CI 빌드가 서로 충돌 함으로 인한 신비



(2)

관찰 :

  • Jenkins 빌드 서버에서 약 20MB의 메모리 사용량과 0 % CPU 활동으로 작업 완료 후 많은 msbuild.exe 프로세스 (~ 100)를보고있었습니다.

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

    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`

Answer #1

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

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

또한 Visual Studio를 닫은 후 sln 파일과 같은 폴더에있는 전체 "Packages"폴더를 삭제했습니다. 그것은 VS를 트리거하여 폴더를 다시 만들고 이전 버전의 stylecop 캐시를 놓아 둡니다.


Answer #2

많은 것들을 파고 여러 가지를 시도해 보지 못한 끝에 결국 거의 새로운 문제없이이 문제를 재현 한 새로운 최소한의 솔루션을 만들었습니다. 이 문제는 msbuild의 다중 코어 병렬화 ( 'm'매개 변수)로 인해 발생하는 것으로 나타났습니다.

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

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

수정 사항 :

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




stylecop