如何在Ubuntu16.04上使用SonarQube确保代码质量
作为 Write for DOnations 计划的一部分,作者选择了 Electronic Frontier Foundation 来接受捐赠。
介绍
代码质量 是对特定代码的有用性和可维护性的近似值。 高质量的代码将使维护和扩展应用程序的任务变得更容易。 它有助于确保在您将来进行所需的更改时引入更少的错误。
SonarQube 是一个开源工具,可协助进行代码质量分析和报告。 它扫描您的源代码以查找潜在的错误、漏洞和可维护性问题,然后将结果呈现在报告中,以便您识别应用程序中的潜在问题。
SonarQube 工具由两个子应用程序组成:一个分析引擎,它安装在开发人员的本地机器上,以及一个用于记录和报告的集中式服务器。 单个 SonarQube 服务器实例可以支持多个扫描仪,使您能够将来自多个开发人员的代码质量报告集中在一个地方。
在本指南中,您将部署 SonarQube 服务器和扫描仪来分析您的代码并创建代码质量报告。 然后,您将通过使用 SonarQube 工具扫描您的机器来执行测试。
先决条件
在开始本指南之前,您需要以下内容:
- 按照Ubuntu 16.04初始服务器设置教程设置一台具有2GB或更多内存的Ubuntu 16.04服务器,包括sudo非root用户和防火墙。
- 在服务器上安装Oracle Java 8,按照本Oracle JDK安装教程中的Oracle JDK部分进行配置。
- Nginx 和 MySQL,按照 本 LEMP 安装指南 中的 Nginx 和 MySQL 部分进行配置。
- Certbot(Let's Encrypt 客户端),按照 How to Set Up Let's Encrypt with Nginx server blocks on Ubuntu 16.04 进行配置。
- 一个完全限定的域名和一个指向您将安装 SonarQube 的服务器的 A 记录。 如果您使用 DigitalOcean 的 DNS 服务,此 DNS 记录设置指南 将帮助您进行设置。 我们将在本教程中使用
sonarqube.example.com
。
第 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 用户能够读取和写入此目录中的文件:
sudo chown -R sonarqube:sonarqube /opt/sonarqube
SonarQube 版本以压缩格式打包,因此请使用包管理器安装 unzip
实用程序,以便提取分发文件:
sudo apt-get install unzip
接下来,我们需要创建 SonarQube 将使用的数据库和凭据。 以 root 用户登录 MySQL 服务器:
mysql -u root -p
然后创建 SonarQube 数据库:
CREATE DATABASE sonarqube; EXIT;
现在创建 SonarQube 将用于访问数据库的凭据。
CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password'; GRANT ALL ON sonarqube.* to sonarqube@'localhost';
然后授予权限,以便新创建的用户可以对 SonarQube 数据库进行更改:
GRANT ALL ON sonarqube.* to sonarqube@'localhost';
然后应用权限更改并退出 MySQL 控制台:
FLUSH PRIVILEGES; EXIT;
现在我们已经有了用户和目录,让我们下载并安装 SonarQube 本身。
第 2 步 - 下载和安装 SonarQube
首先将当前工作目录更改为 SonarQube 安装目录:
cd /opt/sonarqube
然后,前往 SonarQube 下载页面 并获取 SonarQube 7.0 的下载链接。 页面上有两个版本的 SonarQube 可供下载,但在本特定教程中,我们将使用 SonarQube 7.0。
获取链接后,下载文件:
sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip
然后解压文件:
sudo unzip sonarqube-7.0.zip
文件解压后,删除下载的 zip 文件,因为您不再需要它:
sudo rm sonarqube-7.0.zip
现在所有文件都准备好了,是时候配置 SonarQube 了。
第 3 步 - 配置 SonarQube 服务器
我们需要在 SonarQube 配置文件中编辑一些内容。 即:
- 我们需要指定 SonarQube 服务器将用于数据库连接的用户名和密码。
- 我们还需要告诉 SonarQube 使用 MySQL 作为我们的后端数据库。
- 我们将告诉 SonarQube 在服务器模式下运行,这将提高性能。
- 我们还将告诉 SonarQube 仅侦听本地网络地址,因为我们将使用反向代理。
首先打开 SonarQube 配置文件:
sudo nano sonarqube-7.0/conf/sonar.properties
首先,将 SonarQube 用于访问数据库的用户名和密码更改为您为 MySQL 创建的用户名和密码:
/opt/sonarqube/sonarqube-7.0/conf/sonar.properties
... sonar.jdbc.username=sonarqube sonar.jdbc.password=some_secure_password ...
接下来,告诉 SonarQube 使用 MySQL 作为数据库驱动程序:
/opt/sonarqube/sonarqube-7.0/conf/sonar.properties
... sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false ...
最后,告诉 SonarQube 以服务器模式运行,只监听本地地址:
/opt/sonarqube/sonarqube-7.0/conf/sonar.properties
... sonar.web.host=127.0.0.1 sonar.web.javaAdditionalOpts=-server
更新这些字段后,保存并关闭文件。
接下来,我们将配置 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.0/bin/linux-x86-64/sonar.sh start ExecStop=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh stop User=sonarqube Group=sonarqube Restart=always [Install] WantedBy=multi-user.target
您可以在 Understanding Systemd Units and Unit Files 中了解有关 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 Sun 2018-03-04 01:29:44 UTC; 1 months 14 days
接下来,将 SonarQube 服务配置为在启动时自动启动:
sudo systemctl enable sonarqube
与大多数其他 Java 应用程序一样,SonarQube 需要一些时间来初始化。 初始化过程完成后,您可以继续下一步。
第 4 步 - 配置反向代理
现在我们已经运行了 SonarQube 服务器,是时候配置 Nginx,它将成为我们的 SonarQube 实例的反向代理和 HTTPS 终结器。
首先为站点创建一个新的 Nginx 配置文件:
sudo nano /etc/nginx/sites-enabled/sonarqube
添加此配置,以便 Nginx 能够将传入流量路由到 SonarQube:
/etc/nginx/sites-enabled/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 Encrypt 证书,Certbot 将提示您输入电子邮件地址和 EULA 协议。 输入您的电子邮件并接受 EULA。
然后,Certbot 将询问您希望如何配置安全设置。 选择将所有请求重定向到 HTTPS 的选项,确保发送到您的服务器的所有请求都将被加密。
现在我们已经完成了反向代理的设置,我们可以继续保护我们的 SonarQube 服务器。
第 5 步 - 保护 SonarQube
SonarQube 附带默认管理员用户名和密码 admin。 此默认密码不安全,因此我们希望将其更新为更安全的密码,以作为良好的安全实践。
首先访问安装的 URL,然后使用默认凭据登录。
登录后,单击 Administration 选项卡,从下拉列表中选择 Security,然后选择 Users:
在此处,单击“管理员”帐户行右侧的小齿轮,然后单击“更改密码”。 请务必将密码更改为易于记忆但难以猜测的密码。
现在创建一个普通用户,您可以使用它来创建项目并将分析结果从同一页面提交到您的服务器。 点击页面右上角的【X13X】创建用户【X28X】按钮:
然后通过单击“令牌”列中的按钮并为该令牌命名,为特定用户创建令牌。 稍后调用代码扫描器时将需要此令牌,因此请务必将其写在安全的地方。
最后,您可能会注意到 SonarQube 实例向世界广泛开放,任何人都可以查看分析结果和您的源代码。 此设置非常不安全,因此我们将 SonarQube 配置为仅允许登录用户访问仪表板。 在同一管理选项卡中,单击 Configuration,然后单击左侧窗格中的 Security。 翻转此页面上的开关以要求用户身份验证。
现在我们已经完成了服务器的设置,让我们设置扫描仪。
第 6 步 - 设置代码扫描器
SonarQube 的代码扫描器是一个单独的包,您可以将其安装在与运行 SonarQube 服务器的机器不同的机器上,例如本地开发工作站或持续交付服务器。 您可以在 SonarQube 网站 上找到适用于 Windows、MacOS 和 Linux 的软件包
在本教程中,我们将在托管 SonarQube 服务器的同一台服务器上安装代码扫描器。
首先为扫描仪创建一个目录并更改为新目录:
sudo mkdir /opt/sonarscanner cd /opt/sonarscanner
然后使用 wget
下载适用于 Linux 的 SonarQube 扫描仪:
sudo wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip
提取扫描仪,然后删除 zip 存档文件:
sudo unzip sonar-scanner-cli-3.0.3.778-linux.zip sudo rm sonar-scanner-cli-3.0.3.778-linux.zip
之后,我们需要修改一些设置以使扫描仪与我们的服务器安装一起工作。 打开配置文件进行编辑:
sudo nano sonar-scanner-3.0.3.778-linux/conf/sonar-scanner.properties
首先,告诉扫描器应该在哪里提交代码分析结果。 取消注释以 sonar.host.url
开头的行并将其设置为 SonarQube 服务器的 URL:
/opt/sonarscanner/sonar-scanner-3.0.3.778-linux/conf/sonar.properties
sonar.host.url=https://sonarqube.example.com
保存并关闭文件。 现在使扫描仪二进制可执行:
sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner
然后创建一个符号链接,以便您可以在不指定路径的情况下调用扫描仪:
sudo ln -s /opt/sonarscanner/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner
现在扫描仪已经设置好了,我们准备运行我们的第一次代码扫描。
第 7 步 - 运行测试扫描
如果您只想使用 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: 9.834 s INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS INFO: ------------------------------------------------------------------------ INFO: Total time: 14.076s INFO: Final Memory: 47M/112M INFO: ------------------------------------------------------------------------
示例项目的报告现在将出现在 SonarQube 仪表板上,如下所示:
现在您已经确认 SonarQube 服务器和扫描仪都按预期工作,您可以让 SonarQube 工作来分析您自己的代码。
将您的项目传输到服务器,或按照步骤 6 中的步骤在您的工作站上安装和配置 SonarQube 扫描仪,并将其配置为指向您的 SonarQube 服务器。
然后,在项目的根目录中,创建一个 SonarQube 配置文件:
nano sonar-project.properties
您将使用此文件告诉 SonarQube 关于您的项目的一些信息:
首先,定义一个项目键,它是项目的唯一ID。 你可以使用任何你想要的东西,但是这个 ID 对于你的 SonarQube 实例必须是唯一的:
声纳-project.properties
# Unique ID for this project sonar.projectKey=foobar:hello-world ...
然后,指定项目名称和版本,以便 SonarQube 能够在仪表板中显示此信息:
声纳-project.properties
... sonar.projectName=Hello World Project sonar.projectVersion=1.0 ...
最后,告诉 SonarQube 在哪里查找代码文件本身。 请注意,这与配置文件所在的目录有关。 将其设置为当前目录:
声纳-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 扫描仪文档 以了解如何在本地开发机器上运行分析或作为构建过程的一部分。