ใช้ SonarQube ตรวจสอบคุณภาพโค้ด Spring Boot กันเถอะ
คุณภาพของโค้ด (Code Quality) ที่เราเขียนขึ้นนั้นเป็นสิ่งที่สำคัญไม่น้อยไปกว่าการทดสอบต่างๆ และเครื่องมือที่ใช้ตรวจสอบคุณภาพโค้ด นั้นก็มีหลากหลาย โดยที่ SonarQube ก็เป็นเครื่องมือที่ได้รับความนิยมมากแถมใช้งานได้ฟรีๆ อีกต่างหาก ซึ่งเป็นเครื่องมือวิเคราะห์โค้ดแบบ static นั้นคือจะวิเคราะห์โค้ดโดยที่แอพพลิเคชันนั้นไม่ได้ทำงาน และในบทความนี้จะใช้ SonarQube มาตรวจสอบ Java Application อย่าง Spring Boot กัน
SonarQube?
เป็น Open Source ที่พัฒนาขึ้นโดยบริษัท SonarSource สำหรับการตรวจสอบที่ต่อเนื่อง (Continuous Inspection) ของคุณภาพของโค้ด โดยทำการวิเคราะห์โค้ดแบบอัตโนมัติด้วย static analysis of code เพื่อตรวจหา bug, code small และ ช่องโหว่ความปลอดภัย โดยรองรับภาษาคอมพิวเตอร์มากกว่า 20 ภาษา ซึ่ง SonarQube จะสร้างรายงานการตรวจสอบต่างๆ ให้เรา และสามารถ intregate เข้ากับ ฺBuild tools ต่างๆ เช่น Maven, Gradle, Ant, MSBuild และ CI tools ต่างๆ เช่น Jenkins, Bamboo, Hudson
Install SonarQube
ในบทความนี้จะติดตั้ง SonarQube บน Docker ซึ่งก็มี 2 วิธีในการรัน SonarQube บน Docker คือใช้คำสั่ง run
โดยตรง หรือใช้ docker-compose
มารัน service โดยผมจะใช้ docker compose เพราะจะใช้ reuse ได้ง่าย ซึ่ง docker-compose.yml
ของ SonarQube จะมี 2 Service คือตัว sonarqube เอง และ db ที่เป็น PostgreSQL ดังนี้
ใช้คำสั่ง docker-compose up -d
เพื่อรัน service ที่กำหนดใน docker-compose.yml
$ docker-compose up -d
Creating network "sonarqube_sonarnet" with driver "bridge"
Creating volume "sonarqube_sonarqube_conf" with default driver
Creating volume "sonarqube_sonarqube_data" with default driver
Creating volume "sonarqube_sonarqube_extensions" with default driver
Creating volume "sonarqube_postgresql" with default driver
Creating volume "sonarqube_postgresql_data" with default driver
Creating sonarqube_db_1 ... done
Creating sonarqube_sonarqube_1 ... done
จะเห็นได้ว่ามีการสร้าง sonarqube_db_1
ที่เป็น DB และ sonarqube_sonarqube_1
ที่เป็น SonarQube สามารถลองใช้คำสั่ง docker ps
เพื่อดูว่า docker container ของ 2 service นี่ทำงานอยู่หรือไม่
สามารถเข้าถึง SonarQube ด้วย URL http://localhost:9000
ก็จะเห็นว่ายังไม่มี project อะไรที่สร้างขึ้น
Login เข้าสู่ระบบ SonarQube ด้วย username และ password ตั้งต้นเป็น admin
และสร้าง project ขึ้นมาใหม่ โดยทั้งชื่อให้กับ project ในบทความนี้จะตรวจสอบ Spring Boot project ที่ผมมีอยู่แล้ว ก็จะเป็นชื่อ spring-boot-restful-service
ขั้นตอนต่อไปก็เป็นการสร้าง token
สำหรับ project ที่สร้างขึ้น และเลือกภาษาและ build tools ทีใช้ ซึ่งในบทความนี้จะเป็น Java และ Maven จะสร้างคำสั่งสำหรับรัน SonarQube มาใช้ จะเห็นได้ว่าเป็น projectKey
ของ project ที่สร้างขึ้น host.url
ที่รัน SonarQube และ login
ที่เป็น token ที่สร้างขึ้นมา
Install Jacoco
เนื่องจากว่า test coverage ของ JUnit นั้นทำงานได้ไม่ดีนักกับ SonarQube ดังนั้นจะใช้ plugin ที่ชื่อว่า Jacoco
มาช่วยสร้าง test coverage ให้กับ Spring Boot project ด้วยการเพิ่ม plugin ของ Jacocoในpom.xml
ดังนี้
Run SonarQube
ใช้คำสั่ง mvn test
เพื่อรัน test ใน project ก็จะได้ test result และ test coverage ดังนั้นรัน SonarQube ด้วยคำสั่งดังนี้ เมื่อรันเรียบร้อยจะได้ BUILD SUCCESS
mvn sonar:sonar \
-Dsonar.projectKey=spring-boot-restful-service \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=0ca7e101e9a4f81b420dfa4ec510ed8e20a46b2a \
-Dsonar.jacoco.reportPaths=target/jacoco.exec
และกลับไปที่หน้วเว็บของ SonarQube อีกครั้งจะเห็นได้ว่ามีผลการตรวจสอบปรากฎขึ้นใน project ที่รันไป
เนื่องจากว่าเป็น project ง่ายๆ จึงมีแค่ 2 test เท่านั้น แต่มี 1 Vulnerabilities (ช่องโหว่) และ 1 Code Smells เมื่อคลิ๊กเข้าไปดูจะเห็นรายละเอียดของปัญหาว่าอยู่ส่วนไหนของโค้ดและมีแนวทางแก้ไข้ให้เรียบร้อย
เมื่อเราทำการแก้ไขและรัน SonarQube เพื่อตรวจสอบโค้ดของเราอีกครั้งก็จะได้รายงานที่แก้ปัญหานั้นไป แต่ก็อาจจะเกิด Code Smell ใหม่ขึ้นมากอีกก็เป็นได้ ดังนั้นเราจะต้องแก้ให้หมดหรือให้เหลือน้อยที่สุดตามคำแนะนำของ SonarQube เพื่อคุณภาพที่ดีของโค้ดเรา
สรุป
จากการติดตั้งและใช้งาน SonarQube กับ Java project อย่าง Spring Boot เพื่อตรวจสอบคุณภาพของโค้ดที่เขียนขึ้นนั้น จะเห็นได้ว่าใช้งานได้ไม่ยาก เพราะ SonarQube ได้สร้างคำสั่งสำหรับรัน SonarQube ให้แล้ว อีกทั้งยังรองรับหลายภาษาคอมพิวเตอร์และ build tools อีกด้วย เมื่อเรามีการตรวจสอบคุณภาพในโค้ดเราแล้วและทำการแก้ไขก็จะทำให้โค้ดเรามีคุณภาพปลอดจากช่องโหว่ความปลอดภัยและ Code Smell ก็เป็นตัวชี้วัดสำหรับ Technical Debt ที่เราต้องใช้ในการแก้ไขปัญหาที่อาจจะเกิดขึ้น แต่บทความนี้เป็นการใช้งาน SonarQube อย่างง่าย ซึ่งก็ยังมีความสามารถอื่นๆ อีกมากมาย