作者选择了 Electronic Frontier Foundation作为 Write for Donations计划的一部分接受捐款。
介绍
Code quality 是指某个特定代码的可用性和可维护性。 质量代码将使维护和扩展应用程序的任务更容易。
SonarQube是一个开源工具,帮助分析和报告代码质量. 它扫描您的源代码寻找潜在的错误,漏洞和维护问题,然后在报告中呈现结果,这将使您能够识别应用程序中的潜在问题。
SonarQube 工具由两个子应用程序组成:一个分析引擎,该引擎被本地安装在开发者的机器上,一个集中式服务器用于记录和报告。
在本指南中,您将部署一个 SonarQube 服务器和扫描仪来分析您的代码并创建代码质量报告,然后通过使用 SonarQube 工具扫描它来对您的机器进行测试。
前提条件
在您开始本指南之前,您将需要以下内容:
- 1个 Ubuntu 16.04 服务器,内存为 **2GB 或以上 ** ,通过后续设置 [Ubuntu 16.04 初始服务器设置教程] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04),包括一个sudo 非root 用户和一个防火墙. *Oracle Java 8已安装在服务器上,配置方式是跟随[这个Oracle JDK安装教程]中的Oracle JDK部分(https://andsky.com/tech/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04# installing-the-oracle-jdk).
- Nginx和MySQL,在[此LEMP安装指 (https://andsky.com/tech/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04)中按照Nginx和MySQL的路段配置.
- Certbot(Let's Encrypt client),通过跟随[如何设置 Let's 加密在Ubuntu 16.04 (https://andsky.com/tech/tutorials/how-to-set-up-let-s-encrypt-with-nginx-server-blocks-on-ubuntu-16-04)上的Nginx服务器块来配置. *一个完全合格的域名和一个指向服务器的唱片,你将在那里安装SonarQube. 如果您使用 DigitalOcean 的 DNS 服务,[此 DNS 记录设置指南] (https://andsky.com/tech/tutorials/an-introduction-to-digitalocean-dns# a-records) 将会帮助您设置此功能. 我们将在此教程中使用'sonarqube.example.com'。 .
步骤 1 – 准备安装
由于 SonarQube 是一个作为服务运行的 Java 应用程序,并且因为运行服务作为 root 用户肯定不是理想的,我们将创建另一个系统用户来运行 SonarQube 服务,然后我们将创建安装目录并设置其权限,然后我们将创建一个 MySQL 数据库和用户。
首先,创建一个 sonarqube 用户:
1sudo adduser --system --no-create-home --group --disabled-login sonarqube
我们只会使用这个用户运行SonarQube服务,因此我们会创建一个无法直接登录服务器的系统用户。
接下来,创建将包含 SonarQube 文件的目录:
1sudo mkdir /opt/sonarqube
创建目录后,更新权限,以便 sonarqube 用户能够读取和写入此目录中的文件:
1sudo chown -R sonarqube:sonarqube /opt/sonarqube
SonarQube 版本以 zip 格式包装,因此使用您的包管理器安装unzip
实用程序,以便您可以提取分布文件:
1sudo apt-get install unzip
接下来,我们需要创建一个数据库和凭证,SonarQube 将使用。登录 MySQL 服务器作为 root 用户:
1mysql -u root -p
然后创建 SonarQube 数据库:
1CREATE DATABASE sonarqube;
2EXIT;
现在创建 SonarQube 将使用的凭证来访问数据库。
1CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password';
2GRANT ALL ON sonarqube.* to sonarqube@'localhost';
然后授予权限,以便新创建的用户可以对 SonarQube 数据库进行更改:
1GRANT ALL ON sonarqube.* to sonarqube@'localhost';
然后应用权限更改并退出MySQL控制台:
1FLUSH PRIVILEGES;
2EXIT;
现在我们已经有了用户和目录,让我们下载并安装SonarQube本身。
步骤 2 - 下载和安装 SonarQube
首先,将当前的工作目录更改为 SonarQube 安装目录:
1cd /opt/sonarqube
然后,转到 SonarQube 下载页面并抓住 SonarQube 7.0 的下载链接. 页面上有两个版本的 SonarQube 可下载,但在这个具体的教程中,我们将使用 SonarQube 7.0。
获取链接后,下载文件:
1sudo wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-7.0.zip
然后删除该文件:
1sudo unzip sonarqube-7.0.zip
一旦提取文件,删除下载的 zip 文件,因为你不再需要它:
1sudo rm sonarqube-7.0.zip
现在所有文件都已经在位,是时候配置SonarQube了。
步骤3 - 配置 SonarQube 服务器
我们需要在 SonarQube 配置文件中编辑一些东西,即:
- 我们需要指定SonarQube服务器将用于数据库连接的用户名和密码。 * 我们还需要告诉SonarQube为我们的后端数据库使用MySQL。 * 我们会告诉SonarQube在服务器模式下运行,这将提高性能。
打开 SonarQube 配置文件:
1sudo nano sonarqube-7.0/conf/sonar.properties
首先,更改 SonarQube 将使用的用户名和密码,以访问您为 MySQL 创建的用户名和密码的数据库:
1[label /opt/sonarqube/sonarqube-7.0/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.0/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 在服务器模式下运行,只听本地地址:
1[label /opt/sonarqube/sonarqube-7.0/conf/sonar.properties]
2
3 ...
4
5 sonar.web.host=127.0.0.1
6 sonar.web.javaAdditionalOpts=-server
一旦这些字段已更新,保存并关闭文件。
接下来,我们将配置 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.0/bin/linux-x86-64/sonar.sh start
11ExecStop=/opt/sonarqube/sonarqube-7.0/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 Sun 2018-03-04 01:29:44 UTC; 1 months 14 days
接下来,配置 SonarQube 服务自动启动:
1sudo systemctl enable sonarqube
与大多数其他Java应用一样,SonarQube将需要一些时间来初始化,一旦初始化过程完成,您可以转到下一步。
步骤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服务器。
步骤5 - 保护 SonarQube
SonarQube 配备了默认管理员用户名和密码 admin . 此默认密码不是安全的,所以我们希望更新到更安全的东西作为一个良好的安全实践。
首先,访问您的安装URL,然后使用默认凭证登录。
一旦登录,请单击管理
选项卡,从下载列表中选择安全
选项,然后选择用户
:
从这里,点击管理员
帐户行右侧的小子,然后点击更改密码
。
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 实例向世界开放,任何人都可以查看分析结果和您的源代码. 此设置非常不安全,因此我们将配置 SonarQube 以仅允许登录用户访问仪表板。
现在我们已经完成了设置我们的服务器,让我们设置扫描仪。
第6步:设置代码扫描仪
SonarQube 的代码扫描器是一个单独的包,您可以安装在运行 SonarQube 服务器的不同机器上,例如您的本地开发工作站或连续交付服务器。
在本教程中,我们将安装代码扫描仪在托管我们的SonarQube服务器的相同服务器上。
首先,为扫描仪创建一个目录,然后更改到新的目录:
1sudo mkdir /opt/sonarscanner
2cd /opt/sonarscanner
然后下载用于 Linux 的 SonarQube 扫描仪使用 wget
:
1sudo wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip
提取扫描仪,然后删除 zip 档案文件:
1sudo unzip sonar-scanner-cli-3.0.3.778-linux.zip
2sudo rm sonar-scanner-cli-3.0.3.778-linux.zip
之后,我们需要修改一些设置以使扫描仪与我们的服务器安装一起工作。
1sudo nano sonar-scanner-3.0.3.778-linux/conf/sonar-scanner.properties
首先,告诉扫描仪它应该在哪里提交代码分析结果. 删除从sonar.host.url
开始的行,并将其设置为您的SonarQube服务器的URL:
1[label /opt/sonarscanner/sonar-scanner-3.0.3.778-linux/conf/sonar.properties]
2 sonar.host.url=https://sonarqube.example.com
保存并关闭文件. 现在让扫描仪二进制可执行:
1sudo chmod +x sonar-scanner-3.0.3.778-linux/bin/sonar-scanner
然后创建一个符号链接,以便您可以拨打扫描仪而不指定路径:
1sudo ln -s /opt/sonarscanner/sonar-scanner-3.0.3.778-linux/bin/sonar-scanner /usr/local/bin/sonar-scanner
现在扫描仪已经设置,我们已经准备好运行我们的第一个代码扫描。
第7步:运行测试扫描
如果你想用 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: 9.834 s
2INFO: ------------------------------------------------------------------------
3INFO: EXECUTION SUCCESS
4INFO: ------------------------------------------------------------------------
5INFO: Total time: 14.076s
6INFO: Final Memory: 47M/112M
7INFO: ------------------------------------------------------------------------
示例项目的报告现在将在 SonarQube 仪表板上如下:
现在你已经确认了SonarQube服务器和扫描仪的正常工作,你可以让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 扫描仪文档以了解如何在本地开发机器上运行分析或作为构建过程的一部分。