ในยุคที่ Continuous Integration/Continuous Delivery (CI/CD) เป็นตัวแปรสำคัญของโครงการพัฒนาซอฟต์แวร์ คุณภาพของโค้ดจึงมีความสำคัญอย่างยิ่ง หากโค้ดมีข้อบกพร่องหรือปัญหาด้านความปลอดภัย มันจะส่งผลกระทบต่อการทำงานของระบบทั้งหมด Code Quality Gates และ SonarQube คือเครื่องมือที่ช่วยให้คุณตรวจจับปัญหาในโค้ดได้ตั้งแต่เนิ่นและป้องกันการ Deploy โค้ดที่มีคุณภาพต่ำ บทความนี้จะอธิบายวิธีการใช้ SonarQube ในระบบ CI/CD อย่างละเอียด
Code Quality Gates คืออะไร? ทำไมต้องใช้?
Code Quality Gates เป็นกลไกการควบคุมคุณภาพโค้ดที่ทำงานโดยอัตโนมัติในแต่ละขั้นตอนของ CI/CD Pipeline โดยจะตรวจสอบว่าโค้ดที่ส่ง (Push) เข้ามาตรงตามเกณฑ์คุณภาพที่กำหนดไว้หรือไม่ ถ้าไม่ตรง Pipeline จะหยุดและป้องกันการ Merge หรือ Deploy
ประโยชน์ของ Code Quality Gates:
- ตรวจจับปัญหาเร็ว: ข้อบกพร่องในโค้ดจะถูกตรวจพบทันที่หลังจากการเขียนโค้ด ไม่ต้องรอจนกว่าจะเข้าสู่ระยะ Testing
- ลดต้นทุนการซ่อมแซม: การแก้ไขข้อบกพร่องในขั้นตอนแรกจะประหยัดเวลาและทุนกำลังสัพยานมากกว่าการแก้ไขในระยะหลัง
- ป้องกันความเสี่ยง: หลีกเลี่ยงการ Deploy โค้ดที่มีช่องโหว่ด้านความปลอดภัยไปยัง Production
- สร้างวัฒนธรรมคุณภาพ: ทีมจะตระหนักถึงความสำคัญของโค้ดที่สะอาดและปลอดภัย
- เพิ่มประสิทธิภาพของทีม: ลดเวลาในการ Code Review และ Testing ด้วยการอัตโนมัติ
SonarQube คืออะไร? ทำอะไรได้บ้าง?
SonarQube เป็นแพลตฟอร์มแบบเปิด (Open Source) ที่ใช้สำหรับวิเคราะห์คุณภาพโค้ด (Code Quality) และความปลอดภัย (Security) โดยอัตโนมัติ มันสามารถสแกนโค้ดในหลายภาษาเช่น Java, Python, JavaScript, C++, Go, และอื่นๆ อีกมากมาย
ความสามารถหลักของ SonarQube:
- ตรวจหา Bugs: ค้นหาข้อบกพร่องในโค้ดที่อาจทำให้โปรแกรมขัดข้อง
- Code Smells: ตรวจจับส่วนของโค้ดที่ไม่สะอาด อ่านยาก หรือจำเป็นต้องปรับปรุง
- Security Vulnerabilities: ค้นหาช่องโหว่ด้านความปลอดภัยเช่น SQL Injection, XSS, และอื่นๆ
- Code Coverage: วัดสัดส่วนของโค้ดที่ได้รับการทดสอบด้วย Unit Tests
- Technical Debt: คำนวณต้นทุนเทคนิค (Technical Debt) ซึ่งแสดงถึงความต้องการในการปรับปรุง
- Code Duplication: ตรวจหาโค้ดที่ซ้ำกันในเบสโค้ด
- Quality Gates: กำหนดเกณฑ์มาตรฐานที่โค้ดต้องตรงตามก่อน Merge หรือ Deploy
การติดตั้ง SonarQube บน Cloud VPS ด้วย Docker
ขั้นตอนที่ 1: สร้าง Volume สำหรับเก็บข้อมูล
docker volume create sonarqube_data docker volume create sonarqube_logs docker volume create sonarqube_extensions
ขั้นตอนที่ 2: สร้าง Container SonarQube
docker run -d \ --name sonarqube \ -p 9000:9000 \ -p 9092:9092 \ -e SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonarqube \ -e SONAR_JDBC_USERNAME=sonar \ -e SONAR_JDBC_PASSWORD=sonar_password \ -v sonarqube_data:/opt/sonarqube/data \ -v sonarqube_logs:/opt/sonarqube/logs \ -v sonarqube_extensions:/opt/sonarqube/extensions \ sonarqube:latest
หมายเหตุ: SonarQube ต้องใช้ PostgreSQL Database โดยทั่วไป ถ้ายังไม่มี สามารถสร้าง PostgreSQL Container ได้ดังนี้:
docker run -d \ --name postgres \ -e POSTGRES_USER=sonar \ -e POSTGRES_PASSWORD=sonar_password \ -e POSTGRES_DB=sonarqube \ -v postgres_data:/var/lib/postgresql/data \ postgres:13
ขั้นตอนที่ 3: เข้าถึง SonarQube
หลังจากติดตั้งเสร็จ เข้าถึง SonarQube ด้วยการเปิด Browser และไปที่ http://your-vps-ip:9000 ค่า Username และ Password เริ่มต้นคือ admin และ admin (ต้องเปลี่ยนรหัสผ่านในการใช้งานครั้งแรก)
การตั้งค่า Quality Gate Rules
Quality Gates คือกฎที่กำหนดว่าโค้ดจะผ่านการตรวจสอบหรือไม่ ต้องกำหนดให้เหมาะสมกับโครงการของคุณ
ขั้นตอนการสร้าง Quality Gate:
- เข้าสู่ SonarQube Administration → Quality Gates
- คลิก “Create” เพื่อสร้าง Gate ใหม่
- ตั้งชื่อเช่น “Strict Quality Standards”
- กำหนดเงื่อนไข (Conditions) เช่น:
- Code Coverage: ≥ 80%
- Bugs: ≤ 0
- Code Smells: ≤ 10
- Security Hotspots: ≤ 5
- Duplicated Lines (%): < 5%
- Maintainability Rating: A (ดีที่สุด)
- คลิก “Save” เพื่อบันทึก
เคล็ดลับเมื่อตั้งค่า Quality Gates:
- เริ่มต้นด้วยเกณฑ์ที่ปานกลาง จากนั้นค่อยๆ เพิ่มความเข้มข้นเมื่อทีมเข้าใจการทำงาน
- กำหนด Quality Gate ให้แตกต่างกันไปตามสาขา (Branch) เช่น Main Branch มีเกณฑ์เข้มงวดกว่า Feature Branch
- เน้นให้ความสำคัญกับ Security เสมอ ตั้งค่า Security Hotspots ให้มีความเข้มข้น
การเชื่อมต่อ SonarQube กับ GitHub Actions
GitHub Actions เป็นบริการ CI/CD ที่บิวท์อิน (Built-in) ในแพลตฟอร์ม GitHub ติดตั้ง SonarQube Scanner ในนั้นเพื่อให้โค้ดถูกสแกนทุกครั้งที่มีการ Push
ขั้นตอนที่ 1: สร้าง Token ใน SonarQube
- เข้าสู่ SonarQube → Account (Profile Icon) → Security
- ในส่วน “Tokens” กดปุ่ม “Generate Token”
- ตั้งชื่อเช่น “GitHub Actions”
- คัดลอก Token ที่สร้าง (จำเป็นต้องเก็บไว้โดยปลอดภัย)
ขั้นตอนที่ 2: เพิ่ม Secrets ใน GitHub
- ไปที่ Repository → Settings → Secrets and variables → Actions
- คลิก “New repository secret”
- ตั้งชื่อ
SONAR_TOKENและวางค่า Token ที่คัดลอก - เพิ่ม Secret อีกอันชื่อ
SONAR_HOST_URLโดยค่าคือhttp://your-vps-ip:9000
ขั้นตอนที่ 3: สร้าง GitHub Actions Workflow
สร้างไฟล์ .github/workflows/sonarqube.yml ในโปรเจกต์ของคุณ:
name: SonarQube Quality Gate
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
sonarqube:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@master
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
with:
args: >
-Dsonar.projectKey=my-project
-Dsonar.sources=src/
-Dsonar.exclusions=**/*test*,**/node_modules/**
- name: SonarQube Quality Gate Check
id: sonarqube-quality-gate
uses: SonarSource/sonarqube-quality-gate-action@master
timeout-minutes: 5
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
หลังจากกำหนด Workflow นี้ ทุกครั้งที่มีการ Push หรือ Pull Request ระบบจะทำการสแกนโค้ดอัตโนมัติ
การเชื่อมต่อ SonarQube กับ GitLab CI
GitLab CI ก็มี Integration กับ SonarQube เหมือนกัน สามารถตั้งค่าได้ดังนี้
ขั้นตอนที่ 1: เพิ่ม CI/CD Variables ใน GitLab
- ไปที่ Project → Settings → CI/CD → Variables
- เพิ่ม Variable:
SONAR_TOKEN= Token จาก SonarQubeSONAR_HOST_URL=http://your-vps-ip:9000SONAR_PROJECT_KEY= ชื่อโปรเจกต์ใน SonarQube
ขั้นตอนที่ 2: สร้าง .gitlab-ci.yml
stages:
- scan
- quality-gate
sonarqube-scan:
stage: scan
image: sonarsource/sonar-scanner-cli:latest
script:
- sonar-scanner
-Dsonar.projectKey=${SONAR_PROJECT_KEY}
-Dsonar.sources=src/
-Dsonar.host.url=${SONAR_HOST_URL}
-Dsonar.login=${SONAR_TOKEN}
-Dsonar.gitlab.project_id=${CI_PROJECT_ID}
-Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA}
allow_failure: false
quality-gate:
stage: quality-gate
image: curlimages/curl:latest
script:
- |
TASK_ID=$(curl -s -u "${SONAR_TOKEN}:" \
"${SONAR_HOST_URL}/api/ce/activity?projectKey=${SONAR_PROJECT_KEY}" \
| grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4)
STATUS=$(curl -s -u "${SONAR_TOKEN}:" \
"${SONAR_HOST_URL}/api/ce/task?id=${TASK_ID}" \
| grep -o '"status":"[^"]*' | head -1 | cut -d'"' -f4)
if [ "${STATUS}" != "SUCCESS" ]; then
echo "SonarQube analysis failed"
exit 1
fi
allow_failure: false
การอ่านผลวิเคราะห์ Code Quality
หลังจากการสแกนเสร็จ SonarQube จะแสดงรายงานการวิเคราะห์โค้ด เรียนรู้วิธีการอ่านผลลัพธ์:
1. Quality Gate Status
- ผ่าน (Passed): โค้ดตรงตามเกณฑ์มาตรฐานที่กำหนด สามารถ Merge ได้
- ไม่ผ่าน (Failed): มีข้อบกพร่องที่ต้องแก้ไขก่อน Merge
2. Metrics ที่สำคัญ
- Lines of Code (LOC): จำนวนบรรทัดโค้ดทั้งหมด
- Bugs: จำนวนข้อบกพร่องที่พบ
- Code Smells: ส่วนของโค้ดที่สามารถปรับปรุง
- Coverage: เปอร์เซ็นต์ของโค้ดที่ถูกสอบด้วย Unit Test
- Duplications: เปอร์เซ็นต์โค้ดที่ซ้ำกัน
3. Issues Classification
- Blocker: ปัญหาที่ร้ายแรงมากที่สุด ต้องแก้ทันที
- Critical: ปัญหาที่มีผลกระทบต่อความปลอดภัยหรือการทำงาน
- Major: ปัญหาที่สำคัญแต่ไม่ถึงขั้น Critical
- Minor: ปัญหาเล็กน้อย
- Info: ข้อมูลหรือคำแนะนำ
Best Practices ในการใช้ SonarQube
1. เริ่มต้นด้วยเกณฑ์ที่ค่อนข้างหลวม
เมื่อเพิ่ม SonarQube ใหม่ในโครงการ ไม่ควรตั้งเกณฑ์ให้เข้มงวดเกินไป เพราะอาจทำให้ Pipeline ล้มเหลวทั้งหมด ค่อยๆ ปรับเกณฑ์ให้เข้มงวดขึ้นตามความก้าวหน้าของทีม
2. มุ่งเน้นที่ความปลอดภัยอย่างแรก
ในระดับความสำคัญของปัญหา ให้ความสำคัญกับปัญหา Blocker และ Critical ที่เกี่ยวกับความปลอดภัยก่อน
3. ทำให้ SonarQube Scan เป็นส่วนหนึ่งของ Definition of Done
ทีมต้องตกลงว่า Code ต้องผ่านการ Scan และ Quality Gate ก่อนจึงจะถือว่า Task หรือ PR นั้นเสร็จสิ้น
4. ตรวจสอบและลบ False Positives
บางครั้ง SonarQube อาจให้คำเตือนที่ไม่จำเป็น (False Positives) สามารถทำเครื่องหมายว่า “Won’t Fix” หรือปรับค่า Configuration ได้
5. ใช้ Profiles เพื่อปรับเกณฑ์ให้เหมาะกับแต่ละ Project
Project ต่างๆ อาจต้องการเกณฑ์ที่แตกต่างกัน SonarQube อนุญาตให้สร้าง Quality Profiles ที่แตกต่างกัน
6. ติดตามแนวโน้ม (Trend)
สังเกตการณ์เปลี่ยนแปลงของคุณภาพโค้ดเมื่อเวลาผ่านไป หากมีแนวโน้มเลวลง ต้องหาวิธีแก้ไขอย่างเร่งด่วน
- Flexibility: สามารถขยายหรือลดทรัพยากร (CPU, RAM, Storage) ตามความต้องการได้ทันที
- Docker Support: มี Docker Pre-installed พร้อมใช้งาน ติดตั้ง SonarQube ง่ายดาย
- Network Performance: การเชื่อมต่อ CI/CD Tools (GitHub Actions, GitLab CI) จะรวดเร็วและมั่นคง
- Scalability: สามารถติดตั้ง PostgreSQL Database ที่จำเป็นต่อ SonarQube ได้อย่างสะดวก
- Cost-Effective: เสียค่าใช้จ่ายเท่าที่ใช้จริงเท่านั้น
สรุป
Code Quality Gates และ SonarQube เป็นเครื่องมือที่สำคัญในการสร้าง CI/CD Pipeline ที่มีประสิทธิภาพ ด้วยการติดตั้งและตั้งค่าที่ถูกต้อง ทีมของคุณจะสามารถ:
- ตรวจจับข้อบกพร่องและช่องโหว่ความปลอดภัยเร็วขึ้น
- ลดต้นทุนการซ่อมแซมโค้ด
- เพิ่มความเชื่อมั่นในการ Deploy โค้ด
- สร้างวัฒนธรรมการเขียนโค้ดที่ดีในทีมพัฒนา
