测试左移
代码审查分类
代码审计关注的质量指标
- 代码坏味道:
代码规范
技术债评估 - bug和漏洞(包括空指针异常、变量初始化只在一个分支里完成初始化、安全漏洞)
- 代码重复度
- 单测与集成
测试用例数量
覆盖率
静态分析技术分类
1.代码静态检查
代码分析:lint系列,通过分析语法树和源代码,检查代码规范;
编译器分析:借助于编译器获得代码关系
2.字节码静态分析
分析jar、war、dex等格式的文件,代表工具:findbugs
SonarQube搭建-docker方式
临时性搭建
- 适合本地练习使用,因为使用的数据库是java自带的内存数据库,不是完整的数据库,性能没有那么快,功能也没有那么完整
docker run -d --name sonarqube -P 9000:9000 -P 9092:9092 sonarquebe
正常部署(适合8.0以上版本)
- sonarqube
- MySQL/PostgreSQL
运行postgresq数据库
docker run -d --name sonarqube_postgres \
-e POSTGRES_USER=sonarqube \
-e POSTGRES_PASSWORD=sonarqube \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v $PWD/postgresql:/var/lib/postgresql/data postgres
创建后面运行sonarqube需要挂载的目录的核心数据及日志
mkdir sonarqube_data sonarqube_extensiions sonarqube_logs
对上面创建的目录进行权限修改(此修改适合8.2版本,最新版本不需要)
chown -R 999:999 sonarqube_data sonarqube_extensions sonarqube_logs \
#由于挂载目录是默认root权限,而docker运行是使用sonarqube用户且内部使用默认用户名分组为999,所以要修改权限
运行sonarqube
docker run -d --name sonarqube_test \
-p 9000:9000 \
-p 9092:9092 \
--link sonarqube_postgres:db \
-e SONARQUBE_JDBC_USERNAME=sonarqube \
-e SONARQUBE_JDBC_PASSWORD=sonarqube \
-e SONARQUBE_JDBC_URL="jdbc:postgresql://db/sonarqube" \
-v $PWD/sonarqube_data:/opt/sonarqube/data \
-v $PWD/sonarqube_extensions:/opt/sonarqube/extensions \
-v $PWD/sonarqube_logs:/opt/sonarqube/logs \
sonarqube
发现有报错
原因:
因为给 Elasticsearch 分配内存的配置问题,解决方法为在宿主机执行:sysctl -w vm.max_map_count=262144
vm.max_map_count 参数,是允许一个进程在 VMA 中拥有的最大数量(VMA:虚拟内存地址, 一个连续的虚拟地址空间),当进程占用内存超过时, 直接 OOM。
由于 Elasticsearch 占用内存较高。官方要求 max_map_count 需要配置到最小 262144。
max_map_count 配置文件写在系统的 /proc/sys/vm 中
通过 docker inspect 命令, 可查看 docker 使用宿主机的 /proc/sys 作为只读路径之一。说明镜像使用宿主机的 max_map_count 参数。因此直接修改宿主机的 max_map_count 参数即可。
SonarQube与Jenkins集成
Sonarqube平台创建project以获取token
- 创建project会设置token,我的token(test: 4939179617ac3543aa4ae93816fb31f9d5168ef3)要记住,便于后续分析代码用
- 以分析maven项目为例
mvn sonar:sonar \
-Dsonar.projectKey=test \
-Dsonar.host.url=http://140.143.160.166:9000 \
-Dsonar.login=4939179617ac3543aa4ae93816fb31f9d5168ef3
- 之后返回sonarqube主页
页面各个菜单详解
Projects:项目列表
Issue:所有暴露的问题
Rules:规则,制定多少个检测代码规则配置
Quality Profiles:规则集另外方式
Qualit Gates:类似断言
Administration:管理员配置
Jenkins配置sonarqube scanner插件
- ManageJenkins > Configure System > SonarQube servers,如下图:
SonarQube+Jenkins+Maven项目分析
1.maven的settings.xml配置sonarscanner相关配置,sonarscanner作为分析代码客户端,需要在maven内配置相关信息。如下图:
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>
http://127.0.0.1:9000 //此处ip为sonarqube所搭建的那台机器的ip
</sonar.host.url>
</properties>
</profile>
</profiles>
2.配置被测maven项目的pom文件
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.4.0.905</version>
</plugin>
3.Jenkins内执行
mvn clean verify sonar:sonar -Dsonar.login=sonar的token
若要单独在项目内执行,则
mvn clean install
mvn sonar:sonar -Dsonar.login=myAuthenticationToken
最后的执行结果:
另:sonarscanner内的sonar-project.properties配置文件一些说明
- sonar.projectName(项目名称,选取Jenkins内置变量JOB_NAME)
- sonar.projectKey(项目唯一标识,自定义)
- sonar.sources(扫描文件夹,当前目录.)
- sonar.java.binaries(扫描Java项目需要排除target目录下内容)