เพิ่มคุณภาพของ Code ด้วย SonarQube

Petch Kruapanich
readmoreth
Published in
3 min readJun 30, 2019
เพิ่มคุณภาพของ Code ด้วย SonarQube

เคยไหมครับเวลาอ่านโค้ดที่เพื่อนในทีมเขียน แล้วเจอว่ารูปแบบการเขียนมันช่างหลากหลาย ไม่ว่าจะเป็นเรื่องง่ายๆอย่างการตั้งชื่อตัวแปร ที่บางคนก็เอา camel case บางคนก็เป็น snake case หรือจะเป็นเรื่องที่จริงจังขึ้น อย่างการเปิด connection database แล้วไม่ปิด

ยิ่งมีคนในทีมเยอะ การเขียนยิ่งหลากหลาย คุณภาพยิ่งกระจัดกระจาย จะดีกว่าไหมถ้าเรามีบางอย่างที่สามารถช่วยให้เราเขียนโค้ดได้มีคุณภาพ ได้มาตรฐาน และลดช่องโหว่ รวมถึงความเสี่ยงที่อาจจะเกิดขึ้นได้

วันนี้ผมเลยอยากจะมาขอแนะนำ SonarQube เครื่องมือที่จะช่วยให้การเขียนโค้ดของคุณ และทีมงาน ออกมาดีกว่าเดิม เพราะมันสามารถช่วย detect สิ่งที่เรียกว่า Code Smell ได้ก่อนที่มันจะเกิดปัญหาในอนาคต ซึ่งทั้งหมดนี้สามารถใช้งานได้ฟรีเลยนะ (แต่ถ้าจะ Scan Code ที่เป็น Swift ต้องเสียเงินนะ)

Prerequisite

  1. สิ่งที่ต้องทำอันดับแรกเลยก็คือ ติดตั้ง SonarQube Server กันก่อน ซึ่งตัวนี้ก็เหมือนเป็น Dashboard ที่จะเก็บผลการทดสอบ และการตั้งค่าว่า โค้ดที่เรา Scan แล้ว ได้คะแนนประมาณเท่าไรถึงจะผ่านเกณฑ์ โดยใช้คำสั่งประมาณนี้
$ docker pull sonarqube
$ docker run -d --name sonarqube -p 9000:9000 sonarqube

เมื่อติดตั้งเสร็จแล้วก็สามารถเข้าไปใช้ได้เลย โดยระบุ ตาม port ที่คุณได้ติดตั้งไว้เช่น https://test.mywebsite.com:9000 ซึ่งตรงนี้คุณสามารถ Login โดยใช้ username password ว่า admin/admin เพื่อไปตั้งค่าต่างๆต่อได้ (แต่อย่าลืมเปลี่ยน default password ด้วยนะ)

หน้าแรกของ SonarQube

2. ทำการสร้าง Project ขึ้น โดยกดที่ปุ่ม Create new project และดำเนินตามขั้นตอนไปเรื่อยๆ

ทำการสร้าง Project

3. เมื่อสร้าง Project แล้ว เราต้องสร้าง token เพื่อที่จะใช้ในการอัพโหลดผลการ scan ขึ้นมา โดยจะกดปุ่ม Generate ไปเลยก็ได้ หรือจะเขียน phase บางอย่างเพื่อให้เอาไปสร้าง token ก็ได้

กำหนด Phase เพื่อสร้าง token

4. เมื่อเราได้ token มาแล้ว ให้เก็บเอาไว้ก่อน จากนั้นเลือกประเภท Project ที่ต้องการ ตัว SonarQube จะทำ sample script มาให้ อย่างกรณีนี้ผมเลือก C# ซึ่งมันจะใช้ MSBUILD

เลือกประเภทของ Project ที่ต้องการ

5. ติดตั้ง SonarQube Scanner ที่ทำหน้าที่ในการประมวลผล Source Code ก่อนส่งไปยัง SonarQube Server โดยในตัวอย่างนี้ ผมจะ Scan Code ที่เป็น .net core 2.x ซึ่งเราต้องติดตั้ง dotnet-sonarscanner ก่อน โดยสามารถใช้คำสั่งนี้ได้เลย (สามารถดูรายละเอียดเพิ่มเติมได้ที่ SonarScanner for MSBuild เพราะแต่ละ platform จะมี OS ที่แตกต่างกันไป)

