ติดตั้ง SonarQube ด้วย Docker
การใช้ sonarqube ผ่านทาง container นั้นจะดีกว่าติดต้ังลงบน server โดยตรง ตรงที่เราสามารถนำไปใส่ไว้ใน CI/CD ได้ง่ายกว่า โดยเฉพาะการใช้งาน sonar-scanner-cli
ติดตั้ง SonarQube Server ด้วย Docker
เราจะแยกการติดตั้งออกเป็น 2 ส่วนคือการติดตั้ง sonarqube server และ sonar scanner เพราะจริงๆแล้วเราไม่จำเป็นต้องใช้ container ทั้งหมด เราสามารถเลือกติดตั้ง sonarqube server เป็น container แต่ใช้ sonar-scanner แบบติดตั้งลงในเครื่องตรงๆก็ได้ หรือในทางกลับกันเราสามารถ run sonar-scanner ผ่าน container แต่ส่งผลลัพธ์ขึ้นไปยัง sonarqube server ที่ติดตั้งแบบ bare-metal(ติดตั้งลงบนเครื่องตรงๆ) ก็ได้
สร้าง sonarqube server
เราจะใช้ image ชื่อว่า sonarqube โดย default sonarqube จะใช้ port 9000
-
สร้าง sonarqube server ขึ้นมาด้วยคำสั่ง
docker run -d --name sonarqube -p 9000:9000 sonarqube
-
เปิด browser ขึ้นมาแล้วเข้าไปที่ URL http://localhost:90000 เราจะเข้าสู่หน้า login ให้ login ด้วย user admin และ password เป็น admin
-
ระบบจะบังคับให้เราเปลี่ยน password ใหม่
-
หลังจาก update password เสร็จแล้วก็จะเข้าสู่หน้า dashbord ดังรูป
SonarQube ตอนนี้จะยังไม่มี database สำหรับเก็บข้อมูลถาวร ถ้า restart server ข้อมูลทุกอย่างก็จะหายหมด
ติดตั้ง SonarQube Server ด้วย Docker Compose
การใข้ sonarqube ผ่านทาง docker compose จะสะดวกกว่า dokcer ธรรมดาตรงที่เราสามารถสร้าง network ได้เลย เพราะเราจำเป็นต้องมีทั้ง sonarqube server และ sonarqube database โดยมีขั้นตอนต่างๆ ดังนี้
- สร้างไฟล์ docker-compose.yml ไว้ใน folder ที่เก็บ source code
|
|
จากไฟล์ dokcer-compose ด้านบนเราจะสร้าง service ขึ้นมา 2 ตัวคือ sonarqube และ sonarqube-db ซึ่ง database ในตัวอย่างนี้เราจะใช้ postgreSql นอกจาก postgreSql แล้ว sonarqube ยัง support ทั้ง MS SQL Server และ Oracle อีกด้วย
สิ่งที่ต้องกำหนดให้ตรงกันคือ SONAR_JDBC_USERNAME และ SONAR_JDBC_PASSWORD ในบรรทัดที่ 11-12 ต้องตรงกับ POSTGRES_USER และ POSTGRES_PASSWORD ในบรรทัดที่ 25-26 ไม่งั้น sonarqube server จะไม่สามารถ connect ไปที่ postgresql ได้
- เมื่อพร้อมแล้วให้ start sonarqube server ด้วยคำสั่ง
docker-compose up -d
- หลังจากนั้นก็เข้าสู่ sonarqube server ผ่านทาง http://localhost:9000 เหมือนในตัวอย่างแรก
SonarQube 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 cli ผ่านทาง docker คือ
-
คุณต้องนำ source code เข้าไปไว้ใน container โดยใช้ -v ทำการ bind mount folder ปัจจุบันนี้เข้าไปยัง /usr/src (sonar scanner จะทำการ scan folder /usr/src) ดังนั้นถ้าคุณ run command นี้จาก folder อื่นที่ไม่ใช่ source code ให้เปลี่ยน ${PWD} เป็น path เต็มที่ระบุไปยัง source code ที่เราต้องการ scan
1 2 3
docker run --rm -it -v ${PWD}:/usr/src \ ... sonarsource/sonar-scanner-cli
-
คุณต้องส่งผลลัพธ์ขึ้นไปที่ sonarqube server ดังนั้น sonar scanner ต้องอยู่ใน network เดียวกับ sonarqube server โดยเรามีทางเลือกหลายทาง ดังนี้
-
set network ให้เป็น network เดียวกับเครื่อง host เราจะสามารถอ้างถึง sonarqube server ผ่านทาง localhost ได้เลย
1 2 3 4 5
docker run --rm -it -v ${PWD}:/usr/src \ --network host \ -e SONAR_HOST_URL="http://localhost:9000" \ ... sonarsource/sonar-scanner-cli
-
link sonar scanner cli กับ container ของ sonarqube server คำว่า sonarqube ใน บรรทัดที่ 2 หมายถึงชื่อ container เราต้องตั้งชื่อตอนเรา run container ของ sonarqube server ขึ้นมา ด้วย - -name sonarqube ส่วนตอนอ้างถึง url ของ sonarqube server ให้ใช้ชืื่อ container แทน แบบในบรรทัดที่ 3
1 2 3 4 5
docker run --rm -it -v ${PWD}:/usr/src \ --link sonarqube \ -e SONAR_HOST_URL="http://sonarqube:9000" \ ... sonarsource/sonar-scanner-cli
-
set network เป็น network เดียวกับ docker compose ในกรณีนี้เราจะนำ sonar scanner cli ไปใส่ไว้ใน network ของ docker compose ถ้าเราไม่ได้ตั้งชื่อ network ใน docker-compose.yml ชื่อของ network จะเป็นชื่อ folder ที่เรา run docker-compose up ให้เราตรวจสอบรายชื่อ network ด้วยคำสั่ง
docker network ls
หลังจากนั้นก็ใส่ชื่อ network นี้เข้าไปในบรรทัดที่ 2
1 2 3 4 5
docker run --rm -it -v ${PWD}:/usr/src \ --network [ชื่อของ docker-compose network] \ -e SONAR_HOST_URL="http://sonarqube:9000" \ ... sonarsource/sonar-scanner-cli
ส่วน URL จะใช้ชื่อของ service ที่เราประกาศไว้ใน docker compose ซึ่งจากตัวอย่าง docker-compose.yml ด้านบน ชื่อของ service ที่ใช้เป็น URL จะอยู่ในบรรทัดที่ 3
-
ส่วนต่อไปก็คือ token ที่ใช้ในการ login ซึ่งเราได้มาตอน create project หรือถ้าเราต้องการไป generate token ใหม่ให้ทำตามนี้
- ให้เข้าไปที่ My Account > Security
- ให้ตั้งชื่อ token
- เลือก type เป็น Project analysis tokens
- กำหนด expire ตามต้องการ(ยิ่งกำหนดให้นานเท่าไหร่ยิ่งไม่ปลอดภัย)
- กดปุ่ม Generate แล้วก็ copy token ออกมาใช้งานต่อได้เลย
เมื่อได้ token ที่ต้องการแล้วให้นำ token มาใส่ไว้ในบรรทัดที่ 5 หลังจากนี้เราก็สามารถ run sonar-scanner-cli ผ่านทาง docker ได้แล้ว
1 2 3 4 5 6
docker run --rm -it -v ${PWD}:/usr/src \ --network host \ --name sonar-scanner \ -e SONAR_HOST_URL="http://localhost:9000" \ -e SONAR_LOGIN="d32ede54513ec7b92589139aaaa5781c121a9303" \ sonarsource/sonar-scanner-cli
-
ถ้าต้องการใส่ options อื่นๆเพิ่มเติมสามารถต่อท้ายแบบนี้ได้เลย
1 2 3 4 5 6
docker run --rm -it -v ${PWD}:/usr/src \ --network host \ --name sonar-scanner \ -e SONAR_HOST_URL="http://localhost:9000" \ -e SONAR_LOGIN="d32ede54513ec7b92589139aaaa5781c121a9303" \ sonarsource/sonar-scanner-cli -Dsonar.qualitygate.wait=true
-