in Technology

ตรวจสอบคุณภาพของ Code ด้วย SonarQube

โปรแกรมเมอร์ส่วนใหญ่จะมุ่งมั่นพัฒนา Software ให้เสร็จตามเวลาที่กำหนด จนบางทีก็ละเลยแบบตั้งใจและไม่ได้ตั้งใจ ที่จะทำให้ Source Code ที่เขียน มีคุณภาพหรืออย่างน้อยก็ได้ตามมาตรฐานที่มันควรจะเป็น

เรื่องเหล่านี้บางคนอาจไม่ค่อยอินเท่าไร หากทำงานคนเดียว หรืองานที่เร่งด่วนมากๆ (“งานร้อน” นั่นหละ) โดยเฉพาะงานทำครั้งเดียวเสร็จ ส่ง รับเงิน แล้วก็แยกย้าย.. แต่กับอีกหลายคนที่ต้องทำงานเป็นทีม หรือมี QA , CTO, Team Lead คอยเข้ามาตรวจสอบการทำงานของ Software และ Review Code อยู่สม่ำเสมอ ก็คงต้องปวดหัวกลับมาแก้งานรายชั่วโมง จนไม่ต้องทำมาหากิน

วันนี้เลยเอาเครื่องมือว้าวๆ ตัวหนึ่งชื่อ SonarQube มาให้ลอง มันเป็นตัวที่ช่วยตรวจสอบคุณภาพของ Source Code ให้เราได้แบบอัตโนมัติ 

ความสามารถของ SonarQube หลักๆ มีดังนี้

  • ตรวจหาข้อผิดพลาด (Bugs) ใน Source Code
  • ช่วยค้นหาพวก Source Code ที่แย่ๆ ซับซ้อน มีกลิ่นตุๆว่าจะเป็นปัญหาในอนาคต (Code Smells)
  • ช่วยค้นหาช่องโหว่ต่างๆ ที่เป็นข้อผิดพลาดหรือปัญหาด้านความปลอดภัย (Vulnerabilities)
  • กำหนดค่าของคุณภาพที่จะให้ผ่านได้ด้วยนะ (Quality Gate) เช่น ต้องมี Code Coverage 80%
  • ทำงานร่วมกับ Automation Tools เช่น Jenkins เพื่อทำ Continueus Integration ได้ (Continuous Code Quality)
  • รองรับการตรวจสอบภาษาฮิตๆ ได้มากกว่า 20 ภาษา เช่น Java, PHP, C#, Python, Swift, C/C++, Javascript ฯลฯ
  • ทั้งหมดนี้… ฟรี!! (Open Source)

แค่อ่านความสามารถจบก็ โครต “ว้าว!!” ตามที่บอกเลยปะล่ะ

ลองติดตั้ง SonarQube Server กัน

ถ้าใครใช้ Docker ก็ติดตั้งไม่ยาก จะใช้ sonarqube ที่ hub.docker หรือ git ของผมก็ได้ (เอา official มาปรับนิดหน่อย ใส่ extension + ทำเป็น docker-compose)

ถ้าใช้ official ก็ทำคำสั่งง่ายๆเลย คือ

$ docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube

แต่ถ้าไม่ได้ใช้ Docker ก็ไปหาติดตั้งได้ที่นี่ครับ https://www.sonarqube.org/downloads/

เวลาใช้งาน Server จะเข้าผ่าน URL

http://localhost:9000

ติดตั้ง

ติดตั้ง SonarQube Scanner

หลังจากมี Server สำหรับเก็บรวบรวม Report แล้ว จะต้องมีตัว Scanner เพื่อทำการประมวลผล Source Code ของเราเพื่อส่งเข้าไปทำ Report ซึ่งตัวนี้เรียกว่า SonarQube Scanner

โดยตัวมาตรฐาน จะสามารถดาวโหลดได้ที่
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

ที่ผมบอกว่าเป็นตัวมาตรฐาน เพราะมีภาษาบางภาษาจะต้องใช้ Scanner ที่ทำมารองรับภาษาของตัวเอง เช่น .Net Core จะต้องใช้ SonarQube Scanner for MSBuild เท่านั้น ถึงจะอ่าน Source Code ออก เป็นต้น ดังนั้น ลองดูความเหมาะสมของภาษาที่ตนเองใช้ และโหลดตามลิงค์ด้านล่างได้เลยครับ

