CI集成——sonar篇

一、sonar 基础概念?

a. 是一个代码质量分析平台。
b. 通过插件机制,集成不同的测试工具。 (和jenkins 很像)
c. 不只是像jenkins 一样简单显示结果,而是会持续跟踪代码质量的变化.

二、 sonar 结构

sonar 系统整体分为四块。

SonarQube Server

SonarQube Database

SonarQube Plugins

SonarQube Scanner(客户端)

sonar 客户端的调用机制是:现在客户端通过Scanner 进行扫描分析,然后调用server 服务上传分析结果,最后sonar 平台基于插件进行结果展示。

SonarQube Scanner 集成了很多平台和工具,包括以下

Analyzing with SonarQube Scanner

Analyzing with SonarQube Scanner for MSBuild

Analyzing with SonarQube Scanner for Maven

Analyzing with SonarQube Scanner for Gradle

Analyzing with SonarQube Scanner for Ant

Analyzing with SonarQube Scanner for Jenkins

我们集成的是jenkins, jenkins 集成sonar的方式又分为以下几种

SonarQube Scanner

SonarQube Scanner for Maven

SonarQube Scanner for Gradle

SonarScanner for MSBuild

我们使用的是SonarQube Scanner 最基础的方式分析。

三、 jenkins 集成 sonar

3.1 插件

首先需要安装SonarQube Scanner for Jenkins插件。

3.2 基础配置

  • a、安装/配置 SonarQube Scanner 资源包

进入jenkins的[系统管理][全局工具配置] 页面,配置好SonarQube Scanner参数。建议使用自动安装的机制。


sonarQubeScanner配置.png
  • b、SonarQube servers 配置

进入jenkins的[系统管理]-->[系统配置] 页面,配置好SonarQube 服务端的参数。这里注意服务端的配置方式,分为两种。老版本是通过用户名密码关联,新版本是通过token进行关联。token的获取,需要登录sonar平台拿。


sonarQubeServer配置.png

3.3 应用配置

如果project 中要使用sonar,请先关联系统配置中的的sonar服务。无论使用什么方式scanner,这一步都是必须的。


project关联SonarServer.png

至于扫描的方式,由于我们是java maven工程。所以扫描的方式分为两种:maven 集成scanner和 sonarQube Scanner。

  • A、mavne方式

优点:配置简单。

缺点:不灵活,不能动态配置相关参数。

语法:在原maven build 后面添加对应参数

sonar:sonar -Dsonar.host.url=[sonar 服务地址] -Dsonar.login=[sonar 账户API token]

对应配置截图:


sonarQubeMavenConfig.png
  • B、sonarQube Scanner 插件

优点:可以自定义参数。比如需要根据branch 形成不同的分析报告,使用该方式就更加方便

缺点:配置项较多。

其中: sonar.projectKey、sonar.projectName、sonar.language、sonar.sources、sonar.java.binaries都是必须的

同时需要注意,sources和binaries如果有多个用“,”分割。比如一个工程有多个子模块,就需要用“,”进行分割。或者该配置项直接编写多个。

这里需要解释下sonar.projectKey 和sonar.projectName。 projectKey 是在sonar 平台上一个project 的内部唯一标志。projectName 是project 在sonar 平台上显示的名称,仅用来做显示名称,允许重复。sonar 平台通过projetKey来标记是否是同一个project,当一个git 项目需要针对不同分支进行sonar 分析时,靠的就是projectKey的差异去创建。这个会在后面会介绍

sonar.projectKey=$sonarKey
sonar.projectName=$sonarKey
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.sources=$WORKSPACE/cjia-springcloud-user-impl/src/main/java/
sonar.sources=$WORKSPACE/cjia-springcloud-user-api/src/main/java/
sonar.java.binaries=$WORKSPACE/cjia-springcloud-user-impl/target/classes/
sonar.java.binaries=$WORKSPACE/cjia-springcloud-user-api/target/classes/
sonar.test.inclusions=$WORKSPACE/cjia-springcloud-user-impl/src/test/

四、 其他小锦囊

4.1 sonar重启失败

  • A、根据log分析

log 的位置位于 sonaHome的logs文件夹下。有几类日志

access.log / ce.log / es.log / sonar.log / web.log

