SonarQube Part 3

Connect CI กับ Sonarqube ด้วย WEB API

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

หลังจากหายไปนานกับ Sonarqube (หายไปปีกว่า) และการเขียน Blog (หายไปเป็นเดือน) รอบนี้เลยกลับมาอัพเดท Blog กันหน่อย เลยหยิบเอาเรื่อง Sonarqube ที่พึ่งทำไปได้หยกๆมาเขียนเลยละกัน คือเรื่องมันเริ่มที่บริษัทเริ่มจะมาทำ CI กันแบบจริงจัง ผมเลยได้มีโอกาสทำการ Set up ส่วนที่เป็น CI ขึ้นมา หลายคนอาจงงว่า Set up ทำไม เขามีบริการอยู่มากมายอยู่แล้ว อันนี้มันเป็นเรื่องของ Policy ล้วนๆเลยครับ การตอบคำถามหน่วยงาน Audit(ซึ่งมันรู้จริงรึเปล่าผมก็ไม่รู้ จะเอามาตรฐานความปลอดภัยของ Service ที่ทำ CI / CD แบบออนไลน์มาเปิดให้ดูม ันจะอ่านแล้วทำความเข้าใจไหม อันนี้ผมก็ไม่รู้ ไปๆมาๆไม่ให้ผ่านที่ทำมาชิบหายหมดอีก) วิธีง่ายๆที่สุดที่จะตอบแม่งคือ ทำเอง On premise นี่แหละ จะเห็นก็เห็นจากคนในด้วยกันเองเนี่ยแหละ ไม่ต้องกลัวคนนอกจะเปิด Backdoor เข้าไปเอา Source code ซึ่งจากการ Install เองหลายๆเรื่องอาจจะเอาเรื่องนั้น เรื่องโน้น เรื่องนี้มาเขียนต่อให้ฟัง

ตามหาวิธีเชื่อมต่อกับ Sonarqube

หลังจากตอนก่อนๆสอนการ Install sonarqube และ สอนการ Scancode ไปแล้ว ซึ่งผมคิดว่ามันน่าจะจบเรื่อง sonarqube ไปละ เพราะเห็นคุณภาพ Code ของตัวเองละ เจออะไรก็เข้าไปแก้ตามที่ Sonarqube บอก แต่พอมาทำ CI ซึ่งทุกอย่างต้องเป็น Auto หมด ตั้งแต่ build, test, add to artifact ซึ่งส่วนหนึ่งที่ทางทีมอยากให้มีคือการตรวจสอบคุณภาพของ Code ว่าผ่านข้อตกลงไหม ถ้าผ่านถึงจะให้ไปสู่กระบวนการต่อไป คราวนี้ก็งานเข้าเลยสิ สมัยก่อนสั่งแต่ Manual อันนี้จะให้เอาเข้า Pipe line แล้วเป็น Auto ด้วย ไอตอน scan อะรู้ว่าทำไง แต่เอาผลกลับมาเนี่ยสิ แต่โชคดีที่ Sonarqube เขาเล็งเห็นจุดนี้ไว้แล้วเลยสร้างตัว Web API ให้เราเข้าไปใช้งาน โดยรายละเอียด API สามารถดูได้ที่

https://codeen-app.euclid-ec.org/sonar/web_api/api/authentication

โดย API ที่ผมใช้คือ

1
api/qualitygates/project_status

โดยเราสามารถยิงไปเอาว่า Project ของเรานั้นผ่าน QualityGate(คือคุณภาพของ Code ที่เรากำหนดกันว่าเท่าไหร่ถึงจะผ่าน) โดยจะตอบกลับมาเป็น Json ประมาณนี้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"projectStatus": {
"status": "ERROR",
"conditions": [
{
"status": "ERROR",
"metricKey": "new_coverage",
"comparator": "LT",
"periodIndex": 1,
"errorThreshold": "85",
"actualValue": "82.50562381034781"
}
]
}
}

ส่วนการ Authentication เข้าใช้งาน sonarqube นั้นเขาออกแบบให้ใช้ Token หรือไม่ก็สามารถใช้ Username , password ได้เลยตามแต่จะถูกใจ โดยวิธีการใช้งานดูได้ตามลิ้งค์ด้านล่างเลย

https://docs.sonarqube.org/latest/extend/web-api/

ประกอบร่าง

