0
0
Lập trình
Admin Team
Admin Teamtechmely

Xây Dựng Phòng Thí Nghiệm SonarQube với Vagrant

Đăng vào 2 tuần trước

• 6 phút đọc

Giới Thiệu

Bạn đã bao giờ cần thử nghiệm SonarQube nhưng ngại cài đặt một môi trường Java đầy đủ? Bạn có muốn học về DevOps và tìm kiếm một cách an toàn để thực hành? Bài viết này sẽ hướng dẫn bạn cách tạo ra một phòng thí nghiệm hoàn toàn tự động bằng Vagrant và VirtualBox. Mục tiêu là xây dựng một môi trường sạch sẽ và tách biệt để nâng cao kỹ năng của bạn trong hạ tầng như mã (IaC), tự động hóa với Bash Script và quản lý dịch vụ với SystemD. Cuối cùng, bạn sẽ có một phiên bản SonarQube sẵn sàng sử dụng, giống như đang quản lý một VPS thực.

Công Cụ Cần Thiết

SonarQube

SonarQube là công cụ hàng đầu cho phân tích mã tĩnh. Nó giúp phát hiện lỗi, lỗ hổng bảo mật và "code smells", đảm bảo chất lượng và độ an toàn của phần mềm luôn ở mức cao. Một môi trường thử nghiệm là rất quan trọng để khám phá các tích hợp với các pipeline CI/CD.

Vagrant

Vagrant cho phép bạn tạo và quản lý các máy ảo (VM) một cách đơn giản và rõ ràng. Chỉ với một lệnh, vagrant up, toàn bộ môi trường sẽ được cung cấp. Điều này đảm bảo khả năng tái tạo, dễ dàng chia sẻ với các lập trình viên khác và cho phép bạn xóa và tạo lại phòng thí nghiệm bất kỳ lúc nào.

Cấu Trúc Dự Án

Dự án của chúng ta sẽ có ba tệp chính:

  • Vagrantfile: Tệp này định nghĩa cấu hình cho VM, như hệ điều hành, mạng, bộ nhớ và các script cung cấp sẽ được thực thi.
  • provision.sh: Tệp script shell này cài đặt tất cả các phụ thuộc (như Java), tải SonarQube và cấu hình nó như một dịch vụ của hệ thống.
  • .env: Tệp cấu hình để lưu trữ các biến, như phiên bản và URL. Điều này giúp tách biệt cấu hình khỏi logic, dễ dàng cập nhật sau này.

Bắt Đầu Xây Dựng Phòng Thí Nghiệm

Yêu Cầu Trước Khi Bắt Đầu

Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt Vagrant và VirtualBox trên máy tính của mình.

Khởi Tạo Dự Án

Tạo một thư mục cho dự án và trong thư mục đó, chạy lệnh để tạo một Vagrantfile ban đầu:

bash Copy
mkdir lab-sonarqube && cd lab-sonarqube
vagrant init

Cấu Hình Vagrantfile

Thay thế nội dung của Vagrantfile được tạo tự động bởi lệnh init bằng mã dưới đây:

ruby Copy
Vagrant.configure("2") do |config|
  config.vm.hostname = "sonarqube-server"
  config.vm.box = "bento/ubuntu-22.04"
  config.vm.network "forwarded_port", guest: 9000, host: 9000
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = 2
  end
  config.vm.provision "file", source: ".env", destination: "/home/vagrant/.env"
  config.vm.provision "shell", path: "provision.sh"
end

Tạo Tệp .env

Tạo tệp .env trong cùng thư mục. Việc sử dụng biến giúp dễ dàng bảo trì hơn. Nếu SonarQube phát hành một phiên bản mới, chỉ cần cập nhật tệp này.

env Copy
SONAR_USER=sonarqube
SONAR_GROUP=sonarqube
SONAR_VERSION=9.9.0.65466
SONAR_URL=https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.0.65466.zip
SONAR_ZIP=sonarqube-9.9.0.65466.zip
SONAR_HOME=/opt/sonarqube
JAVA_BIN=/usr/bin/java
SERVICE_FILE=/etc/systemd/system/sonarqube.service

Lưu ý: SonarQube 9.9 LTS yêu cầu Java 17. Hình ảnh bento/ubuntu-22.04 đã có sẵn phiên bản tương thích.

Tạo Script provision.sh

Tạo tệp provision.sh:

bash Copy
#!/bin/bash
set -euo pipefail

set -a
source .env
set +a

