ทำ Code Analysis ของ .NET Core ใน SonarQube

ก่อนนี้ SonarQube ยังไม่มี feature ที่รองรับ .NET Core ถ้าจะใช้งานบน platform ที่เป็นตระกูล Linux จะต้องใช้ mono เพื่อให้มันสามารถรัน MSBuild.exe ได้ จนเมื่อเดือนมีนาคมที่ผ่านมา SonarQube ก็ออกตัว SonarQube Scanner for MSBuild ที่สนับสนุนการ scan code ที่เป็น .NET Core แบบไม่ต้องพึ่ง mono และสามารถทำงานผ่าน dotnet cli ได้มาใช้กันแล้ว

วิธีติดตั้ง

ง่ายมาก สิ่งที่ต้องมีก่อนใช้งาน SonarQube Scanner for MSBuild ก็คือ

  1. .NET Core SDK 2.0 ขึ้นไป
  2. JRE 8 (อย่าลืมเซ็ต $JAVA_HOME ไปที่ที่ JRE 8 มันติดตั้งอยู่ด้วย)
  3. SonarQube Server

ที่เหลือก็แค่

  1. ดาวน์โหลด SonarQube Scanner for MSBuild
  2. แตกไฟล์ Zip ที่โหลดมา เอาไปวางไว้ที่ไหนก็ได้ เช่น /opt/bin/sonarscanner-msbuild หรือ C:\tools\sonarscanner-msbuild
  3. แก้ไขไฟล์ SonarQube.Analysis.xml ที่อยู่ในโฟลเดอร์ที่วางไว้ในข้อ (2)
    • sonar.host.url ใส่เป็น SonarQube Server ของเรา หรือเป็น SonarCloud
    • sonar.login ใส่เป็น token ที่ได้จากใน SonarQube Server หรือ SonarCloud โดย token จะต้องเป็นของ user ที่มีสิทธิในการทำ Analysis
  4. ถ้าเป็น Linux/OSX ให้กำหนด execute permission ลงไปใน sonarscanner-msbuild/sonar-scanner-(version)/bin ด้วย

วิธีสั่ง Code Analysis

ตอนเวลาสั่ง Code Analysis ก็แค่ใช้คำสั่ง

dotnet <path to SonarScanner.MSBuild.dll> begin /k:"project-key"
dotnet build
dotnet <path to SonarScanner.MSBuild.dll> end

เช่น

dotnet /opt/bin/sonarscanner-msbuild/sonar-scanner-3.1.0.1141/SonarQube.MSBuild.dll begin /k:"MyWork"
dotnet build
dotnet /opt/bin/sonarscanner-msbuild/sonar-scanner-3.1.0.1141/SonarQube.MSBuild.dll end

ที่เหลือก็รอดูผลลัพธ์ใน SonarQube Server หรือ SonarCloud ได้เลย

ทีนี้ ถ้าจะเอาผลของ Code Coverage มาใส่ด้วยจะต้องทำยังไง

วิธีเอาผล Code Coverage มาใส่ใน SonarQube ขึ้นอยู่กับชนิดของ code coverage ว่าถูกสร้างในฟอร์แมตไหน เช่น dotcover หรือ opencover จากในโพสต์ก่อนหน้าที่ใช้ Coverlet ตอนนี้จะสนับสนุนไฟล์ที่เป็น json, lcov, opencover และ cobertura เท่านั้น ดังนั้นจะเขียนถึงแค่ OpenCover อย่างเดียว

OpenCover

ตอนสั่ง scanner begin ให้ส่ง option /d:sonar.cs.opencover.reportsPaths=<path>/opencover.xml ไปด้วย เช่น

dotnet /opt/bin/sonarscanner-msbuild/sonar-scanner-3.1.0.1141/SonarQube.MSBuild.dll begin /k:"MyWork" /d:sonar.cs.opencover.reportsPaths=./opencover.xml
dotnet build
dotnet test --no-build /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
dotnet /opt/bin/sonarscanner-msbuild/sonar-scanner-3.1.0.1141/SonarQube.MSBuild.dll end

เจอปัญหาว่า Code Coverage มันไปนับ Coverage กับ Project ที่เป็น Unit Test ด้วย ทำไงดี

โพสต์วิธีแก้ไขไว้แล้ว อยู่ที่ เอา .NET Core Project Test ออกจาก Code Coverage ใน Sonarqube

อ้างอิง

Leave a Reply

Your email address will not be published. Required fields are marked *