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

代码质量是特定代码片段的有用性和可维护性的近似值。质量代码将使维护和扩展应用程序的任务变得更加容易。在本指南中,您将部署SonarQube服务器和扫描程序来分析代码并创建代码质量报告。然后,您将使用SonarQube工具扫描机器,对您的机器进行测试。

作者选择了Internet Archive作为Write for DOnations计划的一部分进行捐赠。

介绍

代码质量是特定代码片段的有用性和可维护性的近似值。 质量代码将使维护和扩展应用程序的任务变得更加容易。 它有助于确保在将来进行必要的更改时引入更少的错误。

SonarQube是一个开源工具,可以帮助进行代码质量分析和报告。 它会扫描您的源代码,查找潜在的错误,漏洞和可维护性问题,然后在报告中显示结果,以便您识别应用程序中的潜在问题。

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

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

先决条件

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

第1步 - 准备安装

您需要完成几个步骤来准备SonarQube安装。 由于SonarQube是一个将作为服务运行的Java应用程序,并且由于您不希望以root用户身份运行服务,因此您将专门创建另一个系统用户来运行SonarQube服务。 之后,您将创建安装目录并设置其权限,然后您将为SonarQube创建MySQL数据库和用户。

首先,创建sonarqube用户:

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

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

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

sudo mkdir /opt/sonarqube

SonarQube版本以压缩格式打包,因此请安装unzip实用程序,以便您提取这些文件。

sudo apt-get install unzip

接下来,您将创建SonarQube将使用的数据库和凭据。 root用户登录MySQL服务器:

sudo mysql -u root -p

然后创建SonarQube数据库:

CREATE DATABASE sonarqube;

现在创建SonarQube将用于访问数据库的凭据。

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

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

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

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

FLUSH PRIVILEGES;
EXIT;

现在您已拥有用户和目录,您将下载并安装SonarQube服务器。

第2步 - 下载和安装SonarQube

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

cd /opt/sonarqube

然后,转到SonarQube下载页面并获取SonarQube 7.5 Community Edition的下载链接。 SonarQube有很多版本和版本可以在页面上下载,但在这个特定的教程中我们将使用SonarQube 7.5社区版。

获取链接后,下载文件:

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

解压缩文件:

sudo unzip sonarqube-7.5.zip

文件解压缩后,删除下载的zip文件,因为您不再需要它:

sudo rm sonarqube-7.5.zip

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

sudo chown -R sonarqube:sonarqube /opt/sonarqube

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

第3步 - 配置SonarQube服务器

我们需要在SonarQube配置文件中编辑一些内容。 即:

  • 我们需要指定SonarQube服务器将用于数据库连接的用户名和密码。
  • 我们还需要告诉SonarQube将MySQL用于我们的后端数据库。
  • 我们将告诉SonarQube以服务器模式运行,这将提高性能。
  • 我们还会告诉SonarQube只监听本地网络地址,因为我们将使用反向代理。

首先打开SonarQube配置文件:

sudo nano sonarqube-7.5/conf/sonar.properties

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

/opt/sonarqube/sonarqube-7.5/conf/sonar.properties

    ...

    sonar.jdbc.username=sonarqube
    sonar.jdbc.password=some_secure_password

    ...

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

/opt/sonarqube/sonarqube-7.5/conf/sonar.properties

    ...

    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

    ...

由于SonarQube的这个实例将作为专用服务器运行,我们可以添加-server选项来激活SonarQube的服务器模式,这将有助于最大化性能。

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

/opt/sonarqube/sonarqube-7.5/conf/sonar.properties

    ...

    sonar.web.javaAdditionalOpts=-server
    sonar.web.host=127.0.0.1


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

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

创建服务文件:

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

将以下内容添加到文件中,该文件指定SonarQube服务的启动和停止方式:

/etc/systemd/system/sonarqube.service

