如何在 Ubuntu 18.04 上使用 SonarQube 确保代码质量

作者选择了 Internet Archive以作为 Write for Donations计划的一部分接受捐赠。

介绍

Code quality 是指某个特定代码的可用性和可维护性。 质量代码将使维护和扩展应用程序的任务更容易。

SonarQube是一个开源工具,帮助分析和报告代码质量. 它扫描您的源代码寻找潜在的错误,漏洞和维护问题,然后在报告中呈现结果,这将使您能够识别应用程序中的潜在问题。

SonarQube 工具本身由两个部分组成:一个扫描仪,即将本地安装在开发者的机器上进行代码分析的应用程序,以及用于记录和报告的集中服务器.一个单一的 SonarQube 服务器实例可以支持多个扫描仪,允许您在一个地方集中多个开发者的代码质量报告。

在本指南中,您将部署一个 SonarQube 服务器和扫描仪来分析您的代码并创建代码质量报告,然后通过使用 SonarQube 扫描仪扫描示例代码来对您的机器进行测试。

前提条件

在您开始本指南之前,您将需要以下内容:

步骤 1 – 准备安装

您需要完成几个步骤来准备安装 SonarQube. 由于 SonarQube 是一个将作为服务运行的 Java 应用程序,并且因为您不希望作为 root 用户运行服务,您将创建另一个系统用户来运行 SonarQube 服务。

首先,创建 sonarqube 用户:

1sudo adduser --system --no-create-home --group --disabled-login sonarqube

此用户将仅用于运行 SonarQube 服务,因此会创建一个无法直接登录服务器的系统用户。

接下来,创建目录来安装 SonarQube:

1sudo mkdir /opt/sonarqube

SonarQube 版本以 zip 格式包装,因此安装unzip实用程序,允许您提取这些文件。

1sudo apt-get install unzip

接下来,您将创建一个数据库和凭证,SonarQube将使用它. 登录MySQL服务器作为 root 用户:

1sudo mysql -u root -p

然后创建 SonarQube 数据库:

1CREATE DATABASE sonarqube;

现在创建 SonarQube 将使用的凭证来访问数据库。

1CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password';

然后授予权限,以便新创建的用户可以对 SonarQube 数据库进行更改:

1GRANT ALL ON sonarqube.* to sonarqube@'localhost';

然后应用权限更改并退出MySQL控制台:

1FLUSH PRIVILEGES;
2EXIT;

现在你已经有了用户和目录,你将下载和安装SonarQube服务器。

第2步:下载和安装 SonarQube

首先,将当前的工作目录更改为 SonarQube 安装目录:

1cd /opt/sonarqube

然后,转到 SonarQube 下载页面并抓住 SonarQube 7.5 社区版的下载链接。

获取链接后,下载文件:

1sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.5.zip

Unzip 檔案:

1sudo unzip sonarqube-7.5.zip

一旦提取文件,删除下载的 zip 文件,因为你不再需要它:

1sudo rm sonarqube-7.5.zip

最后,更新权限,以便 sonarqube 用户拥有这些文件,并能够阅读和写入此目录中的文件:

1sudo chown -R sonarqube:sonarqube /opt/sonarqube

现在所有文件都已在位,我们可以继续配置SonarQube服务器。

第3步:配置 SonarQube 服务器

我们需要在 SonarQube 配置文件中编辑一些东西,即:

  • 我们需要指定SonarQube服务器将用于数据库连接的用户名和密码。 * 我们还需要告诉SonarQube为我们的后端数据库使用MySQL。 * 我们会告诉SonarQube在服务器模式下运行,这将提高性能。

打开 SonarQube 配置文件:

1sudo nano sonarqube-7.5/conf/sonar.properties

首先,更改 SonarQube 将使用的用户名和密码,以访问您为 MySQL 创建的用户名和密码的数据库:

1[label /opt/sonarqube/sonarqube-7.5/conf/sonar.properties]
2
3    ...
4
5    sonar.jdbc.username=sonarqube
6    sonar.jdbc.password=some_secure_password
7
8    ...

接下来,告诉 SonarQube 使用 MySQL 作为数据库驱动程序:

1[label /opt/sonarqube/sonarqube-7.5/conf/sonar.properties]
2
3    ...
4
5    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
6
7    ...

由于此 SonarQube 实例将作为专用服务器运行,我们可以添加服务器选项来激活 SonarQube 的服务器模式,这将有助于最大限度地提高性能。

Nginx 将处理 SonarQube 客户端和您的服务器之间的通信,因此您会告诉 SonarQube 只听本地地址。

1[label /opt/sonarqube/sonarqube-7.5/conf/sonar.properties]
2
3    ...
4
5    sonar.web.javaAdditionalOpts=-server
6    sonar.web.host=127.0.0.1

更新这些值后,保存并关闭文件。

接下来,您将使用 Systemd来配置 SonarQube 作为服务运行,以便它在重新启动时自动启动。

创建服务文件:

1sudo nano /etc/systemd/system/sonarqube.service