main() {
    if [[ $EUID -ne 0 ]]; then
        echo "Chạy với quyền root."
        exit 1
    fi

    if ! getent group "$SONAR_GROUP" &>/dev/null; then
        sudo groupadd "$SONAR_GROUP"
    fi

    if ! id -u "$SONAR_USER" &>/dev/null; then
        sudo useradd --system --no-create-home -g "$SONAR_GROUP" "$SONAR_USER"
    fi

    sudo apt update
    sudo apt install -y make wget unzip openjdk-17-jdk

    wget -O "$SONAR_ZIP" "$SONAR_URL"
    unzip -q "$SONAR_ZIP" -d /opt/
    mv "/opt/sonarqube-${SONAR_VERSION}" "$SONAR_HOME"
    rm "$SONAR_ZIP"
    chown -R "$SONAR_USER:$SONAR_GROUP" "$SONAR_HOME"
    touch "$SERVICE_FILE"
    echo > "$SERVICE_FILE"

    cat > "$SERVICE_FILE" <<EOT
[Unit]
Description=Dịch vụ SonarQube
After=syslog.target network.target

[Service]
Type=simple
User=$SONAR_USER
Group=$SONAR_GROUP
PermissionsStartOnly=true
ExecStart=$JAVA_BIN -Xms512m -Xmx512m -Djava.net.preferIPv4Stack=true -jar $SONAR_HOME/lib/sonar-application-25.8.0.112029.jar
StandardOutput=journal
LimitNOFILE=131072
LimitNPROC=8192
TimeoutStartSec=5
Restart=always
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
EOT

    systemctl daemon-reload
    systemctl enable sonarqube
    systemctl start sonarqube
    sleep 10
    systemctl status sonarqube --no-pager
    if systemctl is-active --quiet sonarqube; then
        echo "SonarQube đã khởi động thành công!"
        exit 0
    else
        echo "Khởi động SonarQube thất bại. Kiểm tra trạng thái trên để biết thêm chi tiết."
        exit 1
    fi
}

main "$@"

Khởi Động Phòng Thí Nghiệm

Với tất cả các tệp đã được tạo, chạy lệnh:

bash Copy
vagrant up

Vagrant sẽ tải hình ảnh Ubuntu, tạo VM, thực thi script provision.sh và cấu hình mọi thứ. Quá trình này có thể mất vài phút lần đầu tiên.

Truy Cập SonarQube

Sau khi hoàn tất cung cấp, mở trình duyệt và truy cập http://localhost:9000. SonarQube có thể mất một hoặc hai phút để khởi động hoàn toàn.

Đăng nhập với thông tin mặc định:

  • Tên người dùng: admin
  • Mật khẩu: admin

Sử Dụng SonarQube: Phân Tích Dự Án Đầu Tiên

Khi phòng thí nghiệm đã hoạt động, hãy thực hiện một phân tích mã đơn giản. Chúng ta sẽ sử dụng sonar-scanner, một công cụ dòng lệnh để gửi mã đến máy chủ SonarQube.

Tạo Dự Án Mẫu (trên máy của bạn):

Tạo một tệp Python với một "code smell" rõ ràng (một biến không được sử dụng).

bash Copy
mkdir projeto-exemplo && cd projeto-exemplo
cat > app.py <<EOF
import sys

def main():
    message = "Xin chào, Thế giới!" # Biến không sử dụng (code smell)
    print("Thực hiện script...")
    unused_variable = 123
    return 0

if __name__ == "__main__":
    sys.exit(main())
EOF

Tạo Token Xác Thực trên SonarQube:

Truy cập http://localhost:9000.
Vào My Account > Security.
Tạo một token mới (ví dụ: scanner-token) và sao chép giá trị được tạo.

Tạo Tệp Cấu Hình của Scanner:

Trong thư mục projeto-exemplo, tạo tệp sonar-project.properties:

properties Copy
sonar.projectKey=meu-primeiro-projeto
sonar.projectName=Dự án Python Đầu Tiên
sonar.projectVersion=1.0
sonar.sources=.
sonar.host.url=http://localhost:9000
sonar.login=SEU_TOKEN_AQUI

Thay thế SEU_TOKEN_AQUI bằng token mà bạn đã sao chép.

Thực Hiện Phân Tích:

Bạn cần có sonar-scanner cài đặt trên máy tính hoặc có thể chạy nó qua Docker. Sử dụng Docker là đơn giản hơn:

bash Copy
docker run \
    --rm \
    -e SONAR_HOST_URL="http://localhost:9000" \
    -e SONAR_LOGIN="SEU_TOKEN_AQUI" \
    -v "$(pwd):/usr/src" \
    sonarsource/sonar-scanner-cli

Sau khi thực hiện, quay lại bảng điều khiển của SonarQube. Bạn sẽ thấy "Dự án Python Đầu Tiên" được liệt kê, với một "code smell" đã được phát hiện!

Những Điều Rút Ra và Mẹo

  • IaC trong Thực Tế: Phòng thí nghiệm này là một ví dụ hoàn hảo về IaC. Vagrantfileprovision.sh định nghĩa và tự động hóa toàn bộ hạ tầng, đảm bảo tính nhất quán.
  • Gỡ Rối Cung Cấp: Nếu có vấn đề xảy ra trong quá trình vagrant up, sử dụng vagrant ssh để vào VM và kiểm tra nhật ký (journalctl -u sonarqube.service) hoặc trạng thái dịch vụ (systemctl status sonarqube.service).
  • Tiêu Thụ Tài Nguyên: SonarQube tiêu tốn khá nhiều bộ nhớ RAM. Hai GB được định nghĩa trong Vagrantfile là tối thiểu. Nếu giao diện chậm, hãy xem xét tăng bộ nhớ lên 4096.

Kết Luận

Việc tạo ra môi trường thử nghiệm tự động là một kỹ năng thiết yếu cho bất kỳ ai làm việc với phát triển, DevOps hoặc hạ tầng. Với Vagrant, bạn có một sân chơi an toàn để thử nghiệm, học hỏi, mắc sai lầm và bắt đầu lại mà không ảnh hưởng đến hệ thống chính của mình. Giờ đây, bạn đã có một môi trường SonarQube hoạt động để khám phá phân tích chất lượng mã và tích hợp nó vào các dự án của bạn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào