msbuild - stylecop github




비활성 상태 인 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`

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

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

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


많은 것들을 파고 여러 가지를 시도해 보지 못한 끝에 결국 거의 새로운 문제없이이 문제를 재현 한 새로운 최소한의 솔루션을 만들었습니다. 이 문제는 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