前言
jenkins集成sonar,今天终于跑通了,回头去看似乎很简单,但是实际的过程依然是充满了曲折,尤其是有些细节问题,时间久了多半还是很容易忘记的,因此决定还是做个记录。
sonar-scanner安装问题
首先,jenkins集成sonar需要安装”SonarQube Scanner for Jenkins”这个插件,插件安装完了之后,需要进行工具的配置,这个配置路径是”系统管理-》全局工具配置-》SonarQube Scanner”。
在这个配置中,需要制定一个sonar的客户端程序,可以直接在jenkins的页面上选择安装,但是我这样操作的时候始终下载不成功,尽管下载源修改了,依旧是没能成功。
于是就只好换了一个方法,去官网下载,即下边这个url:
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
上边url里提供了一些sonar-scanner-cli的下载,但是即便我下载了里边最老的版本,最终发现使用的也是jdk11。
暂时不确定是否能在这种情况下强行使用jdk8,所以我就又去其他网站找到了3.X的版本。
几个关键的配置
上边已经提到了一个配置,即sonarQube-scanner-cli的配置,也就是客户端。
除了客户端之外,还需要配置sonar服务端,配置路径是”系统管理-》系统配置-》SonarQube servers”。
在这个配置里,需要指定sonar服务端的url和请求服务端是的用户凭证,所以还需要一个配置就是token,配置路径是”系统管理-》manage credentials-》添加凭据”。
这里需要注意的是凭据类型要选择secret text,secret就是sonar中的auth token,在sonar页面第一次登陆的时候会提示进行设置。
实际上,这里还有一些细节是需要注意的,否则很可能就会和我一样导致后边的那些问题,这些细节待下边具体问题说到的时候再说。
基本参数
sonar扫描的时候是需要一个基础参数的,可以直接在jenkins中配置,也可以放在项目的配置文件中,我选择的是放在项目的配置文件中,即在项目根目录(pom.xml同级目录)创建sonar-project.properties,里边类容如下:
1 | sonar.projectKey=my:project |
这些配置实际是从网上找来的,目前来说,直接影响运行的是最后两个配置,如果配的不对,将会导致找不到文件。
jenkins pipeline问题
做了sonar的基本配置后,还需要添加触发sonar扫描的步骤,也可以直接在jenkins页面上操作,不过想着这种可能多半不会在正式项目中使用,所以最终我选择了直接在jenkinsFile中增加相应的步骤,代码如下:
1 | stage('Code Analysis'){ |
这里就有一个细节需要注意,这里的”tool name: ‘sonarqube3.3.0’”,从整体代码可以看到最终是获取了一个”sonar-scanner”命令的路径,很显然,这是客户端相关的,所以这里的”sonarqube3.3.0”其实是对应的sonarQube-scanner-cli中配置的那个名字。
而”withSonarQubeEnv(‘sonarqube3.3.0’)”这个实际是sonar服务端配置相关的,主要是和”${SONAR_HOST_URL}”、”${SONAR_AUTH_TOKEN}”这两个变量有关系。
这两个变量也是在系统配置那里配置,然后配置SonarQube servers的时候需要勾选上”Environment variables”。
起初我没有明白这种关系,所以一开始以为都只是随便定义的,于是直接复制的代码没有修改,配置的是”withSonarQubeEnv(‘sonar’)”,结果运行的时候就抛出了如下异常:
1 | ERROR: SonarQube installation defined in this job (sonar) does not match any |
server url问题
在解决了上边的问题后,我依旧运行失败,日志中出现了如下异常:
1 | ERROR: SonarQube server [192.168.19.200:9000] can not be reached |
这个提示相对还是比较清晰的,明确的说了预期url应该是带有”http”或者”https”的,我一开始在”SonarQube servers”中配置的是”192.168.19.200:9000”。
所以这个问题解决起来也很简单,就是在配置的环境变量”SONAR_HOST_URL”里加上协议。
JSONException问题
在解决了上边协议配置问题再运行的时候,还是失败,日志中出现了如下的提示:
1 | Pipeline] End of Pipeline |
这个问题,实际是解决上边问题时留下的坑。
我一开始没有看明白为什么,百度后才知道是因为我在加”http”协议的时候加的有问题,我直接复制了sonar页面上的url,修改”SONAR_HOST_URL”的同时,也修改了”Server URL”,复制的时候多了端口后的斜杠。
最终解决办法就是把”http://192.168.19.200:9000/"改成"http://192.168.19.200:9000"。
成功的结果
经过这些问题的处理后,终于用跑成功了一个集成了sonar的基础pipeline,jenkins运行结果如下:
sonar页面结果如下: