ต้นเรื่อง ตอนแรกไปซนดู Monitor ของ VM แต่ละตัว แล้วพบว่าทำไม VM ที่มี SonarQube Docker ใช้ CPU / RAM นานปิดปกติ เลยเข้าไปตรวจสอบข้างใน SonarQube พบว่า background analysis task ทำงานนานมากกก
- เดิม 1-2 นาที
- ใหม่ 17-18 ชั่วโมง

ทำไมมันใช้เวลาเพิ่มขึ้นขนาดนั้นนนนนน สิ่งที่แรกสงสัยเลย Size ของ Code ที่เข้ามาเพิ่มครับ ตัว SonarQube มันจะใช้เวลาตรวจตามไฟล์ใหม่ที่ส่งเข้ามาครับ ตอนนี้ลองเข้าไปที่ Measures > Size > New Lines โอ้วเจอไฟล์แปลกที่ Sub-Module ครับ เพิ่มมาตั้ง 4.3 ล้าน บรรทัด

ลอง Drill-Down ลงไปอีกครับ ชัดเลย Sonar มันเอาพวก Coverage Report ใส่เข้าไปด้วยนี่เอง มาเป็นล้านบรรทัดเลยครับ (ส่วนสีแดง) / งานที่แก้จริงๆ ทั้ง Web / Winform / Service (ส่วนสีเขียว) นิดเดียวเองครับ

สรุปตอนนี้เรารู้สาเหตุกันแล้ว มาจากการที่ตัว SonarQube มันกวาดไฟล์ที่ไม่จำเป็น อย่าง เช่น Test Coverage เข้าไป Process ด้วย โดยแนวทางการแก้ไขมี 2 ทางครับ
- Exclude (Key: sonar.exclusions)
- Delete ไฟล์ก่อนเข้าช่วง SonarQube Analysis ครับ
สำหรับผมเลือกวิธีการ Delete ไฟล์ออกครับ เพราะว่า
- Test Result และ Test Coverage ใน Jenkins Pipeline ผมได้ Copy แยกของทุก Project เอาไว้อีกทีนึงแล้วครับ
- เคสนี้น่าจะเกิดจากการ Run dotnet test แบบ solution มันก็เลยไปสร้าง Folder TestResults ในทุก TestProject ตอนทำรอบแรก ผมแค่ Copy ไฟล์ออกมา ไม่คิดว่า Sonar มันจะเอาไปวิเคราะห์ด้วยครับ ทางแก้ง่ายๆ เลย PowerShell ไล่ลบออกไปครับ ^__^
stage ("Unit Test") { when { expression { return params.EXECUTEUNITTEST } } steps { //Test Execution Command ...... //Clear TestResults Before SonarAnalysis dir("${BASE_PATH}\\invest-service\\UnitTest") { powershell(script: """ \$testResultPathls=Get-ChildItem \$path -Directory -Recurse | Where-Object { \$_.Name -match 'TestResults*' } | Select FullName foreach(\$testResultPath in \$testResultPathls.FullName) { echo "Clear Test Result Folder in \${testResultPath}" } """) } } }
หลังจากแก้ไปแล้ว ผล SonarQube Analysis จากเกือบๆ 18 ชั่วโมง ลดลงเหลือ ประมาณ 2 นาทีแล้วครับ ^__^

Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.