欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文来自云计算教程系列,由穿鞋跑得快编译。

介绍

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

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

SonarQube工具包含两个子应用程序:分析引擎,它安装在开发人员的机器上,以及一个用于记录保存和报告的集中式服务器。单个SonarQube服务器实例可以支持多个扫描程序,使用户可以统一集中来自许多开发人员的代码质量报告。

在本教程中,用户通过配置SonarQube服务器和扫描程序来分析并创建代码及质量报告。之后可以使用SonarQube工具扫描机器,对用户的机器进行测试。

准备

在开始阅读本教程之前,你需要遵循以下内容:

  • 一台已经设置好可以使用sudo命令的非root账号、内存为2GB或更多的UGBntu 16.04服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。
  • 在服务器上安装Oracle Java 8,您可以参考 如何在Ubuntu 18.04上安装Java。
  • 对Nginx和MySQL进行配置,您可以参考在CVM上搭建网页服务器(LNMP)。
  • 给Nginx 配置SSL证书,您可以参考如何在Ubuntu上使用SSL来保护Nginx 。
  • 当用户安装SonarQube的服务器时,会有一个完全限定的域名和一个A记录。我们将在本教程中使用sonarqube.example.com

第一步 - 准备安装

在安装SonarQube之前,我们需要执行几个步骤。由于SonarQube是一个将作为服务运行的Java应用程序,并且因为以root用户身份运行服务肯定不理想,我们将专门创建另一个系统用户来运行SonarQube服务。然后我们将创建安装目录并设置其权限并为SonarQube创建一个MySQL数据库和用户。

首先,创建一个sonarqube用户:

$ sudo adduser --system --no-create-home --group --disabled-login sonarqube
复制代码

我们只会使用此用户来运行SonarQube服务,因此我们创建了一个无法直接登录服务器的系统用户。

接下来,创建保存SonarQube文件的目录:

$ sudo mkdir /opt/sonarqube
复制代码

创建目录后,更新权限,以便用户能够读取和写入此目录中的文件:

$ sudo chown -R sonarqube:sonarqube /opt/sonarqube
复制代码

SonarQube版本以压缩格式打包,因此unzip会使用用户的软件包管理器安装该实用程序,以便用户可以提取分发文件:

$ sudo apt-get install unzip
复制代码

接下来,我们需要创建为SonarQube使用的数据库和凭据。作为root用户登录MySQL服务器:

$ mysql -u root -p
复制代码

创建SonarQube数据库:

mysql> CREATE DATABASE sonarqube;
mysql> EXIT;
复制代码

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

mysql> CREATE USER sonarqube@'localhost' IDENTIFIED BY 'some_secure_password';
mysql> GRANT ALL ON sonarqube.* to sonarqube@'localhost';
复制代码

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

mysql> GRANT ALL ON sonarqube.* to sonarqube@'localhost';
复制代码

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

mysql> FLUSH PRIVILEGES;
mysql> EXIT;
复制代码

当我们已经有了用户和目录,即可下载并安装SonarQube。

第二步 - 下载和安装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。

第三步 - 配置SonarQube服务器

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

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

首先打开SonarQube配置文件:

$ sudo nano sonarqube-7.0/conf/sonar.properties
复制代码

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

...sonar.jdbc.username=sonarqubesonar.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.1sonar.web.javaAdditionalOpts=-server
复制代码

更新这些字段后,保存并关闭该文件。

接下来,我们将SonarQube服务器配置为作为服务运行,以便在服务器重新启动时自动启动。

创建服务文件:

$ sudo nano /etc/systemd/system/sonarqube.service
复制代码

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


[Unit]
Description=SonarQube service
After=syslog.target network.target[Service]
Type=forkingExecStart=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh start
ExecStop=/opt/sonarqube/sonarqube-7.0/bin/linux-x86-64/sonar.sh stopUser=sonarqube
Group=sonarqube
Restart=always[Install]
WantedBy=multi-user.target
复制代码

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

$ sudo service sonarqube start
复制代码

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

$ service sonarqube status
复制代码

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

