Sonar-Scanner: 静态代码分析的利器
懂得享受生活的过程,人生才会更有乐趣。每个人都会遇到一些陷阱,每个人都有过去,有的甚至是失败的往事。过去的错误和耻辱只能说明过去,真正能代表人一生的,是他现在和将来的作为。
1.介绍
在软件开发中,代码质量和安全性是两个至关重要的方面。为了确保代码的高质量和低风险,我们需要借助一些工具来自动化代码检查。SonarQube 是一款流行的开源平台,它提供了强大的代码分析能力。而 Sonar-Scanner 则是 SonarQube 的客户端,用于在本地或 CI/CD 流水线中分析项目代码并将结果发送到 SonarQube 服务器。
2.什么是 Sonar-Scanner?
Sonar-Scanner 是一个命令行工具,它负责将项目代码扫描并提交到 SonarQube 服务器。它支持多种编程语言,包括 Java、JavaScript、Python、C++ 等等。Sonar-Scanner 可以识别代码中的潜在问题,如代码异味(code smells)、漏洞、复杂度和测试覆盖率等。
在 Linux 环境下安装和配置 Sonar-Scanner
在 Linux 环境中,Sonar-Scanner 的安装和配置可以通过以下几个步骤完成。
1. 安装 Java
Sonar-Scanner 依赖于 Java 运行环境 (JRE),因此首先需要确保系统上已安装 Java。你可以使用以下命令来安装 OpenJDK:
sudo apt update
sudo apt install openjdk-11-jre
安装完成后,可以使用以下命令检查 Java 是否正确安装:
java -version
你应该看到类似于以下的输出:
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)
2. 下载 Sonar-Scanner
从 SonarSource 的官方站点下载 Sonar-Scanner 二进制文件。你可以使用 wget
命令:
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.0.2856-linux.zip
请根据最新的版本号替换上面的 URL 中的版本号。
3. 解压缩 Sonar-Scanner
下载完成后,解压缩文件:
unzip sonar-scanner-cli-4.8.0.2856-linux.zip
解压后的目录通常为 sonar-scanner-4.8.0.2856-linux
。
4. 配置环境变量
为了方便地在命令行中使用 sonar-scanner
命令,需要将其添加到系统的 PATH 环境变量中。
编辑你的 shell 配置文件(例如 ~/.bashrc
或 ~/.zshrc
)并添加以下行:
export SONAR_SCANNER_HOME=/path/to/sonar-scanner-4.8.0.2856-linux
export PATH=$SONAR_SCANNER_HOME/bin:$PATH
请将 /path/to/sonar-scanner-4.8.0.2856-linux
替换为你实际的 Sonar-Scanner 解压目录的路径。
保存并关闭文件后,执行以下命令以使更改生效:
source ~/.bashrc # 或 source ~/.zshrc
5. 配置 Sonar-Scanner
在项目的根目录下创建一个 sonar-project.properties
文件,这是 Sonar-Scanner 的主要配置文件。以下是一个示例配置文件的内容:
# 必须的属性
sonar.projectKey=my-project-key
sonar.sources=src
# 可选的属性
sonar.projectName=My Project
sonar.projectVersion=1.0
sonar.language=java
# 指定 SonarQube 服务器地址
sonar.host.url=http://localhost:9000
# 认证令牌
sonar.login=my-sonarqube-token
sonar.projectKey
: 项目的唯一标识符。sonar.sources
: 项目源代码的相对路径。sonar.host.url
: SonarQube 服务器的 URL。sonar.login
: 用于认证的 SonarQube 令牌,可以从 SonarQube 的用户配置文件中生成。
6.运行 Sonar-Scanner
配置完成后,可以在项目的根目录下运行 Sonar-Scanner:
sonar-scanner
Sonar-Scanner 将读取 sonar-project.properties
文件中的配置,分析代码并将结果上传到指定的 SonarQube 服务器。
7.配置全局属性
如果有些属性在多个项目中通用,可以配置全局属性。编辑 sonar-scanner.properties
文件,该文件位于 Sonar-Scanner 安装目录下的 conf
目录中。例如:
# 默认的 SonarQube 服务器地址
sonar.host.url=http://localhost:9000
# 默认的认证令牌
sonar.login=my-default-token
这些全局配置将作为默认值,除非在项目的 sonar-project.properties
文件中被覆盖。
8.验证安装
执行 sonar-scanner -v
命令来验证 Sonar-Scanner 是否安装成功以及查看其版本:
sonar-scanner -v
你应该看到类似以下的输出:
INFO: Scanner configuration file: /path/to/sonar-scanner-4.8.0.2856-linux/conf/sonar-scanner.properties
INFO: Project root configuration file: /path/to/project/sonar-project.properties
INFO: SonarScanner 4.8.0.2856
INFO: Java 11.0.11 AdoptOpenJDK (64-bit)
INFO: Linux 5.4.0-74-generic amd64
在 GitLab CI/CD 中配置 Sonar-Scanner
将 Sonar-Scanner 集成到 GitLab CI/CD 中可以帮助自动化代码质量检查。在 GitLab 项目中,通过 .gitlab-ci.yml
文件定义 CI/CD 管道。以下是将 Sonar-Scanner 集成到 GitLab 的详细步骤:
1.先决条件
- SonarQube 服务器:需要一个运行的 SonarQube 实例,可以是自托管的,也可以是使用 SonarQube Cloud。
- SonarQube 项目:在 SonarQube 上为你的项目创建一个新项目,并获取项目的密钥(Project Key)。
- SonarQube 认证令牌:从 SonarQube 用户设置中生成一个用户令牌(User Token)。
2. 创建 GitLab CI 配置文件
在项目的根目录下创建或编辑 .gitlab-ci.yml
文件。添加以下配置:
stages:
- build
- test
- sonar_scan
variables:
SONAR_SCANNER_CLI_VERSION: "4.8.0.2856"
SONAR_SCANNER_HOME: "/opt/sonar-scanner"
SONAR_TOKEN: "$SONARQUBE_TOKEN"
SONAR_HOST_URL: "http://your-sonarqube-server-url" # SonarQube服务器的URL
before_script:
- apt-get update -y
- apt-get install -y openjdk-11-jre
- wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_CLI_VERSION-linux.zip
- unzip sonar-scanner-cli-$SONAR_SCANNER_CLI_VERSION-linux.zip
- mv sonar-scanner-$SONAR_SCANNER_CLI_VERSION-linux $SONAR_SCANNER_HOME
sonar_scan:
stage: sonar_scan
script:
- $SONAR_SCANNER_HOME/bin/sonar-scanner -Dsonar.projectKey=my-project-key
-Dsonar.sources=src
-Dsonar.host.url=$SONAR_HOST_URL
-Dsonar.login=$SONAR_TOKEN
3. 解释配置文件
-
stages: 定义 CI/CD 流水线的阶段。此示例包括
build
、test
和sonar_scan
三个阶段。 -
variables: 定义环境变量。
SONAR_SCANNER_CLI_VERSION
: Sonar-Scanner 的版本号。SONAR_SCANNER_HOME
: Sonar-Scanner 安装目录。SONAR_TOKEN
: SonarQube 认证令牌,使用 GitLab 的 CI/CD 秘钥管理系统进行设置。SONAR_HOST_URL
: SonarQube 服务器的 URL。
-
before_script: 在所有任务之前执行的命令。此处用于安装必要的依赖和 Sonar-Scanner。
- 安装 OpenJDK 11,这是 Sonar-Scanner 运行所需的。
- 下载并解压 Sonar-Scanner。
-
sonar_scan: 定义 SonarQube 分析阶段的任务。
sonar.projectKey
: SonarQube 项目的唯一标识符。sonar.sources
: 源代码目录。sonar.host.url
: SonarQube 服务器 URL。sonar.login
: SonarQube 的认证令牌。
4. 设置 GitLab CI/CD 秘钥
为了安全地存储 SonarQube 认证令牌,可以在 GitLab 中设置 CI/CD 秘钥:
- 进入 GitLab 项目的 “Settings”(设置)。
- 选择 “CI / CD” 选项。
- 在 “Variables”(变量)部分,点击 “Expand”(展开)。
- 点击 “Add variable”(添加变量)。
- 添加以下变量:
- Key:
SONARQUBE_TOKEN
- Value: 你的 SonarQube 认证令牌
- Type: Masked(遮蔽)
- Key:
5. 触发管道
每次代码提交或合并请求时,GitLab CI/CD 会自动运行管道,执行定义的各个阶段。在 sonar_scan
阶段,Sonar-Scanner 将分析代码并将结果上传到 SonarQube 服务器。
6.示例项目结构
假设你的项目结构如下:
my-project/
├── src/
│ └── main/
│ └── java/
│ └── com/
│ └── example/
│ └── MyClass.java
└── .gitlab-ci.yml
在 src
目录下是源代码,而 .gitlab-ci.yml
文件位于项目根目录。
Sonar-Scanner 集成到 Jenkins 中
将 Sonar-Scanner 集成到 Jenkins 中,可以在构建过程中自动进行代码质量检查。以下是如何在 Jenkins 中配置 Sonar-Scanner 进行代码分析的详细步骤。
1.先决条件
- Jenkins 服务器:确保 Jenkins 已安装并运行。
- SonarQube 服务器:需要一个运行的 SonarQube 实例。
- SonarQube 项目:在 SonarQube 上为你的项目创建一个新项目,并获取项目的密钥(Project Key)。
- SonarQube 认证令牌:从 SonarQube 用户设置中生成一个用户令牌(User Token)。
2. 安装 SonarQube Scanner 插件
首先,需要在 Jenkins 中安装 SonarQube Scanner 插件:
- 打开 Jenkins 控制面板。
- 进入 “Manage Jenkins”(管理 Jenkins)。
- 选择 “Manage Plugins”(管理插件)。
- 切换到 “Available”(可用插件)选项卡。
- 搜索 “SonarQube Scanner” 插件并安装。
安装完成后,重启 Jenkins 以应用插件。
3. 配置 SonarQube 服务器
安装插件后,需要在 Jenkins 中配置 SonarQube 服务器:
-
进入 “Manage Jenkins”(管理 Jenkins)。
-
选择 “Configure System”(配置系统)。
-
向下滚动到 “SonarQube servers”(SonarQube 服务器)部分。
-
点击 “Add SonarQube”(添加 SonarQube)。
-
配置以下信息:
- Name(名称):给你的 SonarQube 实例一个标识名称。
- Server URL(服务器 URL):SonarQube 服务器的 URL。
- Server authentication token(服务器认证令牌):使用上面生成的 SonarQube 用户令牌。
-
保存配置。
4. 安装和配置 SonarQube Scanner
- 进入 “Manage Jenkins”(管理 Jenkins)。
- 选择 “Global Tool Configuration”(全局工具配置)。
- 向下滚动到 “SonarQube Scanner” 部分。
- 点击 “Add SonarQube Scanner”(添加 SonarQube Scanner)。
- 给它一个名称(例如 “SonarQube Scanner”),然后选择 “Install automatically”(自动安装)选项。
5. 创建 Jenkins 任务
- 在 Jenkins 主界面,点击 “New Item”(新建任务)。
- 输入任务名称,选择 “Freestyle project”(自由风格项目),然后点击 “OK”。
- 配置任务的常规信息,如源码管理(使用 Git 等)和构建触发器。
6. 配置 SonarQube 分析步骤
在任务配置页面中,添加一个构建步骤:
- 在 “Build”(构建)部分,点击 “Add build step”(添加构建步骤)。
- 选择 “Execute SonarQube Scanner”(执行 SonarQube Scanner)。
配置 SonarQube Scanner 构建步骤:
- Analysis properties(分析属性):添加 SonarQube 扫描所需的属性。你可以使用键值对的格式配置这些属性,如下所示:
sonar.projectKey=my-project-key
sonar.sources=src
sonar.host.url=http://your-sonarqube-server-url
sonar.login=my-sonarqube-token
这些属性包括:
sonar.projectKey
: SonarQube 项目的唯一标识符。sonar.sources
: 源代码目录。sonar.host.url
: SonarQube 服务器的 URL。sonar.login
: SonarQube 的认证令牌。
7. 保存并运行任务
配置完成后,点击 “Save”(保存)。然后可以手动运行该任务或等待构建触发器(如源码变更)自动执行任务。
8.使用 Pipeline 脚本
如果你使用的是 Jenkins Pipeline,可以在 Jenkinsfile 中配置 SonarQube Scanner。以下是一个示例 Pipeline 脚本:
pipeline {
agent any
tools {
sonarQube 'SonarQube Scanner' // SonarQube Scanner的工具名称
}
stages {
stage('Build') {
steps {
echo 'Building...'
// 添加你的构建步骤,例如编译代码
}
}
stage('SonarQube Analysis') {
steps {
script {
// 需要配置 SonarQube 服务器信息
def scannerHome = tool 'SonarQube Scanner'
withSonarQubeEnv('SonarQube Server') { // SonarQube 服务器的名称
sh "${scannerHome}/bin/sonar-scanner -Dsonar.projectKey=my-project-key -Dsonar.sources=src"
}
}
}
}
}
post {
always {
echo 'Post actions...'
// 添加需要在任务结束时执行的步骤
}
}
}
通过将 Sonar-Scanner 集成到 Jenkins,你可以在构建过程中自动执行代码质量分析,并将结果发布到 SonarQube 服务器。这有助于在持续集成/持续交付(CI/CD)管道中早期发现和解决代码问题,提高代码质量和安全性。