เมื่อชิ้นส่วนทั้งหมดครบเราก็สามารถทำการเชื่อมกับ Sonarqube เพื่อทำการ Scan code และเอาผลลัพธ์การ Scan จาก Sonarqube server ว่าประมวลผลต่อว่าจะให้ pipe line ของเราทำงานต่อหรือไม่ โดย Code นั้นสั้นๆง่ายๆเพียงเท่านี้

  • mvn sonar:sonar -Dsonar.projectKey=$PROJECT_KEY -Dsonar.host.url=https://your_sonarqube_endpoint.com -Dsonar.login=$TOKEN -Dsonar.sourceEncoding=UTF-8 -Dsonar.java.binaries=.

บรรทัดนี้เป็นการทำการสั่งให้ scan code และส่งผลลัพธ์ไป sonar server โดยใช้ MAVEN plugin โดย $PROJECT_KEY และ $TOKEN อันนี้เป็นค่าที่เราได้ตอนสร้าง Project โดยสามารถกลับไปอ่านตอนที่ 2 หรือลองสร้าง Project ใน Sonarqube server ดูก็ได้ครับ

  • sleep 10s

อันนี้ไม่มีอะไรมากครับ แค่ทำการรอเป็นเวลา 10 วินาที ซึ่งผมทำ Delay ไว้ให้ Sonarqube ได้รับข้อมูลแล้วเอาไป Check กับ QualityGate ที่ตั้งไว้แล้วสรุปว่า ผ่านหรือไม่ผ่าน ใครจะลดหรือเพิ่มเวลาก็ได้นะครับ อันนี้แล้วแต่เลย

ส่วนนี้คือการใช้คำสั่ง curl (บางคนเรียก เคิล บางคนเรียก ซี-ยู-อา-แอล) ยิงไปดึงข้อมูลจาก Web ที่ต้องการ โดยในที่นี้ผมยิงไปเอาที่ไปที่ api/qualitygates ของ sonarqube เพื่อเอาผลลัพธ์กลับมา โดยเมื่อได้ผลลัพธ์ผมจะเขียนลงไฟล์ชื่อ sonarqube_result.txt

  • grep “{"projectStatus":{"status":"OK"“ sonarqube_result.txt

ส่วนอันนี้เป็นวิธี Hack กระโหลกๆที่ผมคิดได้คือใช้ grep ทำการ grep หาคำว่า {“projectStatus”:{“status”:”OK” ในไฟล์ sonarqube_result.txt โดยกรณีที่ Sonarqube ตรวจสอบว่า Project นี้ผ่าน QualityGate จะ Return เป็นคำที่ผม grep มาเสมอ และด้วยการที่ grep นั้นถ้า grep แล้วเจอคำจะ return exit code เป็น 0 ถ้าหาไม่เจอจะ return exit code เป็นอย่างอะไรที่ไม่ใช่ 0 เนื่องด้วยความสามารถนี้ทำให้ เมื่อเอา code ชุดนี้ไปใส่ใน pipe line ของพวก CI Tool ถ้า quality ของ code ผ่าน quality gate ของ sonarqube มันจะทำงานในส่วนของคำสั่งถัดไป แต่ถ้าไม่ผ่านตรง grep มันจะ return exit code ที่ไม่ใช่ 0 ออกมาซึ่งตัว CI Tool จะมองว่ามันทำไม่สำเร็จจะทำการหยุด pipe line

จบแล้ว

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

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

Video ประกอบการเขียน Blog

โอเฟ่น จอมดาบเวทย์มนต์ การ์ตูนอีกหนึ่งเรื่องในดวงใจของผม เป็นการ์ตูนที่สร้างภาพจำเกี่ยวกับจอมเวทย์ของผมให้แตกต่างจากพ่อมดแม่มดคนอื่นๆ ในขณะที่คนอื่นพูดถึงพ่อมดแม่มดจะนึกถึงพวกแฮรี่พอร์ตเตอร์ใช้คฑาร่ายเวทย์มนต์ แต่ของผมนึกถึงโอเฟ่นวิ่งหาศัตรูพร้อมร่ายเวทย์อัดกันแบบประจันหน้า

ล่าสุด Orphen ประกาศครบรอบ 25 ปี ไม่รู้ว่าเขาทำ Remake หรือภาคต่อรึเปล่าซึ่งถ้าทำก็ขอให้ได้อารมณ์แบบการ์ตูนยุคนั้นนะ