2025-09-12
Linux
00
请注意,本文编写于 173 天前,最后修改于 173 天前,其中某些信息可能已经过时。

目录

🛠️ 部署前的通用准备
在准备机上下载所需文件
在目标服务器上安装和配置
🐳 方案二:Docker方式离线部署SonarQube
在准备机上下载Docker镜像
在目标服务器上加载镜像并启动容器
⚙️ 配置SonarQube:支持Python与Bash
🔍 使用SonarQube分析你的代码
💡 一些额外的提示

在RedHat系统上离线部署SonarQube,并配置其支持Python和Bash代码分析。由于目标机器无法连接互联网,需要在另一台机器上准备所有安装材料后再迁移至目标机器。两种离线部署方案(传统安装和Docker部署)的详细步骤、脚本说明以及一些使用建议。

下面的表格汇总了两种部署方式的主要特点和考虑因素:

特性/方面传统手动部署 (基于SonarQube 8.9.3)Docker容器化部署 (基于SonarQube 9.9 LTS)
技术栈JDK 11, PostgreSQL 12, SonarQube, Sonar ScannerDocker, Docker Compose, PostgreSQL 15
离线准备复杂度中高 (需手动下载多个组件包) (主要准备镜像文件)
部署复杂度较高 (需逐步安装配置多个组件)较低 (通过Docker Compose编排启动)
维护性相对复杂,需手动管理各服务相对简单,容器隔离,升级和迁移方便
推荐系统RedHat 7RedHat 7 或更高版本 (需支持Docker)
所需资源需确保磁盘空间充足(存放安装包)、内存至少2G除磁盘空间和内存外,还需确保Docker环境可用
Python支持支持更强(支持更新版本的Python,规则更丰富)

🛠️ 部署前的通用准备

无论选择哪种方式,离线部署的关键在于准备工作。需要在一台能联网的机器(以下称之为“准备机”)上完成所有所需文件的下载,然后将这些文件传输到无法联网的目标服务器上进行安装。

  1. 环境要求:确保目标RedHat服务器满足最低配置,例如内存建议至少2GB

  2. 资源下载:在“准备机”上,根据选择的部署方式,下载所有必需的安装包、镜像文件等。

  3. 文件传输:使用U盘、内网SCP/SFTP或其他方式,将下载好的文件从“准备机”传输到“目标服务器”。

  4. 系统配置:在目标服务器上,可能需要进行一些系统参数调整,例如:

    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 文件

📦 方案一:传统方式离线部署SonarQube

这个方案主要参考了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 目录下。请将此目录完整拷贝到目标离线机器。"

脚本说明

  • 功能:这个脚本主要在能联网的准备机上运行,用于下载PostgreSQL 12及其依赖的RPM安装包、SonarQube和Sonar Scanner的压缩包。
  • 使用注意:JDK 11需要手动从Oracle官网下载(例如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、PostgreSQL 12,初始化数据库,创建sonar用户,配置并启动SonarQube和Sonar Scanner。
  • 重要提示
    • 务必确保JDK 11的压缩包 (jdk-11.0.13_linux-x64_bin.tar.gz) 已在offline_packages目录下或你指定的路径中。
    • 脚本中的数据库密码(bigdata123sonar)和SonarQube的密码(admin初始密码)在生产环境中建议修改为强密码
    • SonarQube启动后需要一些时间初始化,请耐心等待后再访问Web界面。

🐳 方案二:Docker方式离线部署SonarQube

Docker部署方式更为简便和隔离,主要需要准备Docker环境、SonarQube和PostgreSQL的Docker镜像。

在准备机上下载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 文件拷贝到目标离线机器。"

脚本说明

  • 功能:这个脚本在准备机上运行,用于拉取SonarQube和PostgreSQL的Docker镜像,并将它们导出为tar压缩包,同时生成一个docker-compose.yml文件用于后续启动容器。
  • 使用注意:生成的docker-compose-sonarqube.yml文件是启动容器的关键配置文件,需要一并拷贝到目标服务器。

在目标服务器上加载镜像并启动容器

将准备好的sonarqube-9.9-community.tarpostgres-15.tardocker-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镜像,创建数据目录(可选),调整系统参数,并使用docker-compose启动SonarQube和PostgreSQL容器。
  • 重要前提目标服务器上必须已经安装了Docker Engine和Docker Compose。如果尚未安装,需要额外准备Docker的离线安装包并先行安装。
  • 数据持久化:脚本中的docker-compose-sonarqube.yml文件配置了Docker卷(volumes)来持久化数据,即使容器删除数据也不会丢失。
  • 启动检查:容器启动后,同样需要等待一段时间完成初始化。你可以使用 docker logs -f sonarqube 命令查看启动日志。

⚙️ 配置SonarQube:支持Python与Bash

部署完成后(无论哪种方式),通过浏览器访问 http://<目标服务器IP>:9000,使用初始账号admin/admin登录。

  1. 安装中文包(可选):在后台的"Marketplace"中搜索"Chinese Pack"进行安装。
  2. 创建质量配置(Quality Profile)
    • 进入 Quality Profiles 页面。
    • 对于 Python
      • 找到 "Python" 语言的质量配置列表。
      • 系统默认提供 "Sonar way" 配置。你可以直接使用它,它包含了许多通用的Python规则。
      • 你也可以点击 "Copy" 基于默认配置创建自定义配置,然后根据需要激活(Activate)禁用(Deactivate) 特定规则。
    • 对于 Bash (Shell脚本):
      • SonarQube社区版可能默认不完全支持Bash/Shell脚本的深度分析
      • 你可以在 Marketplace搜索是否有支持Shell脚本分析的社区插件(例如过去有sonar-shellcheck插件),但需要找到适配你SonarQube版本的离线插件包(.jar文件),下载后放到SonarQube服务器的extensions/plugins目录下,然后重启SonarQube服务。
      • 如果找到并安装了此类插件,同样在 Quality Profiles 中为该语言创建或配置规则集。

🔍 使用SonarQube分析你的代码

在的开发机器上(或能在构建过程中访问到SonarQube服务器的机器上),需要配置Sonar Scanner来扫描项目。

  1. 在项目根目录创建配置文件 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的插件)。

  2. 执行扫描: 在包含sonar-project.properties文件的目录下运行:

    bash
    sonar-scanner

    扫描结果将会被上传到SonarQube服务器,你可以在Web界面查看分析报告。

💡 一些额外的提示

  • 离线插件安装:如果需要为SonarQube安装其他插件(如针对Bash的),需要下载插件的.jar文件,将其放入SonarQube服务器的extensions/plugins目录(传统安装通常在/opt/sonarqube/extensions/plugins,Docker安装则对应你挂载的sonarqube_extensions卷或目录),然后重启SonarQube服务
  • 防火墙:确保目标服务器的9000端口(以及Docker部署时可能用到的5432端口)对需要访问SonarQube的机器开放。
  • 资源监控:SonarQube,尤其是Elasticsearch组件,可能会消耗较多内存。需要密切关注服务器资源使用情况。
  • 备份定期备份的SonarQube数据库(PostgreSQL)和配置文件。对于Docker部署,备份挂载的数据卷。

本文作者:sea-whales

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!