在RedHat系统上离线部署SonarQube,并配置其支持Python和Bash代码分析。由于目标机器无法连接互联网,需要在另一台机器上准备所有安装材料后再迁移至目标机器。两种离线部署方案(传统安装和Docker部署)的详细步骤、脚本说明以及一些使用建议。
下面的表格汇总了两种部署方式的主要特点和考虑因素:
| 特性/方面 | 传统手动部署 (基于SonarQube 8.9.3) | Docker容器化部署 (基于SonarQube 9.9 LTS) |
|---|---|---|
| 技术栈 | JDK 11, PostgreSQL 12, SonarQube, Sonar Scanner | Docker, Docker Compose, PostgreSQL 15 |
| 离线准备复杂度 | 中高 (需手动下载多个组件包) | 低 (主要准备镜像文件) |
| 部署复杂度 | 较高 (需逐步安装配置多个组件) | 较低 (通过Docker Compose编排启动) |
| 维护性 | 相对复杂,需手动管理各服务 | 相对简单,容器隔离,升级和迁移方便 |
| 推荐系统 | RedHat 7 | RedHat 7 或更高版本 (需支持Docker) |
| 所需资源 | 需确保磁盘空间充足(存放安装包)、内存至少2G | 除磁盘空间和内存外,还需确保Docker环境可用 |
| Python支持 | 支持 | 更强(支持更新版本的Python,规则更丰富) |
无论选择哪种方式,离线部署的关键在于准备工作。需要在一台能联网的机器(以下称之为“准备机”)上完成所有所需文件的下载,然后将这些文件传输到无法联网的目标服务器上进行安装。
环境要求:确保目标RedHat服务器满足最低配置,例如内存建议至少2GB。
资源下载:在“准备机”上,根据选择的部署方式,下载所有必需的安装包、镜像文件等。
文件传输:使用U盘、内网SCP/SFTP或其他方式,将下载好的文件从“准备机”传输到“目标服务器”。
系统配置:在目标服务器上,可能需要进行一些系统参数调整,例如:
bash# 临时生效,重启后失效
sudo sysctl -w vm.max_map_count=262144 # 对于传统部署或Docker部署
sudo sysctl -w fs.file-max=65536 # 对于传统部署
sudo ulimit -n 65536 # 对于传统部署
# 如需永久生效,需修改 /etc/sysctl.conf 和 /etc/security/limits.conf 文件
这个方案主要参考了CentOS 7上离线安装SonarQube 8.9.3的流程,需要准备JDK 11、PostgreSQL 12、SonarQube和Sonar Scanner的安装包。
在能联网的准备机上,执行以下脚本下载所有必需的RPM包、SonarQube和Sonar Scanner压缩包:
bash#!/bin/bash
# download_resources.sh
# 此脚本在能联网的“准备机”上运行,用于下载所有必要的离线安装包
set -e # 遇到错误则退出
# 1. 下载PostgreSQL 12的RPM包
mkdir -p ./offline_packages/postgresql12
cd ./offline_packages/postgresql12
# 下载PostgreSQL 12的yum源RPM并安装以便后续下载
wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm --no-check-certificate
yum install --downloadonly --downloaddir=./ pgdg-redhat-repo-latest.noarch.rpm # 实际下载主包可能仍需直接wget,此命令主要用于下载依赖
# 使用yum的downloadonly插件下载PostgreSQL 12服务器及相关组件的RPM包
yum install --downloadonly --downloaddir=./ postgresql12-server postgresql12 postgresql12-contrib
# 2. 下载SonarQube和Sonar Scanner
cd ..
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.3.48735.zip
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip
# 3. 下载JDK 11 (需要从Oracle官网手动下载,此处假设已放置于当前目录)
# jdk-11.0.13_linux-x64_bin.tar.gz
echo "所有离线包已下载到 ./offline_packages 目录下。请将此目录完整拷贝到目标离线机器。"
脚本说明:
jdk-11.0.13_linux-x64_bin.tar.gz),并放置在与脚本相同的目录下,记得一并拷贝到目标服务器。将下载好的offline_packages目录和JDK 11压缩包传输到目标服务器后,在目标服务器上执行以下安装和配置脚本:
bash#!/bin/bash
# install_sonarqube_offline.sh
# 此脚本在离线的目标RedHat服务器上以root用户运行
set -e
OFFLINE_DIR="./offline_packages"
JDK_TAR_GZ="jdk-11.0.13_linux-x64_bin.tar.gz" # 请确保此文件也在OFFLINE_DIR目录或已知路径
# 0. 安装JDK 11
tar -xzf $OFFLINE_DIR/$JDK_TAR_GZ -C /opt/
mv /opt/jdk-11.0.13 /opt/jdk11
alternatives --install /usr/bin/java java /opt/jdk11/bin/java 1
alternatives --install /usr/bin/javac javac /opt/jdk11/bin/javac 1
echo 'export JAVA_HOME=/opt/jdk11' >> /etc/profile.d/java.sh
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/java.sh
source /etc/profile.d/java.sh
# 1. 安装PostgreSQL 12
cd $OFFLINE_DIR/postgresql12
rpm -ivh postgresql12-libs-12.9-1PGDG.rhel7.x86_64.rpm
rpm -ivh postgresql12-12.9-1PGDG.rhel7.x86_64.rpm
rpm -ivh postgresql12-server-12.9-1PGDG.rhel7.x86_64.rpm
rpm -ivh postgresql12-contrib-12.9-1PGDG.rhel7.x86_64.rpm
# 2. 初始化PostgreSQL数据库并启动
/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12
# 3. 修改PostgreSQL密码并创建SonarQube数据库和用户
sudo -u postgres psql <<EOF
ALTER USER postgres WITH PASSWORD 'bigdata123';
CREATE DATABASE sonar;
CREATE USER sonar WITH PASSWORD 'sonar';
ALTER ROLE sonar SUPERUSER;
ALTER DATABASE sonar OWNER TO sonar;
EOF
# 4. 修改Pg_hba.conf认证方式并将ident改为md5,然后重启PostgreSQL
sed -i 's/ident/md5/g' /var/lib/pgsql/12/data/pg_hba.conf
systemctl restart postgresql-12
# 5. 创建SonarQube运行用户
groupadd sonar
useradd sonar -g sonar
# 6. 解压并配置SonarQube
unzip $OFFLINE_DIR/sonarqube-8.9.3.48735.zip -d /opt/
mv /opt/sonarqube-8.9.3.48735 /opt/sonarqube
chown -R sonar:sonar /opt/sonarqube
# 7. 修改SonarQube配置文件
SONAR_PROPERTIES="/opt/sonarqube/conf/sonar.properties"
cat >> $SONAR_PROPERTIES <<EOF
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://127.0.0.1:5432/sonar
sonar.web.host=0.0.0.0
sonar.web.port=9000
EOF
# 8. 解压并配置Sonar Scanner
unzip $OFFLINE_DIR/sonar-scanner-cli-4.6.2.2472-linux.zip -d /opt/
mv /opt/sonar-scanner-4.6.2.2472-linux /opt/sonar-scanner
echo 'export SONAR_SCANNER_HOME=/opt/sonar-scanner' >> /etc/profile.d/sonar.sh
echo 'export PATH=$SONAR_SCANNER_HOME/bin:$PATH' >> /etc/profile.d/sonar.sh
source /etc/profile.d/sonar.sh
# 9. 以sonar用户启动SonarQube
sudo -u sonar /opt/sonarqube/bin/linux-x86-64/sonar.sh start
echo "SonarQube传统安装完成!请等待一段时间后访问 http://目标服务器IP:9000"
echo "初始账号: admin, 初始密码: admin"
脚本说明:
jdk-11.0.13_linux-x64_bin.tar.gz) 已在offline_packages目录下或你指定的路径中。bigdata123和sonar)和SonarQube的密码(admin初始密码)在生产环境中建议修改为强密码。Docker部署方式更为简便和隔离,主要需要准备Docker环境、SonarQube和PostgreSQL的Docker镜像。
在能联网的准备机上,执行以下脚本下载所需的Docker镜像并导出为tar包:
bash#!/bin/bash
# download_docker_images.sh
# 此脚本在能联网的“准备机”上运行,用于下载Docker镜像并导出
set -e
# 1. 下载SonarQube和PostgreSQL的Docker镜像
docker pull sonarqube:latest
docker pull postgres:latest
# 2. 将镜像保存为tar包,便于离线传输
docker save -o sonarqube-latest.tar sonarqube:latest
docker save -o postgres-latest.tar postgres:latest
# 3. 下载docker-compose.yml文件示例(可选,也可手动创建)
# 这里直接创建内容
cat > docker-compose-sonarqube.yml <<'EOF'
version: "3"
services:
sonarqube:
image: sonarqube:latest
restart: always
container_name: sonarqube
depends_on:
- postgresdb
environment:
TZ: Asia/Shanghai
SONAR_JDBC_URL: jdbc:postgresql://postgresdb:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
- /etc/localtime:/etc/localtime:ro
ports:
- 9000:9000
postgresdb:
image: postgres:latest
restart: always
container_name: postgresdb
environment:
TZ: Asia/Shanghai
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonar
volumes:
- postgresql_data:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql_data:
EOF
echo "Docker镜像已导出为 tar 包,并生成了 docker-compose-sonarqube.yml 文件。"
echo "请将 sonarqube-latest.tar, postgres-latest.tar 和 docker-compose-sonarqube.yml 文件拷贝到目标离线机器。"
脚本说明:
docker-compose.yml文件用于后续启动容器。docker-compose-sonarqube.yml文件是启动容器的关键配置文件,需要一并拷贝到目标服务器。将准备好的sonarqube-9.9-community.tar、postgres-15.tar和docker-compose-sonarqube.yml文件传输到目标服务器后,在目标服务器上执行以下脚本:
bash#!/bin/bash
# deploy_sonarqube_docker_offline.sh
# 此脚本在离线的目标RedHat服务器上以root用户运行,用于加载Docker镜像并启动SonarQube
set -e
# 0. 确保Docker已安装且启动
# 如果目标机器尚未安装Docker,需要先离线安装Docker,这部分需根据RedHat版本另行准备。
# 1. 加载Docker镜像
docker load -i sonarqube-latest.tar
docker load -i postgres-latest.tar
# 2. (可选) 创建目录用于持久化数据(如果docker-compose.yml中使用了卷,Docker会自动管理,但明确目录有时更便于管理)
mkdir -p /opt/sonarqube/data /opt/sonarqube/extensions /opt/sonarqube/logs
mkdir -p /opt/postgresql/data
# 3. 调整系统参数(如果尚未设置)
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
# 4. 使用docker-compose启动服务
# 确保docker-compose已安装。如果未安装,需要离线安装docker-compose。
docker-compose -f docker-compose-sonarqube.yml up -d
echo "Docker版SonarQube部署完成!请等待一段时间(初始化数据库较慢)后访问 http://目标服务器IP:9000"
echo "初始账号: admin, 初始密码: admin"
脚本说明:
docker-compose-sonarqube.yml文件配置了Docker卷(volumes)来持久化数据,即使容器删除数据也不会丢失。docker logs -f sonarqube 命令查看启动日志。部署完成后(无论哪种方式),通过浏览器访问 http://<目标服务器IP>:9000,使用初始账号admin/admin登录。
sonar-shellcheck插件),但需要找到适配你SonarQube版本的离线插件包(.jar文件),下载后放到SonarQube服务器的extensions/plugins目录下,然后重启SonarQube服务。在的开发机器上(或能在构建过程中访问到SonarQube服务器的机器上),需要配置Sonar Scanner来扫描项目。
在项目根目录创建配置文件 sonar-project.properties:
properties# 必须是唯一的项目键 sonar.projectKey=my:python:project # 项目显示名称 sonar.projectName=My Python Project sonar.projectVersion=1.0 # 源代码目录 sonar.sources=. # 源代码语言 sonar.language=py # 如果你使用的是Python虚拟环境,可以指定执行文件路径 # sonar.python.version=3 # SonarQube服务器地址 sonar.host.url=http://<目标服务器IP>:9000 # 从SonarQube界面生成的令牌(推荐使用令牌而非密码) sonar.login=<你的SonarQube用户令牌>
(对于Bash项目,将 sonar.language 改为 sh,但前提是已安装支持Shell的插件)。
执行扫描:
在包含sonar-project.properties文件的目录下运行:
bashsonar-scanner
扫描结果将会被上传到SonarQube服务器,你可以在Web界面查看分析报告。
.jar文件,将其放入SonarQube服务器的extensions/plugins目录(传统安装通常在/opt/sonarqube/extensions/plugins,Docker安装则对应你挂载的sonarqube_extensions卷或目录),然后重启SonarQube服务。本文作者:sea-whales
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!