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.
- Cài đặt Vagrant: vagrantup.com/downloads
- Cài đặt VirtualBox: virtualbox.org/wiki/Downloads
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
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
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
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
#!/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
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
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
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
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.
Vagrantfile
vàprovision.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ụngvagrant 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.