Code Quality Gates: SonarQube ในระบบ CI/CD

ในยุคที่ 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

วิธีที่ง่ายและปลอดภัยที่สุดในการติดตั้ง SonarQube คือการใช้ Docker บน Cloud VPS หากคุณยังไม่มี Cloud VPS คุณสามารถเลือก Cloud VPS จาก Dot Enterprise ได้ เซิร์ฟเวอร์จะมี 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:

  1. เข้าสู่ SonarQube Administration → Quality Gates
  2. คลิก “Create” เพื่อสร้าง Gate ใหม่
  3. ตั้งชื่อเช่น “Strict Quality Standards”
  4. กำหนดเงื่อนไข (Conditions) เช่น:
    • Code Coverage: ≥ 80%
    • Bugs: ≤ 0
    • Code Smells: ≤ 10
    • Security Hotspots: ≤ 5
    • Duplicated Lines (%): < 5%
    • Maintainability Rating: A (ดีที่สุด)
  5. คลิก “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

  1. เข้าสู่ SonarQube → Account (Profile Icon) → Security
  2. ในส่วน “Tokens” กดปุ่ม “Generate Token”
  3. ตั้งชื่อเช่น “GitHub Actions”
  4. คัดลอก Token ที่สร้าง (จำเป็นต้องเก็บไว้โดยปลอดภัย)

ขั้นตอนที่ 2: เพิ่ม Secrets ใน GitHub

  1. ไปที่ Repository → Settings → Secrets and variables → Actions
  2. คลิก “New repository secret”
  3. ตั้งชื่อ SONAR_TOKEN และวางค่า Token ที่คัดลอก
  4. เพิ่ม 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

  1. ไปที่ Project → Settings → CI/CD → Variables
  2. เพิ่ม Variable:
    • SONAR_TOKEN = Token จาก SonarQube
    • SONAR_HOST_URL = http://your-vps-ip:9000
    • SONAR_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)

สังเกตุการณ์เปลี่ยนแปลงของคุณภาพโค้ดเมื่อเวลาผ่านไป หากมีแนวโน้มเลวลง ต้องหาวิธีแก้ไขอย่างเร่งด่วน

เชื่อมโยงกับบริการ Cloud VPS ของ Dot Enterprise

SonarQube ต้องการทรัพยากรของระบบจำนวนหนึ่ง โดยเฉพาะถ้าต้องการให้มีประสิทธิภาพในการวิเคราะห์โค้ดจำนวนมาก Dot Enterprise Cloud VPS เป็นตัวเลือกที่เหมาะสมเพราะ:

  • 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: เสียค่าใช้จ่ายเท่าที่ใช้จริงเท่านั้น

หากสนใจ ลองใช้ Cloud VPS จาก Dot Enterprise สามารถติดตั้ง SonarQube บน Server ได้ตั้งแต่วันแรก

สรุป

Code Quality Gates และ SonarQube เป็นเครื่องมือที่สำคัญในการสร้าง CI/CD Pipeline ที่มีประสิทธิภาพ ด้วยการติดตั้งและตั้งค่าที่ถูกต้อง ทีมของคุณจะสามารถ:

  • ตรวจจับข้อบกพร่องและช่องโหว่ความปลอดภัยเร็วขึ้น
  • ลดต้นทุนการซ่อมแซมโค้ด
  • เพิ่มความเชื่อมั่นในการ Deploy โค้ด
  • สร้างวัฒนธรรมการเขียนโค้ดที่ดีในทีมพัฒนา

ในการพัฒนาแอปพลิเคชันโมเดิร์น CI/CD ที่มีระบบ Code Quality Gate ไม่ใช่ของฟุ่มเฟือย แต่เป็นความจำเป็น ลองเริ่มติดตั้ง SonarQube บน Cloud VPS ของ Dot Enterprise วันนี้และเห็นความแตกต่างด้วยตัวเอง