Coding Gun

การติดตั้ง Sonar Scanner และการ config

การติดตั้งและใช้งาน sonar scanner นั้นมีความสำคัญมากเนื่องจาก sonar scanner เป็นเครื่องมือที่ทำหน้าที่ scan source code แล้วส่งผลกลับไปยัง SonarQube server ในบทความนี้เราจะนำทุกท่านไปดูวิธีการติดตั้งและใช้งานในแต่ละ platform กันเลย

ก่อนเริ่มต้นติดตั้ง sonar-scanner นั้นต้องมีสิ่งนี้ก่อน

  1. Project Key unique key ที่จะใช้อ้างถึง project ที่เราสร้างไว้บน SonarQube Server
  2. Token Authentication token ที่ต้องมีสิทธิในการเข้าถึง project ที่เราอ้างถึงด้วย projectKey

Token ที่เรา Generate ขึ้นมาตอนสร้าง project จะเป็น Project analysis tokens คือใช้ได้แค่ใน project ที่เรากำลังสร้างขึ้นมาเท่านั้น

ดูขั้นตอน การสร้าง SonarQube project และการ Generate Token ได้ที่นี่

การติดตั้ง Sonar Scanner บน Windows

  1. ติดตั้ง sonar-scanner โดย download sonar-scanner-cli ได้ตาม link นี้

  2. เลือก windows-64 bits

    Download sonarqube scanner
    เลือก download sonar scanner ตาม platform ของเรา

  3. แตก Zip ไฟล์แล้ว Copy ไปยัง path ที่สามารถอ้างถึงได้ง่าย เช่น C:\sonar-scanner-4.8.0.2856-windows

  4. เปิดหน้า Edit Environment Variables เลือกตัวแปร PATH แล้วก็ Add บรรทัดนี้เข้าไป

    C:\sonar-scanner-4.8.0.2856-windows\bin
    

    ** ควรเก็บเลข version ไว้จะได้รู้ว่าตอนนี้ sonar-scanner ของเราเป็น version อะไร **

  5. สั่ง run command นี้ใน directory ที่มี source code ได้เลย

    sonar-scanner.bat -Dsonar.host.url=http://localhost:9000 \
        -Dsonar.login=[Token ที่ได้จาก Sonarqube Server]
        -Dsonar.projectKey=demo:project
        -Dsonar.projectName=GoTest # ถ้าไม่ได้กำหนดก็จะใช้ project Key แทน
        -Dsonar.sources=.
    
  6. กลับไปดูผลลัพธ์บน SonarQube Server จะได้ผลดังรูป

    SonarQube Analysis Result

การติดตั้ง sonar scanner บน MacOS

การติดตั้ง sonar scanner บน MacOS นั้นเราสามารถ install ผ่าน brew ได้เลย โดยเราแค่ run command

brew install sonar-scanner

ถ้าในกรณีที่เราเปิด terminal ขึ้นมาแล้วไม่สามารถ run sonar-scanner ได้ให้ทำการแก้ไขดังนี้

  1. ตรวจสอบว่า shell ที่เราใช้นั้นเป็น bash หรือ zsh ด้วยคำสั่ง

    echo $0
    

    หรือ

    echo $SHELL
    
  2. เปิดไฟล์ .zshrc หรือ .bashrc ขึ้นมา ซึ่งขึ้นอยู่กับ shell ที่คุณใช้ว่าเป็นตัวไหน ถ้าเครื่องคุณเป็น bash ให้เปิดไฟล์ .bashrc แต่ถ้าเป็น zsh ให้เปิดไฟล์ .zshrc ขึ้นมา แต่ถ้ายังไม่มีไฟล์นี้อยู่ในเครื่องก็สร้างขึ้นมาใหม่ได้เลย หลังจากนั้นให้ใส่คำสั่งนี้ลงไป

    export SONAR_HOME=/usr/local/Cellar/sonar-scanner/{version}/libexec
    export SONAR=$SONAR_HOME/bin 
    export PATH=$SONAR:$PATH
    

    แทนที่ {version} ด้วย version ของ sonar-scanner ที่ install

  3. หลังจากนั้นให้ run คำสั่งนี้ได้เลย

sonar-scanner -Dsonar.host.url=http://localhost:9000 \
        -Dsonar.login=[Token ที่ได้จาก Sonarqube Server]
        -Dsonar.projectKey=demo:project
        -Dsonar.projectName=GoTest # ถ้าไม่ได้กำหนดก็จะใช้ project Key แทน
        -Dsonar.sources=.

การใช้งาน sonar-scanner ผ่านทาง docker

ส่วนสุดท้ายจะเป็นการ run sonar scanner ด้วย docker ซึ่งตัว sonar scanner นั้นจะเป็นผู้ scan และส่งผลลัพธ์กลับขึ้นไปยัง sonarqube server ดังนั้นเราสามารถเลือกได้ว่าจะติดตั้งผ่านทาง command line หรือจะ run ผ่าน docker ซึ่งการ run ผ่าน docker จะใช้คำสั่งนี้

docker run --rm -it -v ${PWD}:/usr/src \
        --network host \
        --name sonar-scanner \
        -e SONAR_HOST_URL="http://localhost:9000" \
        -e SONAR_LOGIN="TOKEN" \
        sonarsource/sonar-scanner-cli