dotnet tool install --global dotnet-sonarscanner --version 4.6.2

ลอง Scan Code กันดู

การ Scan Code สามารถใช้คำสั่งนี้ได้เลย

$ dotnet build-server shutdown$ dotnet sonarscanner begin /k:"SampleProject.Web" /d:sonar.host.url="https://test.mywebsite.com:9000" /d:sonar.login="ebe3646589f98f04eec3f69867367cc27084df11" /d:sonar.language="cs"$ dotnet build SampleProject.sln
$ dotnet sonarscanner end /d:sonar.login="ebe3646589f98f04eec3f69867367cc27084df11"

โดยเราต้องระบุข้อมูลประมาณนี้ลงไป
Main project name: SampleProject.Web
SonarQube Host: https://test.mywebsite.com:9000
Project token: ebe3646589f98f04eec3f69867367cc27084df11
Solution name:
SampleProject.sln

เมื่อลองเข้าไปดู ก็จะเห็นว่า คุณภาพของ Code ที่เราเขียนไปเลวร้ายขนาดไหน

ผลการ Scan Code ด้วย SonarQube จะเห็นว่าเลวร้ายมาก

ซึ่งตรงจุดนี้เราก็ค่อยๆไล่แก้กันไป โดย SonarQube ก็ใจดี มี Suggestion รวมถึง best practice ขึ้นมาแนะนำให้เราด้วยว่า เราควรแก้ไข Code ในส่วนดังกล่าวยังไงได้บ้าง

ปัญหาที่เกิดขึ้น และข้อเสนอแนะในการแก้ไข

แล้วถ้าเราอยากให้มันเอา Test Coverage ขึ้นมาด้วยละ

การเอา Test Coverage ถ้าเรารันด้วยคำสั่งดังกล่าวไป จะพบว่า Test Coverage ที่เราเขียน Unit Test เอาไว้ มันจะไม่ถูกเอาขึ้นมาด้วย แต่สามารถทำได้ โดยมีขั้นตอนดังนี้

  1. เข้าไปที่ Project Test (สำหรับกรณีนี้ ก็คือไปที่ SampleProject.Test)แล้วติดตั้ง package coverlet.msbuild เพื่อใช้ในการเก็บ Code Coverage Test
dotnet add package coverlet.msbuild

2 เพิ่มคำสั่งเข้าไปเล็กน้อย ตามนี้

$ dotnet restore SampleProject.sln
$ dotnet build SampleProject.sln
$ dotnet test SampleProject.Test/SampleProject.Test.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
$ dotnet build-server shutdown$ dotnet sonarscanner begin /k:"SampleProject.Web" /d:sonar.host.url="https://test.mywebsite.com:9000" /d:sonar.login="ebe3646589f98f04eec3f69867367cc27084df11" /d:sonar.language="cs" /d:sonar.cs.opencover.reportsPaths="SampleProject.Test\coverage.opencover.xml"$ dotnet build SampleProject.sln
$ dotnet sonarscanner end /d:sonar.login="ebe3646589f98f04eec3f69867367cc27084df11"

Test Project name: SampleProject.Test/SampleProject.Test.csproj
Test Report Path: SampleProject.Test\coverage.opencover.xml

และเมื่อลองรันอีกครั้ง เราก็จะพบว่า Code Coverage ขึ้นมาแล้ว

การนำ Test Coverage ขึ้นมา เป็นอีกหนึ่งปัจจัยในการวัดผล

และนี่ก็เป็นขั้นตอนสำหรับการใช้งาน SonarQube เบื้องต้น แม้ว่าธรรมชาติของพวกเราชาวโปรแกรมเมอร์ ที่จะพยายามเขียนโค้ดให้เสร็จเร็วที่สุด จนบางครั้งอาจเผลอละเลยในเรื่องการให้ความสำคัญกับคุณภาพในการเขียนโค้ดไปบ้าง การเริ่มต้นใช้งาน SonarQube อาจจะเป็นจุดเริ่มต้นที่ดี ในการปรับกระบวนการเขียนโค้ดให้ออกมาได้มาตรฐาน และสามารถทำงานต่อกันภายในทีมได้ดีมากขึ้นก็ได้ ยังไงก็อยากให้ทุกคนลองเอาไปใช้กันนะครับ :)

--

--

Petch Kruapanich
readmoreth

Full time Developer, Part time writer, Vinyl lover