亲手制作SonarQube 4.5.1 RPM包

SonarQube是个独特的质量管理软件,它使得持续检验(continuous inspection)成为可能。

但是最新版本貌似没现成RPM包,在Fedora项目中的那个spec文件比较陈旧,而且是从Java源代码开始构建的,像SonarQube这样的软件本身是36个子项目组成的,其中的依赖关系相当复杂,用到了JRuby版RoR,nodejs,嵌入式的tomcat。用官方的mvn脚本死活都构建不出来,一会儿是某些jar包下载不了,一会儿又是某些子项目的单元测试未通过。所以,想从源码开始构建RPM包显然是毫无必要地给自己选择一个hard模式。

本文描述一个从官方发布的二进制版开始的RPM封装方案。SonarQube使用了JSW wrapper来把Java程序变成一个Unix下的后台程序,本人封装过的ActiveMQ也适用相同的技术。因此,可以说是轻车熟路了。

但是,SonarQube还是很不一样的,它的后台程序设计时没有考虑到按照FHS标准来组织软件的运行时结构。它也没有像ActiveMQ那样区分XXX_BASE和XXX_HOME,使得不变的软件目录和变化的数据目录分离。所以,为了能够用RPM安装,需要把SONAR_HOME目录下的conf,data,web/deploy等目录转移到专门放变化数据的目录。这个目录在FHS的规矩就是/var/lib/sonar。然后,再把原来的目录变成符号链接指向转移后的目录。这样就不需要对于SonarQube做任何修改。

然后,这样的方案又带来次生问题,由于Tomcat默认不会展开符号链接,所以,采用符号链接方案后访问web/deploy下的文件都会返回404错误。这会导致sonar-runner无法提交扫描数据。典型的错误信息如下:

SonarQube Runner 2.4
Java 1.7.0_25 Oracle Corporation (64-bit)
Mac OS X 10.10.1 x86_64
INFO: Runner configuration file: NONE
INFO: Project configuration file: /Volumes/data/work/java/basic/hone/build/tmp/sonarRunner/sonar-project.properties
INFO: Default locale: "zh_CN", source code encoding: "UTF-8"
INFO: Work directory: /Volumes/data/work/java/basic/hone/build/sonar
INFO: SonarQube Server 4.5.1
21:41:20.008 INFO  - Load global referentials...
21:41:20.450 INFO  - Load global referentials done: 444 ms
21:41:20.460 INFO  - User cache: /Users/justin/.sonar/cache
21:41:20.470 INFO  - Install plugins
INFO: ------------------------------------------------------------------------
INFO: EXECUTION FAILURE
INFO: ------------------------------------------------------------------------
Total time: 2.535s
Final Memory: 3M/61M
INFO: ------------------------------------------------------------------------
ERROR: Error during Sonar runner execution
ERROR: Unable to execute Sonar
ERROR: Caused by: Fail to execute request [code=404, url=http://vmcentos66:9000/deploy/plugins/index.txt]
ERROR: Caused by: Fail to download [http://vmcentos66:9000/deploy/plugins/index.txt]. Response code: 404
ERROR:
ERROR: To see the full stack trace of the errors, re-run SonarQube Runner with the -e switch.
ERROR: Re-run SonarQube Runner using the -X switch to enable full debug logging.
:sonarRunner FAILED

 所幸,tomcat可以在context定义中设置allowLinking属性为true来允许符号链接展开:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/" allowLinking="true">
</Context>

 以上XML片段加入到context.xml文件并存放到web目录或war包的META-INF子目录下,tomcat就会识别。对于RPM而言,需要把context.xml作为一个source文件,然后在spec定义该文件并在%install阶段把它拷贝到对应META-INF目录中去。相关的spec源码片段:

Source1: context.xml
...
cp %{SOURCE1} %{buildroot}%{_datadir}/%{short_name}/web/META-INF

 

 完整的代码在本人的github上:https://github.com/schnell18/packaging/blob/master/sonarqube/SPECS/sonarqube.spec

你可能感兴趣的:(Sonar)