将下列内容添加到指定 SonarQube 服务如何启动和停止的文件中:

 1[label /etc/systemd/system/sonarqube.service]
 2
 3[Unit]
 4Description=SonarQube service
 5After=syslog.target network.target
 6
 7[Service]
 8Type=forking
 9
10ExecStart=/opt/sonarqube/sonarqube-7.5/bin/linux-x86-64/sonar.sh start
11ExecStop=/opt/sonarqube/sonarqube-7.5/bin/linux-x86-64/sonar.sh stop
12
13User=sonarqube
14Group=sonarqube
15Restart=always
16
17[Install]
18WantedBy=multi-user.target

您可以了解有关 systemd 单元文件的更多信息,请参阅 理解 Systemd 单元和单元文件

关闭并保存文件,然后启动 SonarQube 服务:

1sudo service sonarqube start

检查 SonarQube 服务的状态,以确保它已经开始并按预期运行:

1service sonarqube status

如果该服务已成功启动,您将看到一个类似于此的活跃的行:

1 sonarqube.service - SonarQube service
2   Loaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor preset
3   Active: active (running) since Sat 2019-01-05 19:00:00 UTC; 2s ago

接下来,配置 SonarQube 服务自动启动:

1sudo systemctl enable sonarqube

在此时,SonarQube 服务器需要几分钟才能完全初始化,您可以通过查询 HTTP 端口来检查服务器是否已启动:

1curl http://127.0.0.1:9000

一旦初始化过程完成,您可以转到下一步。

第4步:配置反向代理

现在我们有 SonarQube 服务器运行,是时候配置 Nginx,它将是我们的 SonarQube 实例的反向代理和 HTTPS 终止器。

首先,为网站创建一个新的 Nginx 配置文件:

1sudo nano /etc/nginx/sites-enabled/sonarqube

添加此配置,以便 Nginx 将流量路由到 SonarQube:

 1[label /etc/nginx/sites-enabled/sonarqube]
 2
 3server {
 4    listen 80;
 5    server_name sonarqube.example.com;
 6
 7    location / {
 8        proxy_pass http://127.0.0.1:9000;
 9    }
10}

保存并关闭文件。

接下来,确保您的配置文件没有语法错误:

1sudo nginx -t

如果你看到错误,修复它们并再次运行sudo nginx -t。一旦没有错误,重新启动 Nginx:

1sudo service nginx restart

为了快速测试,您现在可以在您的 Web 浏览器中访问 http://sonarqube.example.com 您将被欢迎使用 SonarQube Web 界面。

现在我们将使用 Let's Encrypt 创建 HTTPS 证书,以便在服务器和本地机器之间安全地传输数据。

1sudo certbot --nginx -d sonarqube.example.com

如果这是您第一次要求获得 Let’s Encrypt 证书,Certbot 将提示您的电子邮件地址和 EULA 协议,输入您的电子邮件并接受 EULA。

Certbot 会问您如何配置安全设置,选择将所有请求重定向到 HTTPS 选项,以确保客户端和 SonarQube 服务器之间的所有通信都得到加密。

现在我们已经完成了反向代理的设置,我们可以继续保护我们的SonarQube服务器。

步骤5 - 保护 SonarQube

SonarQube 配备了默认管理员用户名和密码 admin . 此默认密码不安全,因此您将希望更新到更安全的东西作为一个良好的安全实践。

开始访问您的安装的URL,然后使用默认凭据登录. 如果被要求启动教程,只需单击 跳过这个教程 才能进入仪表板。

一旦登录,请单击管理选项卡,从滚动列表中选择安全选项,然后选择用户:

SonarQube users administration tab

从这里,点击管理员帐户行右侧的小子,然后点击更改密码

Now create a normal user that you can use to create projects and submit analysis results to your server from the same page. Click on the Create User button on the top-right of the page: SonarQube new user dialog

然后,通过点击代币列中的按钮创建一个特定用户的代币,并给该代币一个名字。当您召唤代码扫描仪时,您将需要这个代币,所以请确保在安全的地方写下来。

最后,你可能注意到SonarQube的例子对世界是开放的,任何人都可以查看分析结果和你的源代码. 这个设置非常不安全,所以我们将配置 SonarQube 只允许登录用户访问仪表板. 从同名的** 行政** 分页起,点击** 图形** ,然后点击** 一般设置** ,然后点击左面板** 安全** 。 翻转表示 ** Force 用户认证 ** 以启用认证,然后点击开关下方的 ** Save ** 按钮.

SonarQube Force authentication switch

现在你已经完成了服务器的设置,让我们设置SonarQube扫描仪。

第6步:设置代码扫描仪

SonarQube 的代码扫描器是一个单独的包,您可以安装在运行 SonarQube 服务器的不同机器上,例如您的本地开发工作站或连续交付服务器。

在本教程中,您将安装代码扫描仪在托管我们的SonarQube服务器的相同服务器上。

首先,为扫描仪创建一个目录:

