고정 된 비활성 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 인스턴스를 확인했습니다.
다음 게시물이 도움이되었습니다.
- 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에 "노드 재사용"을 사용하지 않도록 지시합니다. 따라서 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를 추가하여 즉시 내 문제를 수정했습니다.
'IT박스' 카테고리의 다른 글
rails 부울 필드 :`is_foo` 또는 그냥`foo`? (0) | 2020.12.09 |
---|---|
{key : key, value : value,…} 대신 {key : value,…}로 사전을 C # JSON 직렬화 (0) | 2020.12.09 |
삽입 모드로 들어 가지 않고 개행을 삽입하십시오. (0) | 2020.12.09 |
Scala 제네릭 메서드-T에 사용할 수있는 ClassTag 없음 (0) | 2020.12.09 |
Scala 용 정적 분석 도구의 현재 상태는 무엇입니까? (0) | 2020.12.09 |