สิ่งที่ต้องเข้าใจในการใช้งาน sonar-scanner ผ่านทาง docker คือ

Sonar-project.properties มีไว้ทำไม?

การกำหนดค่าให้กับ sonar-scanner ในตัวอย่างก่อนหน้านั้นใช้วิธีการส่งเข้าไปใน parameters ของ sonar-scanner โดยตรงซึ่งถ้าจำนวนของ parameters นั้นมีเยอะมากๆ เช่น

sonar-scanner.bat -Dsonar.host.url=http://localhost:9000 \
    -Dsonar.login=[Token ที่ได้จาก Sonarqube Server]
    -Dsonar.projectKey=demo:project
    -Dsonar.projectName=InsecureApp
    -Dsonar.projectVersion=1.2
    -Dsonar.sources=./src/main/java
    -Dsonar.tests=./src/test/java
    -Dsonar.exclusions=./src/foo
    -Dsonar.dependencies=./mvn
    -Dsonar.qualitygate.wait=true

ซึ่งในบางกรณีเราอาจต้องการกำหนดค่าของ configuration มากกว่านี้อีกหลายตัว SonarQube เลยมีทางเลือกมาให้เราจัดการกับ configuration ได้ง่ายขึ้น โดยที่เราสามารถสร้าง file ที่ชื่อว่า sonar-project.properties แล้ววางไว้ใน directory ที่เราต้องการ run sonar-scanner ซึ่งใน file นี้จะระบุ configuration ทุกอย่างที่เราต้องการลงไปได้เลย และเมื่อ configuration ในการ scan อยู่ที่เดียวกับ source code(อาจวางไว้คนละที่ได้ถ้าต้องการ) เวลาส่งให้คนอื่น scan เราก็ไม่ต้องระบุ parameter อะไรเลย เราแค่สั่ง sonar-scanner แค่อย่างเดียว

เราจะใช้งาน sonar-project.properties ได้ด้วยขั้นตอนต่างๆ ดังนี้

  1. สร้างไฟล์ sonar-project.properties ใน root directory ของ repository

    # ห้ามซ้ำกันในแต่ละ server
    sonar.projectKey=demo:insecureapp
    # project metadata (ถ้าไม่ใส่จะใช้ project key แทน)
    sonar.projectName=Insecure Application Demo
    # ระบุ project Version
    sonar.projectVersion=1.2
    # path ที่มี source code
    sonar.sources=./src/main/java
    # บอก sonar-scanner ว่า path ไหนเป็น test
    # เราจะไม่ scan source code ที่ใช้เขียน test case
    sonar.tests=./src/test/java
    # path ที่ไม่ต้องการให้ scan เช่น html
    sonar.exclusions=./src/view
    # ที่อยู่ของ SonarQube Server
    sonar.host.url=http://localhost:9000
    # ถ้าเป็น Java ต้องระบุ path ของ Java ที่ติดตั้งไว้ในเครื่อง
    sonar.java.binaries=/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home
    # รอจนกว่า server จะตอบกลับมาว่า ผ่าน quality gate หรือไม่
    sonar.qualitygate.wait=true
    
  2. หลังจากนั้นให้ cd เข้าไปใน folder ที่มีไฟล์ sonar-project.properties แล้ว run คำสั่งนี้

    sonar-scanner -Dsonar.token=[Token ที่ได้จาก Sonarqube Server]
    

    ไม่ควรจะนำ Token ไปใส่ใน sonar-project.properties เพราะ token ถือว่าเป็นความลับที่ต้องจัดเก็บไว้อย่างนี้ ควรจะเก็บแยกไว้ต่างหาก

เพียงแค่นี้เราก็ไม่ต้องปวดหัวกับการส่ง parameters ยาวๆใน sonar-scanner อีกต่อไป แต่ถ้าคุณต้องการ override ค่าต่างๆเราจะสามารถเปลี่ยนแปลงค่าต่างๆ ผ่านทาง parameters ตอน run ได้เลยเช่น

   sonar-scanner -Dsonar.token=[Token ที่ได้จาก Sonarqube Server] -Dsonar.host.url=https://sonarqube-other-server

sonar-scanner จะนำ https://sonarqube-other-server ไปแทนที่ http://localhost:9000 ที่กำหนดไว้ใน sonar-project.properties ทันที ดังนั้นสิ่งที่คุณต้องเข้าใจคือ ลำดับในการอ่านค่า configuration ของ sonar-scanner จะเรียงตามนี้

Sonar Scanner Settings Hierachy
ที่มา: https://docs.sonarqube.org/latest/analyzing-source-code/analysis-parameters

ดังนั้นเวลากำหนดให้ Analyzer ทำงานนั้นเราจะเริ่มจาก

  1. กำหนดค่าใน Global Properties (ผ่านหน้า GUI ใน sonarqube server) โดยเข้าไปที่ี Administration > Configuration > General Settings
  2. กำหนดค่าใน Project Properties (ผ่านหน้า GUI ใน sonarqube server) โดยเข้าไปที่ Project Settings > General Settings
  3. กำหนดค่าใน sonar-project.properties
  4. กำหนดค่าโดยส่งผ่าน paramerters -D ใน command line

อ่านต่อเพิ่มเติม

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security