สร้างไฟล์ Sonar Config

ในการสั่งให้ Scanner ทำงานอ่าน Source Code ใดๆ จะต้องสร้าง Config ไว้ในโฟลเดอร์ของ Source Code นั้นไว้ด้วย

โดยไฟล์ที่สร้างจะชื่อว่า “sonar-project.properties” และข้อมูลหลักๆที่ใส่คือ

# SonarQube server
sonar.host.url=http://localhost:9000

# must be unique in a given SonarQube instance
sonar.projectKey=my:project

# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=My project
sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Replace “\” by “/” on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.

# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8

เช่น ผมจะให้ Scan Source Code ของ PHP Project เพื่อทำ report ไว้บน Docker บนเครื่องผมเอง

sonar.host.url=http://localhost:9000
sonar.projectKey=My-PHP-Project
sonar.projectName=My-PHP-Project
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.sources=./application/
sonar.language=php

สั่งให้ SonarQuber Scanner ทำงาน

เมื่อเซ็ตทุกอย่างเรียบร้อย ก็เข้าไปที่โฟลเดอร์ Source Code ของเรา ที่มีไฟล์ sonar-project.properties เรียบร้อยแล้ว จากนั้นรันคำสั่ง

$ sonar-scanner

จะขึ้นข้อความแสดงการทำงาน ก็รอมันทำจนเสร็จ และมีข้อความ Excution Success

จากนั้นเข้าไปที่ http://localhost:9000 มันก็จะแสดงข้อมูล Dashboard ทุกโปรเจ็คที่เราเคยสั่งให้มัน Scan ทั้งหมดมาให้

เมื่อกดเข้าไปดูรายละเอียดของ Project จะบอกเลยครับว่า มี Bug เท่าไร, Code Smell เท่าไร ฯลฯ

กดเข้าไปดูรายละเอียดลึกลงไปอีก ก็จะเห็นว่ามีปัญหาอะไรที่ไฟล์ไหน เพื่อให้เราแก้ไข (ซึ่งบางที ปัญหาหลายอย่างที่พบ ก็อาจไม่ได้ส่งผลให้ Software ทำงานผิดพลาด แต่แค่ไม่เป็นไปตามมาตรฐานนั่นเอง)

สรุป

ลองใช้ดูแล้ว สนุกมากครับ ช่วยเราหา Bug หาโค้ดที่ไม่ดีได้ อ่านไปก็แก้ไป จำไป ดีต่อการพัฒนาความรู้ตัวเอง แต่สิ่งที่ต้องระวังและที่ผมพบปัญหาคือ บางทีติดตั้ง Scanner สำหรับใช้ในภาษาต่างๆ พอใช้แล้วปรากฎว่า ได้เกรด A ทุกหัวข้อ ไม่มี Code Smell ไม่มีข้อผิดพลาดอะไรเลย ซึ่งก็อย่าไปเชื่อมันนะครับ ปัญหานี้เกิดจากมัน Analyst Code ไม่ได้ เลยทำให้ไม่เจอปัญหา แล้วไอ้เจ้า SonarQube ก็ดันไม่แจ้ง Error อะไรมาด้วยว่ามัน Analyst ไม่ได้ ซึ่งจุดนี้ต้องทดสอบ Code ให้มันแบบ Pass และ Fail คู่กัน ให้เห็นว่ามันทำงานได้จริงไหม

เมื่อใช้คล่องตัวแล้ว เอามันไป Integrate กับ Jenkin เพื่อทำ CI/CD ก็ได้นะครับ เช่น เมื่อ Test ผ่านหมดแล้ว ก็ให้ Analyst Code ต่อว่าผ่านมาตรฐานที่เรากำหนดไว้ร่วมกันหรือไม่ ถ้าผ่านค่อย Deploy ต่อไป เป็นต้น .. แค่คิดก็มันส์แล้ววว

  • Jirawat Maubkhuntod

    จัดปายยย

  • วัฒนชัย วงศ์ประเสริฐ

    ตัว docker-compose.yml จะเพิ่ม params ของ user / pwd ยังไงครับ