● sonarqube.service - SonarQube serviceLoaded: loaded (/etc/systemd/system/sonarqube.service; enabled; vendor presetActive: active (running) since Sun 2018-03-04 01:29:44 UTC; 1 months 14 days
复制代码

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

$ sudo systemctl enable sonarqube
复制代码

与大多数其他Java应用程序一样,SonarQube将需要一些时间来初始化。初始化过程完成后,您就可以继续下一步了。

第四步 - 配置反向代理

我们已经运行了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
复制代码

要进行快速测试,可以在浏览器中访问http://sonarqube.example.com。打开后你将看到SonarQube界面的欢迎语。

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

第五步 - 保护SonarQube

SonarQube附带了一个默认的管理员用户名和密码管理员。此默认密码不安全,因此我们希望将其更新为更安全的安全做法。

首先访问安装的URL,然后使用默认凭据登录。

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

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

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

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

最后,你可能会注意到SonarQube实例对全世界都是开放的,任何人都可以查看分析结果和源代码。 此设置非常不安全,因此我们将SonarQube配置为仅允许登录用户访问界面。在同一管理选项卡中,单击配置,然后单击左窗格中的安全性。翻转此页面上的开关以要求用户身份验证。

现在我们已经完成了服务器的设置,让我们设置扫描仪。

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

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

在本教程中,我们将在托管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.propertiessonar.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
复制代码

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

第七步 - 运行测试扫描

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

$ 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分析您的代码。

将项目转移到服务器,或按照第六步中的步骤在工作站上安装和配置SonarQube扫描仪,并将其配置为指向SonarQube服务器。

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

$ nano sonar-project.properties
复制代码

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

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

                                 sonar-project.properties# Unique ID for this projectsonar.projectKey=foobar:hello-world...
复制代码

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

                                 sonar-project.properties...sonar.projectName=Hello World Projectsonar.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维护代码质量的同时,数据安全也很重要,如果您的服务器是在生产环境使用, 建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。

更多Linux教程请前往腾讯云+社区学习更多知识。

问答

MongoDB的利弊?

相关阅读

Redis云端架构深入浅出

腾讯云数据库回档解决方案

世界杯黑马出没,莫斯科没有眼泪

云学院 · 课程推荐 | 腾讯专项技术测试组长,结合8年经验为你细说冷热分离法则

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区!

我的老板给我推送了这篇文章,之后我成为了顶级码农!相关推荐

  1. 织梦百度快速收录及神马mip推送插件-支持指定文章id批量推送及采集后推送

    织梦快速收录及神马MIP推送插件介绍 1.站长们发现百度搜索资源平台把链接提交"的功能改为"普通收录",同时新增了"快速收录"的功能. 2.快速收录有 ...

  2. php推送示例mip,WordPress文章页如何自动推送提交MIP/AMP页面 | 小灰灰博客

    如果是安装 AMP 插件实现的 AMP 页面或者 MIP 页面,那么文章的 AMP 地址是在文章原地址后面加后缀 /amp,页面的 AMP 地址是在页面原地址后面加后缀 ?amp ,MIP 的则加相应 ...

  3. php ftp a站到b站,phpcmsv9在做推送中将a站文章内容完美的推送b站点下

    在官方源码中,A站推送B站只送出一个没有内容部分的站外连接. 以下代码是,推送全部内容. 注意事项: 1.要将当前站点下的文章内容推送到另一个站点下,即:content字段的值,默认情况下此conte ...

  4. php公众号批量推送,微信公众号文章如何批量发送给指定的用户

    微信公众号文章如何批量发送给指定的用户 导读:小编根据大家的需要整理了一份关于<微信公众号文章如何批量发送给指定的用户>的内容,具体内容:微信公众号的文章群发的时候,会发给所有的用户,但是 ...

  5. 带桌面推送Ai智能客服系统在线客服源码

    安全防护:系统强力加固,有效防止黑客入侵 国际化多语言:中文简体.繁体.英文.越南语.印尼语.俄语.泰语.日语.韩语.西班牙语.法语. 德语.意大利语.阿拉伯语.葡萄牙语.丹麦语等二十种语言.支持一键 ...

  6. 如何避开精准算法推送的新闻或文章呢?

    回答这个问题之前,我们可能需要了解为什么会出现精准推送这些文章: 楼主强调网站采用大数据分析精准投放广告,实际上大部分网站只是利用了一个很早就存在的小功能:cookie 如果您想要基于浏览器屏蔽这些文 ...

  7. [自制工具]实现自动推送Hexo博客文章至百度

    写在前面 我们在博客发布文章时,总是希望百度能尽快收录我们的文章,但是如果傻傻等百度爬虫爬到我们这种小站点的文章--不知道要等到何年何月= =基于此,百度站长平台提供了主动推送文章至百度的接口.但是这 ...

  8. 现代IM系统中消息推送和存储架构的实现

    摘要: 前言 IM全称是『Instant Messaging』,中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉.微信.QQ等以IM为核心功能的产品 ...

  9. 物联网设备数据流转之告警信息推送:TDengine-alert

    背景 前面关于 TDengine 的使用,我们只涉及到 Server 端与 Client 端,除此之外,官方还有一个报警模块,用以根据用户定义的规则实现近实时的报警监测. 从开始到现在,我们一直在喊口 ...

最新文章

  1. OneFlow 并行特色
  2. 架构师速成-架构目标之可用性
  3. extern C的主要作用简单解释
  4. python向数据库传输数据时弹出not enough arguments for format string怎么办
  5. nio java 内核拷贝_大文件拷贝,试试NIO的内存映射
  6. OpenCV-信用卡数字识别-03
  7. 微软 .net 你更新这么快IDE vs2015 、语法糖 6.0、framework、‘吹得这么牛,然并用...
  8. Spring_AOP架构介绍与源码分析(含事务深度分析)
  9. Magicodes.IE之导入导出筛选器
  10. ElastciSearch简单总结(笔记)
  11. HAN - Heterogeneous Graph Attention Network 异构图注意力网络 WWW2019
  12. 求序列中第k大的元素(划分树模板)
  13. 如何使用cmd进入打印机选项_用命令添加打印机
  14. Vue使用阿里矢量图标库
  15. 自动化专业向往硬件方面靠,有什么好的建议?
  16. CPA七--应交增值税(转载)
  17. 大学计算机试题深圳大学,深圳大学期末考试试卷参考答案.doc
  18. ecshop+ectouch LANP伪静态
  19. Python 史上最全第三方库收集(第二弹)
  20. 计算机网络>速率、带宽、吞吐量

热门文章

  1. 亲密关系-【认知情绪】-每一次生气的背后有什么
  2. “支付功能”怎么测试?
  3. mysql 告警 异常 处理_mysql异常解决方案 - Lock wait timeout exceeded异常
  4. mysql复购率_MYSQL系列(5) 电商常用指标查询
  5. 安装 mysql 数据库_小水谈Mysql数据库---Mysql安装
  6. linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx
  7. Python基础知识 D9
  8. 【java】创建一个窗口,统计输入内容
  9. java火币网做接口_火币网API文档——Websocket 请求与订阅示例
  10. 计算机组成原理课设参考文献,计算机组成原理课程设计(全)..doc