Sonar-Scanner: 静态代码分析的利器

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.先决条件

  1. SonarQube 服务器:需要一个运行的 SonarQube 实例,可以是自托管的,也可以是使用 SonarQube Cloud。
  2. SonarQube 项目:在 SonarQube 上为你的项目创建一个新项目,并获取项目的密钥(Project Key)。
  3. 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 流水线的阶段。此示例包括 buildtestsonar_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 秘钥:

  1. 进入 GitLab 项目的 “Settings”(设置)。
  2. 选择 “CI / CD” 选项。
  3. 在 “Variables”(变量)部分,点击 “Expand”(展开)。
  4. 点击 “Add variable”(添加变量)。
  5. 添加以下变量:
    • Key: SONARQUBE_TOKEN
    • Value: 你的 SonarQube 认证令牌
    • Type: Masked(遮蔽)

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.先决条件

  1. Jenkins 服务器:确保 Jenkins 已安装并运行。
  2. SonarQube 服务器:需要一个运行的 SonarQube 实例。
  3. SonarQube 项目:在 SonarQube 上为你的项目创建一个新项目,并获取项目的密钥(Project Key)。
  4. SonarQube 认证令牌:从 SonarQube 用户设置中生成一个用户令牌(User Token)。

2. 安装 SonarQube Scanner 插件

首先,需要在 Jenkins 中安装 SonarQube Scanner 插件:

  1. 打开 Jenkins 控制面板。
  2. 进入 “Manage Jenkins”(管理 Jenkins)。
  3. 选择 “Manage Plugins”(管理插件)。
  4. 切换到 “Available”(可用插件)选项卡。
  5. 搜索 “SonarQube Scanner” 插件并安装。

安装完成后,重启 Jenkins 以应用插件。

3. 配置 SonarQube 服务器

安装插件后,需要在 Jenkins 中配置 SonarQube 服务器:

  1. 进入 “Manage Jenkins”(管理 Jenkins)。

  2. 选择 “Configure System”(配置系统)。

  3. 向下滚动到 “SonarQube servers”(SonarQube 服务器)部分。

  4. 点击 “Add SonarQube”(添加 SonarQube)。

  5. 配置以下信息:

    • Name(名称):给你的 SonarQube 实例一个标识名称。
    • Server URL(服务器 URL):SonarQube 服务器的 URL。
    • Server authentication token(服务器认证令牌):使用上面生成的 SonarQube 用户令牌。
  6. 保存配置。

4. 安装和配置 SonarQube Scanner

  1. 进入 “Manage Jenkins”(管理 Jenkins)。
  2. 选择 “Global Tool Configuration”(全局工具配置)。
  3. 向下滚动到 “SonarQube Scanner” 部分。
  4. 点击 “Add SonarQube Scanner”(添加 SonarQube Scanner)。
  5. 给它一个名称(例如 “SonarQube Scanner”),然后选择 “Install automatically”(自动安装)选项。

5. 创建 Jenkins 任务

  1. 在 Jenkins 主界面,点击 “New Item”(新建任务)。
  2. 输入任务名称,选择 “Freestyle project”(自由风格项目),然后点击 “OK”。
  3. 配置任务的常规信息,如源码管理(使用 Git 等)和构建触发器。

6. 配置 SonarQube 分析步骤

在任务配置页面中,添加一个构建步骤:

  1. 在 “Build”(构建)部分,点击 “Add build step”(添加构建步骤)。
  2. 选择 “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)管道中早期发现和解决代码问题,提高代码质量和安全性。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小辉同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值