如何使用Ubuntu 16.04上的SonarQube确保代码质量
作者选择电子前沿基金会作为Write for DOnations计划的一部分接受捐赠。
介绍
代码质量是特定代码的有用性和可维护性的近似值。 质量代码将使维护和扩展您的应用程序变得更容易。 它有助于确保在将来进行必要的更改时引入更少的错误。
SonarQube是一款开源工具,可协助代码质量分析和报告。 它会扫描您的源代码以查找潜在的错误,漏洞和可维护性问题,然后将结果呈现在报告中,以便您识别应用程序中的潜在问题。
SonarQube工具由两个子应用程序组成:一个分析引擎,它在开发人员的机器上本地安装,一个用于记录保存和报告的中央服务器。 一个SonarQube服务器实例可以支持多个扫描器,使您能够集中来自许多开发人员的代码质量报告。
在本指南中,您将部署SonarQube服务器和扫描仪来分析您的代码并创建代码质量报告。 然后,您将使用SonarQube工具对您的机器执行测试。
先决条件
在开始本指南之前,您需要以下内容:
- 按照Ubuntu 16.04初始服务器设置教程设置的一台Ubuntu 16.04服务器,其内存为2GB或更多 ,其中包括sudo非root用户和防火墙。
- Oracle Java 8安装在服务器上,根据此Oracle JDK安装教程中的Oracle JDK部分进行配置。
- Nginx和MySQL,按照本LEMP安装指南中的Nginx和MySQL部分进行配置。
- Certbot(Let's Encrypt客户端),通过以下如何设置让我们使用Ubuntu 16.04上的Nginx服务器块进行配置 。
- 一个完全合格的域名和一条指向安装SonarQube的服务器的A记录。 如果您使用DigitalOcean的DNS服务, 将帮助您设置。 我们将在本教程中使用
sonarqube.example.com
。
第1步 - 准备安装
在安装SonarQube之前,我们需要执行几个步骤。 由于SonarQube是一个作为服务运行的Java应用程序,并且由于以root用户身份运行服务当然并不理想,我们将专门创建另一个系统用户来运行SonarQube服务。 然后我们将创建安装目录并设置其权限,然后我们将为SonarQube创建一个MySQL数据库和用户。
首先,创建一个声纳用户:
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
一旦文件解压缩,删除下载的压缩文件,因为你不再需要它:
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创建的用户名和密码:
...
sonar.jdbc.username=sonarqube
sonar.jdbc.password=some_secure_password
...
接下来,告诉SonarQube使用MySQL作为数据库驱动程序:
...
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
...
最后,告诉SonarQube在服务器模式下运行,只听本地地址:
...
sonar.web.host=127.0.0.1
sonar.web.javaAdditionalOpts=-server
一旦这些字段被更新,保存并关闭文件。
接下来,我们将SonarQube服务器配置为作为服务运行,以便在服务器重新启动时自动启动。
创建服务文件:
sudo nano /etc/systemd/system/sonarqube.service
将以下内容添加到指定SonarQube服务应如何启动和停止的文件中:
[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
您可以在了解系统单元和单元文件中了解有关systemd单元文件的更多信息。
关闭并保存文件,然后启动SonarQube服务:
sudo service sonarqube start
检查SonarQube服务的状态以确保它已经启动并按预期运行:
service sonarqube status
如果服务已成功启动,您会看到一行显示为“有效”的行,与此类似:
● 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:
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,然后使用默认凭据登录。
登录后,单击管理选项卡,从下拉列表中选择安全性 ,然后选择用户 :
在这里,点击“管理员”帐户行右侧的小齿轮,然后点击“更改密码”。 请务必将密码更改为易于记忆但难以猜测的内容。
现在创建一个普通用户,您可以使用它来创建项目并将分析结果从同一页面提交给您的服务器。 点击页面右上角的创建用户按钮:
然后通过点击“Tokens”列中的按钮并为该令牌命名,为特定用户创建一个令牌。 您在调用代码扫描器后稍后需要此标记,因此请务必将其写在安全的地方。
最后,您可能会注意到SonarQube实例对世界是开放的,任何人都可以查看分析结果和源代码。
此设置非常不安全,因此我们将SonarQube配置为仅允许登录用户访问仪表板。 在相同的管理选项卡上,点击左侧窗格中的配置 ,然后点击安全 。 翻转此页面上的开关以要求用户认证。
现在我们已经完成了我们的服务器的设置,让我们设置扫描仪。
第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:
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实例是唯一的:
# Unique ID for this project
sonar.projectKey=foobar:hello-world
...
然后,指定项目名称和版本,以便SonarQube将能够在仪表板中显示此信息:
...
sonar.projectName=Hello World Project
sonar.projectVersion=1.0
...
最后,告诉SonarQube在哪里寻找代码文件本身。 请注意,这与配置文件所在的目录有关。 将其设置为当前目录:
# 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 Scanner文档,以了解如何在本地开发机器上运行分析或作为构建过程的一部分。