启动失败,主要查看sonar.log 和web.log 里面的日志即可。sonar.log里面会体现几个重要组件(es、web、ce)的启动结果,三个组件都启动成功,基本上就没问题了。

sonarLog.png
  • B、可能是用户权限问题导致启动失败

sonar.log 在启动时, 会print 一句清空temp 文件的log。

Cleaning or creating temp directory /usr/local/sonarqube-6.7.4/temp

如果sonar 目录所属都是A用户,那么重启时也要用A用户进行重启。不然这个temp 文件会删除失败,导致重启失败。换而言之,启动、停止、重启sonar一定要确保都是同一个服务器账户,否则会出现linux目录权限等问题。

4.2 一个git工程形成不同的sonar project

可能大家会面临这样的需求。一个工程在开发中会有并行的情况,也就是会出现多个并行的dev、release分支,这时就出现了多分支的需求。如何解决这种问题,答案就是通过 sonarQube Scanner基础方式实现。

具体配置:

sonar.projectKey=$sonarKey
sonar.projectName=$sonarKey

请注意,这里的projectKey 和projectName 都是jenkins 内部的自定义环境变量。所以就达到了动态的要求,剩下的问题只用解决变量问题,环境变量注入就相对简单了。

  • A、pre Steps 步骤时 执行 shell

根据shell 得到动态的projectKey,并写入文件。示例代码的逻辑是,根据项目名称+分支的名称为唯一Key,来维护一个sonar project。

#!/bin/sh -x
echo sonarKey="project_name_"${GIT_BRANCH:7}  >propsfile
  • B、 根据文件导入环境变量(inject environment variables 插件)
    使用inject environment variables 插件,导入写有环境变量的文件名 propsfile。如下图
injectEnvVariables.png

4.3 jenkins sonar 集成排除标准模版

sonar.projectKey=sonarKey sonar.projectName=sonarKey
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.sources=WORKSPACE/cjia-springcloud-message-impl/src/main/java/ sonar.sources=WORKSPACE/cjia-springcloud-message-api/src/main/java/
sonar.java.binaries=WORKSPACE/cjia-springcloud-message-impl/target/classes/ sonar.java.binaries=WORKSPACE/cjia-springcloud-message-api/target/classes/
sonar.test.inclusions=$WORKSPACE/cjia-springcloud-message-impl/src/test/

具体排除规则,参看官方文档。
https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/#NarrowingtheFocus-IgnoreFiles

五、 sonar 调整 代码规则

有时候,官方定义的规则确实挺全,挺好。但是不符合国情,所以需要针对规则进行调整。比如规则的禁用、规则等级的修改等。但是内置的规则又不支持修改和编辑,所以rule copy 就能解决这个问题。

少废话,我们先看东西。

这个是内置规则原本的样子,不支持规则的挂起和修改。

sonar_rule_disable2.png

这个就是基于内置规则复制的自定义规则,高贵的挂起按钮终于出来了。:)

sonar_rule_disable.png

怎么实现的?思路十分简单:
1、进入 [host]/profiles 路径,找到你需要copy的内置规则。点击箭头,复制按钮。输入新规则的名称。

如何复制规则
如何复制规则2

2、规则复制完成后,就可以进入coding_rules 代码规则页进行自定义调整了。高贵的挂起按钮终于露出了;点击某条规则,昔日难得一见的规则修改按钮也出现了。

sonar_rule_disable_edit.png
sonar_rule_disable_edit2.png

最后,按照你们的国情去调整规则吧,调整后的规则即可生效。

sonar_rule_disable_edit_finish.png
  • 注意

    1、修改后的规则,在代码规则查询时,可能会出现查询类型错乱。

    在修改过程中我们发现,如果一个规则从主要等级修改为了次要等级。但是该修改的规则,在分类查询中只能通过主要等级的条件查询出来;通过次要等级的查询条件并不能查询出来。如下图:

    sonar_rule_disable_search.png

相关文档:
sonar的官方文档别错过 https://docs.sonarqube.org
sonar 属性配置的文档 https://docs.sonarqube.org/latest/analysis/analysis-parameters/


最后希望我的文字,能给你带来帮忙。如果确实有所收获,帮忙点个赞呗~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容