SonarQube Part 2

มาต่อ ต่อมา กับ SonarQube

ตอนที่แล้วตัดจบ (ยังกะหนังทุนต่ำเพื่อกะเอารายได้หลายๆภาค) ตอนลงโปรแกรม SonarQube เสร็จแล้ว ตอนนี้เรามาต่อที่วิธีการใช้งานกันเลยดีกว่าว่า SonarQube ทำอะไรได้บ้าง

ผมเขียนเกี่ยวกับ Sonarqube ไว้หลายตอน คุณสามารถกด Link ด้านล่างเพื่ออ่านที่เกี่ยวกับ Sonarqube ตอนต่างๆได้เลย

ใครๆก็ต้องผ่านหน้า Login

User password Default ของ SonarQube คือ

1
2
user: admin
pass: admin

พอ Login ปุ๊ปก็ตัวโปรแกรมก็มี Guide มาแนะนำให้เรา (ไม่ต้องอธิบายแล้วมััง) ซึ่งอธิบายได้ดีเลยทีเดียว

  1. ส่วนแรกโดยตัว SonarQube จะให้เรากรอกข้อมูลเพื่อสร้างเป็น Token ที่ใช้ในการ Authen ส่งผลการ scan กลับมาที่ server โดยมีกดสร้างมันจะไปแสดงด้านขวาดังรูป
  2. ส่วนถัดมาจะเป็นส่วนที่เป็นจะให้เลือกว่า Source code ที่เราต้องการ Scan นั้นเป็นภาษาอะไร โดยในที่นี้ผมเลือกเป็น Other เพราะต้องการ Scan code ที่เป็นภาษา javascript
  3. สว่นถัดมาจะเป็นการ OS ที่เราใช้อยู่ อันนี้หมายถึง เครื่องของเราที่กำลังเขียนโปรแกรมอยู่นะครับ (ไม่ใช่เครื่องที่ลง SonarQube server นะครับ) โดยของผมเป็น Windows ครับ

เมื่อเลือกทั้งหมดเสร็จตัว SonarQube จะทำการสร้าง cmd ขึ้นมาให้ทางด้านขวาซึง่เราสามารถทำไปใช้ scan code ของเราได้ในทันที (ง่ายจริงๆ)

เริ่ม scan code กันเลยดีกว่า

  1. ขั้นแรกต้องไป Download ตัว SonarQubeScaner มาก่อนครับ โดยกด Download ตามที่ตัวโปรแกรมแนะนำเลย ต่อจากนั้นทำการ Set Path environment เลยครับ โดยทำได้ตามลิ้งด้านแล้วแต่ OS เลย

  2. ลองหา Source code project มาสัก Project เพื่อทำการ scan กัน ซึ่งผมไปเอา Project ฮาๆที่เคยเขียนกับเพื่อนมาทดลอง scan ละกัน

    1
    git clone https://github.com/serm-tape/loveteller

    เมื่อ clone เสร็จก็จะได้ directory : loverteller มา จากนั้นเปิด cmd ขึ้นมาจากนั้นสั่งใช้ command

    1
    2
    3
    4
    5
    6
    #ย้าย current directory ไปที่ที่อยู่่ใน directory loveteller
    cd path/to/loveteller

    #อันนี้ของ Window นะครับ ถ้า Linux อาจไม่ได้สั่งอย่างนี้

    sonar-scanner.bat -Dsonar.projectKey=loveletter -Dsonar.sources=. -Dsonar.host.url=http://192.168.56.101:9000 -Dsonar.login=e096e94d061625ef1a0e515462a08bb9e7891fe2 -Dsonar.sourceEncoding=UTF-8

    สังเกตตรง -Dsonar นั้นคือ parameter ที่ส่งเข้าไปในตัว scaner ได้ โดยมีรายละเอียด Parameter ของตัว Scaner ตามลิ้งนี้

    • sonar.projectKey คือชื่อ project ที่จะไปสร้างใน sonarqube
    • sonar.sources คือตำแหน่งที่เราจะให้ตัว scaner ทำการ scan โดยในตัวอย่างจะใช้ . แปลว่าเอาตั้งแต่ current directory ลงไปเลย
    • sonar.host.url คือ ที่อยู่ของ server SonarQube
    • sonar.login คือ ข้อมูลที่ใช้ในการ Login โดยอันนี้ผมใช้เป็น token ที่ได้จากการ gen ตรง guide (จริงสามารถใช้ user เป็น username ได้แต่ต้องส่ง sonar.password ไปด้วย)
    • sonar.sourceEncoding คือ การเข้ารหัส Source code อันนี้ set ตาม source code ของคุณครับว่าเข้ารหัสด้วยอะไร