[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking

ExecStart=/opt/sonarqube/sonarqube-7.5/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/sonarqube-7.5/bin/linux-x86-64/sonar.sh stop

User=sonarqube
Group=sonarqube
Restart=always

[Install]
WantedBy=multi-user.target

您可以在了解系统单元和单元文件中了解有关systemd单元文件的更多信息。

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

sudo service sonarqube start

检查SonarQube服务的状态以确保它已启动并按预期运行:

service sonarqube status

如果服务已成功启动,您将看到一条与此类似的“Active”行:

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

接下来,将SonarQube服务配置为在引导时自动启动:

sudo systemctl enable sonarqube

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

curl http://127.0.0.1:9000

初始化过程完成后,您可以继续下一步。

第4步 - 配置反向代理

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

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

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

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

在/ etc / nginx的/启用的站点 - / sonarqube

server {
    listen 80;
    server_name sonarqube.example.com;

    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

保存并关闭文件。

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

sudo nginx -t

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

sudo service nginx restart

要进行快速测试,您现在可以在Web浏览器中访问http:// sonarqube.example.com 您将受到SonarQube网络界面的欢迎。

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

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

如果这是您第一次申请Let's加密证书,Certbot将提示您输入您的电子邮件地址和EULA协议。 输入您的电子邮件并接受EULA。

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

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

第5步 - 保护SonarQube

SonarQube附带管理员的默认管理员用户名和密码。 此默认密码不安全,因此您需要将其更新为更安全的安全措施。

首先访问安装的URL,然后使用默认凭据登录。 如果系统提示您启动教程,只需单击“ 跳过本教程”即可转到仪表板。

登录后,单击“ 管理”选项卡,从下拉列表中选择“ 安全性 ”,然后选择“ 用户”

SonarQube用户管理选项卡

在此处,单击“管理员”帐户行右侧的小齿轮,然后单击“更改密码”。 务必将密码更改为易于记忆但难以猜测的内容。

现在创建一个普通用户,您可以使用该用户创建项目并从同一页面向服务器提交分析结果。 单击页面右上角的“ 创建用户”按钮:
SonarQube新用户对话框

然后通过单击“标记”列中的按钮并为此标记指定名称,为特定用户创建标记。 稍后在调用代码扫描程序时需要此令牌,因此请务必将其写在安全的地方。

最后,您可能会注意到SonarQube实例对全世界都是开放的,任何人都可以查看分析结果和源代码。 此设置非常不安全,因此我们将SonarQube配置为仅允许登录用户访问仪表板。 在同一“ 管理”选项卡中,单击“ 配置” ,然后单击“ 常规设置” ,再单击左窗格中的“ 安全性 ”。 翻转显示强制用户身份验证以启用身份验证的开关,然后单击交换机下方的“ 保存”按钮。

SonarQube Force认证开关

现在您已完成设置服务器,让我们设置SonarQube扫描仪。

第6步 - 设置代码扫描程序

SonarQube的代码扫描程序是一个单独的程序包,您可以将其安装在与运行SonarQube服务器的计算机不同的计算机上,例如本地开发工作站或连续交付服务器。 您可以在SonarQube网站上找到适用于Windows,MacOS和Linux的软件包

在本教程中,您将在托管SonarQube服务器的同一台服务器上安装代码扫描程序。

首先为扫描程序创建一个目录:

sudo mkdir /opt/sonarscanner

然后切换到该目录:

cd /opt/sonarscanner

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

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

接下来,提取扫描仪:

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

然后删除zip存档文件:

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

之后,您需要修改一些设置以使扫描程序与您的服务器安装一起使用。 打开配置文件进行编辑:

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

首先,告诉扫描仪应该在哪里提交代码分析结果。 sonar.host.url对以sonar.host.url开头的行进行sonar.host.url ,并将其设置为SonarQube服务器的URL:

/opt/sonarscanner/sonar-scanner-3.2.0.1227-linux/conf/sonar.properties
    sonar.host.url=https://sonarqube.example.com

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

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

然后创建一个符号链接,以便您可以在不指定路径的情况下调用扫描程序:

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

既然已经设置了扫描仪,我们就可以运行第一次代码扫描了。

第7步 - 在SonarQube示例项目上运行测试扫描

如果您想与SonarQube一起探索它能做什么,您可以考虑在SonarQube示例项目上运行测试扫描。 这些是SonarQube团队创建的示例项目,其中包含SonarQube随后将检测和报告的许多问题。

在主目录中创建一个新的工作目录,然后切换到该目录:

cd ~
mkdir sonar-test && cd sonar-test

下载示例项目:

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

解压缩项目并删除存档文件:

unzip master.zip
rm master.zip

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

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

运行扫描程序,将先前创建的令牌传递给它:

sonar-scanner -D sonar.login=your_token_here

这需要一段时间。 扫描完成后,您将在控制台上看到类似的内容:

INFO: Task total time: 14.128 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 21.776s
INFO: Final Memory: 17M/130M
INFO: ------------------------------------------------------------------------

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

SonarQube仪表板

现在您已确认SonarQube服务器和扫描仪使用测试代码,您可以使用SonarQube分析您自己的代码。

第8步 - 运行扫描您自己的代码

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

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

nano sonar-project.properties

您将使用此文件向SonarQube介绍有关项目的一些信息。

首先,定义项目密钥 ,该项目密钥项目的唯一ID。 您可以使用任何您喜欢的内容,但此ID对于SonarQube实例必须是唯一的:

sonar-project.properties

    # Unique ID for this project
    sonar.projectKey=foobar:hello-world

    ...

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

sonar-project.properties

    ...

    sonar.projectName=Hello World Project
    sonar.projectVersion=1.0

    ...

最后,告诉SonarQube在哪里查找代码文件。 请注意,这与配置文件所在的目录有关。 将其设置为当前目录:

sonar-project.properties

    # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
    sonar.sources=.

关闭并保存文件。

您已准备好对自己的代码运行代码质量分析。 再次运行sonar-scanner ,传递你的令牌:

sonar-scanner -D sonar.login=your_token_here

扫描完成后,您将看到与此类似的摘要屏幕:

INFO: Task total time: 5.417 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 9.659s
INFO: Final Memory: 39M/112M
INFO: ------------------------------------------------------------------------

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

结论

在本教程中,您已设置SonarQube服务器和扫描程序以进行代码质量分析。 现在,您只需运行扫描即可确保您的代码易于维护--SonarQube将告诉您潜在问题可能在哪里!

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


分享按钮