如何在Ubuntu18.04上使用SonarQube确保代码质量
作为 Write for DOnations 计划的一部分,作者选择了 Internet Archive 来接收捐赠。
介绍
代码质量 是对特定代码的有用性和可维护性的近似值。 高质量的代码将使维护和扩展应用程序的任务变得更容易。 它有助于确保在您将来进行所需的更改时引入更少的错误。
SonarQube 是一个开源工具,可协助进行代码质量分析和报告。 它扫描您的源代码以查找潜在的错误、漏洞和可维护性问题,然后将结果呈现在报告中,以便您识别应用程序中的潜在问题。
SonarQube 工具本身由两部分组成:扫描仪,这是一个应用程序,将安装在开发人员的机器上本地进行代码分析,以及用于记录保存和报告的集中式服务器。 单个 SonarQube 服务器实例可以支持多个扫描仪,使您能够将来自多个开发人员的代码质量报告集中在一个地方。
在本指南中,您将部署 SonarQube 服务器和扫描仪来分析您的代码并创建代码质量报告。 然后,您将通过使用 SonarQube 扫描仪扫描示例代码在您的机器上执行测试。
先决条件
在开始本指南之前,您需要以下内容:
- 一台具有 3GB 或更多 内存的 Ubuntu 18.04 服务器按照此 Ubuntu 18.04 初始服务器设置进行设置,包括 sudo 非 root 用户和防火墙。
- 在服务器上安装Oracle Java 8,按照本Oracle JDK安装教程中的Oracle JDK部分进行配置。
- Nginx 和 MySQL,按照 本 LEMP 安装指南 中的 Nginx 和 MySQL 部分进行配置。
- Certbot(Let's Encrypt 客户端),按照 How To Secure Nginx with Let's Encrypt on Ubuntu 18.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 版本以压缩格式打包,因此请安装 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 社区版的下载链接。 页面上有许多版本和风格的 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
您可以在 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 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/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 服务器之间的所有通信都得到加密。
现在我们已经完成了反向代理的设置,我们可以继续保护我们的 SonarQube 服务器。
第 5 步 — 保护 SonarQube
SonarQube 附带默认管理员用户名和密码 admin。 此默认密码不安全,因此您需要将其更新为更安全的密码,以作为良好的安全实践。
首先访问安装的 URL,然后使用默认凭据登录。 如果提示开始教程,只需单击 跳过本教程 即可进入仪表板。
登录后,单击Administration选项卡,从下拉列表中选择Security,然后选择Users:
从这里,单击“管理员”帐户行右侧的小齿轮,然后单击“更改密码”。 请务必将密码更改为易于记忆但难以猜测的密码。
现在创建一个普通用户,您可以使用它来创建项目并将分析结果从同一页面提交到您的服务器。 点击页面右上角的【X13X】创建用户【X28X】按钮:
然后通过单击“令牌”列中的按钮并为该令牌命名,为特定用户创建令牌。 稍后调用代码扫描器时将需要此令牌,因此请务必将其写在安全的地方。
最后,您可能会注意到 SonarQube 实例向世界广泛开放,任何人都可以查看分析结果和您的源代码。 此设置非常不安全,因此我们将 SonarQube 配置为仅允许登录用户访问仪表板。 在同一个 Administration 选项卡中,单击 Configuration,然后单击 General Settings,然后单击左侧窗格中的 Security。 翻转显示 Force user authentication 的开关以启用身份验证,然后单击开关下方的 Save 按钮。
现在您已经完成了服务器的设置,让我们设置 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
开头的行并将其设置为 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 分析您自己的代码。
第 8 步 — 对您自己的代码运行扫描
要让 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 扫描仪文档 以了解如何在本地开发机器上运行分析或作为构建过程的一部分。