ไปดูที่ Server ว่าได้อะไรบ้าง

ที่ Server จะมีข้อมูล Project ที่เราพึ่ง scan เมื่อกี้โผล่ขึ้นมา ลองกดเข้าไปจะพบว่าตัวโปรแกรม SonarQube ได้สรุปว่าเจออะไรที่สุ่มเสี่ยงใน Code ที่เขียนไปบ้าง โดยข้างผมเจอ Code smell ไป 8 ตัว เมื่อกดเข้าไปดูจะเห็นดังภาพข้างล่าง

โดยตัว SonarQube จะบอกเหตุผลด้วยว่าทำไม Code ถึงถูกจัดอยู่ในกลุ่ม Code ที่ไม่ดี อีกทั้งยังบอกวิธีแก้ไขด้วย (โดยการกดที่ …) ด้านหลัง

ตั้งค่าให้เป็น Private สิ คนนอกจะได้เข้ามาใช้ไม่ได้

เมื่อ Login เข้ามาด้วยสิทธิ์ admin แล้วให้ไปที่ส่วนการจัดการด้าน Security ดังภาพและกำหนดค่า Force authentication ให้เป็น True เพื่อบังคับให้การส่ง Code มาทำการ Scan นั้นต้องทำการ Authentication เข้ามาทำ (โดยปกติ SonarQube เปิดให้ใครเข้ามาก็ได้ )

จบ Part 2 End credit ขึ้น

ก็ถ้าทำตาม Part นี้ทั้งหมดเราก็จะสามารถทำการ scan code แล้วส่งไปให้ตัว SonarQube server ทำการวิเคราะห์หาส่วนที่สุ่มเสี่ยงจะสร้างปัญหาในอนาคต สำหรับผมตัว SonarQube นี่เหมือนด่านแรกในการเขียน Code ให้มีคุณภาพเลยนะ คือถ้า Code ที่เขียนแล้วโดย scan ด้วยกฏธรรมดาๆยังไม่ผ่าน จะให้สิ่งมีชีวิตมา Review ไปทำไมให้เสียเวลา อีกทั้งทุกครั้งที่เราเขียน Code แล้วตัว SonarQube มันฟ้องว่าผิดอะไร เราก็จะได้เรียนรู้ว่าที่เราเขียนมันไม่ดีตรงไหนพร้อมบอกวิธีแก้ไข ซึ่งมันเร็วกว่ารอให้คนอื่นมาบอกมาสอนและมันสามารถทำผิดเท่าไหร่ก็ได้ตามที่เราต้องการ (กับมนุษย์คงมีขีดจำกัด ลองโดนถามสัก 10 รอบ คงจะเริ่มมีอารมณ์ )

แต่ SonarQube ช่วยได้แค่บอกจุดสุ่มเสี่ยงนะครับ ส่วนที่เป็น Flow การเขียนแบบ if ซ้อนกันสัก 10 ชั้น ประกาศตัวแปรแบบห่างไกลกับจุดที่ใช้มากๆ การเขียน Function ทำแม่งทุกอย่างตั้งแต่ต่อ connection ยัน response การประกาศชื่อตัวแปรไม่สื่อความหมาย การเขียนบรรทัดเดียวๆยาวๆแบบโคตร complex การ Design ที่อาจจะสร้างปัญหา อันนี้ SonarQube อาจจะช่วยไม่ได้ ต้องใช้มนุษย์ด้วยกันมาลองอ่าน Code แล้วติชมแก้ไขกัน

"สิ่งที่ผมเขียนขึ้นเป็นเพียงความรู้และความเข้าใจของบุคคลเพียงบุคคลเดียว ดังนั้นอย่าเพิ่งเชื่อในสิ่งที่ผมเขียนและอธิบาย ลองทำความเข้าใจว่ามันเป็นจริงอย่างนั้นไหมและลองหาแหล่งอ้างอิงอื่นๆว่าเขามีแนวคิดอย่างไร เรื่องการ Design และวิธีการใช้งานไม่มีถูกไม่มีผิดมีแต่เหมาะสมกับงานนั้นไหม"