使用 Docker 搭建 SonarQube 代码扫描平台
引言静态代码分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描的技术。它的目的是验证代码是否满足规范性、安全性、可靠性、可维护性的要求。统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。所以使用静态代码扫描技术,在编码阶段发现更多问题是在整个软件开发生命周期中非常关键的一环。针对静态扫描目前有各种各样的工具,比如:Java 语言的 Checkstyle, FindBugs, PMD等,帮助检测代码编写规范上存在的问题和漏洞;Python 语言的 Pyflakes, PyLint, pep8等;C# 语言的 FxCop、StyleCop等。通过这些工具扫描的结果分析后,根据结果来优化代码问题,以提高代码质量。在单独使用以上这些工具时,我们会面临这样的问题:针对包含不同语言的项目,需要不同工具进行扫描,其结果不方便汇总;一段时间内每一次扫描的结果的差异,无法友好的呈现或者追溯。SonarQube就是这样的一个平台,能够支持多种语言的静态代码扫描,也方便维护呈现项目代码的质量状态。
SonarQube介绍SonarQube(Sonar)是一个开源平台,用于管理源代码的质量,它不仅是一个质量数据报告工具,更是代码质量管理平台。它通过插件的形式来管理代码,它支持的语言包括:Java,Python,PHP,C#,C,JS等。关于SonarQube 的架构、基本使用以及与Jenkins的集成我们曾经做过介绍:Jenkins+SonarQube实现Python项目静态扫描:https://mp.weixin.qq.com/s/P08uahvqjqGeEOa7A6b2HgDocker来搭建 SonarQube最新版本的 SonarQube Server(目前最新版本:8.8),已经不支持我们常用的 JDK1.8,并且不支持我们最常用 MySQL 数据库,要想使用欧冠最新版本的 SonarQube使用Docker来搭建是最简单的办法之一了。下面介绍的是如何使用Docker来搭建 SonarQube 代码扫描平台。首先搭建数据库环境:我们使用postgresql 数据库。# 拉取镜像docker pull postgres# 启动容器docker run --name pgdb -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -e POSTGRES_DB=sonar -p 5432:5432 -d postgres注:POSTGRES_USER参数为数据库用户名,其值为sonarPOSTGRES_PASSWORD 参数为数据库密码,其值为sonarPOSTGRES_DB 参数为SonarQube使用的数据库名,其值为sonar搭建 SonarQube Server :我们使用最新版本的SonarQube镜像拉取镜像docker pull sonarqube# 启动容器docker run --name sq -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL=jdbc:postgresql://10.0.0.19:5432/sonar -p 9000:9000 -d sonarqube补充:在初次启动的过程中可能会有这样的报错:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]这是 ElasticSearch 启动的时候报的错误,原因是因为:ElasticSearch用户拥有的内存权限太小,至少需要262144。在 /etc/sysctl.conf 文件最后添加如下语句:vm.max_map_count=262144再输入命令:sysctl -p立即生效为了数据的持久化可以使用-v命令或者docker volume,参考目录:Postgresql:/var/lib/postgresql/data-dSonarQube:/opt/sonarqube/extensions/opt/sonarqube/logs/opt/sonarqube/data为了更方便的网络配置可以使用docker network 动态管理网络# 创建网络network create sonar# 在启动命令中添加参数--network sonar# 修改SonarQube 的数据库连接参数SONARQUBE_JDBC_URL=jdbc:postgresql://pgdb:5432/sonar微信号 : TestOps知乎:@TestOps云层