บันทึก SonarQube กับ .NET6

ช่วงนี้เป็นการ Re-Cap งาน Migrate จาก .NET4.7.2 > .NET6 ตัว Blog ช่วงนี้ จะมาแนวๆนี้เยอะหน่อยครับ ^__^

การเตรียมข้อมูล

- Test Report
dotnet test --logger "trx;logfilename=${TESTREPORTPATH}\\\${sub}.trx"

#NOTE sub ชื่อ test report พอดีของผมจะมีให้มัน custom ชื่อ ถ้าเอาตาม default มันไม่เหมาะกันคนอ่านครับ
- Test Coverage
  • ถ้าอ้างอิงจาก Official Document Use code coverage for unit testing - .NET
  • ตอนเรา New MS Test Project มา มันจะ Default Add Nuget coverlet.collector มาให้
  • ตอน Generate Test Coverage เพิ่มคำสั่ง ดังนี้ //เพิ่ม --collect:"XPlat Code Coverage"
dotnet test --collect:"XPlat Code Coverage"  --logger "trx;logfilename=${TESTREPORTPATH}\\\${sub}.trx"--logger "html;logfilename=${TESTREPORTPATH}\\\${sub}.html"
  • แต่ทว่า Output ที่ได้ จะไม่สามารถเอาเข้า SonarQube ตรงๆได้
  • ใช้ Tool ReportGenerator มาช่วย ใน Scenario
    - รวมไฟล์ .trx ให้ได้ไฟล์เดียว โดยเจ้าไฟล์ .trx (Microsoft Visual Studio Test Results File) ที่เก็บ Test Report / Test Coverage ในแบบ xml ตอน Run dotnet test มันจะ Generate มาตาม Test Project ครับ
    - แล้วให้ ReportGenerator แปลง Format สำหรับตัว SonarQube
  • สำหรับการรวมไฟล์ .trx + แปลงไฟล์ของ SonarQube สามารถใช้คำสั่งด้านล่างนี้เลย
reportgenerator -reports:"$COVERAGEPATH\\**.xml" -targetdir:"$COVERAGEPATH\\sonarqubecoverage" -reporttypes:SonarQube
- Sonar Scanner .NET
  • อันนี้สะดวกหน่อย ลง Tool จาก NuGet ได้เลย ถ้าเป็น .NET Framework เดิม ต้องเอา .zip มาแตตกเอาครับ โดยตัว Tools ติดตั้ง ดังนี้
dotnet tool install --global dotnet-sonarscanner
  • ตัวอย่างการใช้งาน
dotnet sonarscanner begin /k:"project-key" /d:sonar.login="<token>"
dotnet build <path to project file or .sln file>
dotnet sonarscanner end /d:sonar.login="<token>"
  • Import Test Report เพิ่ม Param sonar.cs.vstest.reportsPaths
/d:sonar.cs.vstest.reportsPaths="$TESTREPORTPATH\\*.trx"
  • Import Test Coverage เพิ่ม Param sonar.coverageReportPaths
/d:sonar.coverageReportPaths="$COVERAGEPATH\\sonarqubecoverage\\SonarQube.xml" 

คำสั่งทั้งหมด

  • ถ้าใช้ Jenkins ประมาณนี้ครับ ตัว withSonarQubeEnv มันจะช่วยไม่ให้ตัว Credential ของ Sonar ฝั่งไปกับ Pipeline ครับ
withSonarQubeEnv(installationName: 'ds-sonarqube', credentialsId: 'sonarqube-jenkins') {
   powershell(script: """
      dotnet sonarscanner begin /k:"com.ds.invest:invest-ui" /v:$BUILDVERSION /d:sonar.dotnet.excludeTestProjects=true /d:sonar.coverageReportPaths="$COVERAGEPATH\\sonarqubecoverage\\SonarQube.xml" /d:sonar.cs.vstest.reportsPaths="$TESTREPORTPATH\\*.trx"
      dotnet build WebAPI.Standard.sln -p:Configuration='${params.MODE}'  -p:Platform="x64" -p:AssemblyVersion='$BUILDVERSION' -p:Version='$BUILDVERSION' -nodeReuse:false --maxcpucount:8
      reportgenerator -reports:"$COVERAGEPATH\\**.xml" -targetdir:"$COVERAGEPATH\\sonarqubecoverage" -reporttypes:SonarQube
      dotnet sonarscanner end
    """)     
}

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.