1sudo mkdir /opt/sonarscanner

然后更改到该目录:

1cd /opt/sonarscanner

下载用于 Linux 的 SonarQube 扫描仪使用 wget:

1sudo wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.2.0.1227-linux.zip

接下来,将扫描仪提取到:

1sudo unzip sonar-scanner-cli-3.2.0.1227-linux.zip

然后删除 zip 档案文件:

1sudo rm sonar-scanner-cli-3.2.0.1227-linux.zip

之后,您需要修改几个设置,以便扫描仪与您的服务器安装一起工作。

1sudo nano sonar-scanner-3.2.0.1227-linux/conf/sonar-scanner.properties

首先,告诉扫描仪应该在哪里提交代码分析结果. 删除评论的行,开始于sonar.host.url,并将其设置为您的SonarQube服务器的URL:

1[label /opt/sonarscanner/sonar-scanner-3.2.0.1227-linux/conf/sonar.properties]
2    sonar.host.url=https://sonarqube.example.com

保存并关闭文件. 现在让扫描仪二进制可执行:

1sudo chmod +x sonar-scanner-3.2.0.1227-linux/bin/sonar-scanner

然后创建一个符号链接,以便您可以拨打扫描仪而不指定路径:

1sudo ln -s /opt/sonarscanner/sonar-scanner-3.2.0.1227-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner

现在扫描仪已经设置,我们已经准备好运行我们的第一个代码扫描。

步骤 7 — 在 SonarQube 示例项目上运行测试扫描

如果你想用 SonarQube 来看看它能做什么,你可以考虑在 SonarQube 示例项目上运行测试扫描。

在主目录中创建一个新的工作目录,然后更改到目录:

1cd ~
2mkdir sonar-test && cd sonar-test

下载示例项目:

1wget https://github.com/SonarSource/sonar-scanning-examples/archive/master.zip

解开项目并删除档案文件:

1unzip master.zip
2rm master.zip

接下来,切换到示例项目目录:

1cd sonar-scanning-examples-master/sonarqube-scanner

运行扫描仪,通过您之前创建的代码:

1sonar-scanner -D sonar.login=your_token_here

一旦扫描完成,您将在控制台上看到这样的东西:

1INFO: Task total time: 14.128 s
2INFO: ------------------------------------------------------------------------
3INFO: EXECUTION SUCCESS
4INFO: ------------------------------------------------------------------------
5INFO: Total time: 21.776s
6INFO: Final Memory: 17M/130M
7INFO: ------------------------------------------------------------------------

示例项目的报告现在将在 SonarQube 仪表板上如下:

SonarQube Dashboard

现在您已经确认 SonarQube 服务器和扫描仪与测试代码一起工作了,您可以使用 SonarQube 来分析自己的代码。

步骤8 - 在自己的代码上运行扫描

要让 SonarQube 分析自己的代码,请先将您的项目转移到服务器,或者按照步骤 6 安装和配置您的工作站上的 SonarQube 扫描仪,并将其配置为指向您的 SonarQube 服务器。

然后,在项目的 root 目录中,创建一个 SonarQube 配置文件:

1nano sonar-project.properties

您将使用此文件告诉SonarQube关于您的项目的一些事情。

首先,定义一个 project key,这是项目的唯一ID. 您可以使用任何您想要的,但此 ID 必须是独一无二的 SonarQube 实例:

1[label sonar-project.properties]
2
3    # Unique ID for this project
4    sonar.projectKey=foobar:hello-world
5
6    ...

然后,指定项目名称和版本,以便 SonarQube 在仪表板中显示此信息:

1[label sonar-project.properties]
2
3    ...
4
5    sonar.projectName=Hello World Project
6    sonar.projectVersion=1.0
7
8    ...

最后,告诉 SonarQube 在哪里寻找代码文件. 请注意,这与配置文件所在的目录有关。

1[label sonar-project.properties]
2
3    # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
4    sonar.sources=.

关闭并保存文件。

你已经准备好在自己的代码上运行代码质量分析了,再次运行sonar-scanner,将其传递给你的代码:

1sonar-scanner -D sonar.login=your_token_here

一旦扫描完成,您将看到一个类似于此的总结屏幕:

1INFO: Task total time: 5.417 s
2INFO: ------------------------------------------------------------------------
3INFO: EXECUTION SUCCESS
4INFO: ------------------------------------------------------------------------
5INFO: Total time: 9.659s
6INFO: Final Memory: 39M/112M
7INFO: ------------------------------------------------------------------------

该项目的代码质量报告现在将在 SonarQube 仪表板上。

结论

在本教程中,您已经设置了SonarQube服务器和扫描器来分析代码质量. 现在您可以通过简单地运行扫描来确保您的代码可以轻松维护 - SonarQube会告诉您潜在问题在哪里!

从这里,您可能想阅读 SonarQube 扫描仪文档以了解如何在本地开发机器上运行分析或作为构建过程的一部分。

Published At
Categories with 技术
comments powered by Disqus