作者:維唯為為
簡單介紹
Hudson 是一個可擴展的持續集成引擎(Continuous Integration Engine)。主要用於:持續、自動地構建/ 測試軟件項目. 監控一些定時執行的任務;
Sonar 是一個開源的質量管理平台,專注於從項目到類方法的持續的分析和測量技術質量,它把代碼質量相關軟件集成到一起統一管理。
簡單來說:
hudson 是持續、自動地構建/ 測試軟件項目;而sonar 則是持續,自動地統計並分析軟件項目的相關質量數據,例如單元測試的通過率,覆蓋率,代碼的復雜度,代碼的行數等等,用於評估和度量軟件項目質量。
Sonar 是一個開源的代碼質量管理平台,專注於對從項目組合到類方法的持續分析和度量其技術質量,當然你也可以使用開源的插件來擴展Sonar,查看擴展可以訪問 open source plugins forge 。
以下是sonar環境及相關技術的一個關聯圖:
工具說明:
jacoco : is an Open Source and robust code coverage tool , Sonar is delivered with Cobertura plugin but if you prefer JaCoCo you just have to install this plugin and go back to your favorite practice : the test driven development.
第一步.創建數據庫
sornar默認就裝載了Apache Derby ( an Apache DB subproject ) ,所以如果使用 Derby就 不需要安裝;它只是用於演示和測試,在實際應用中還是用外部強健的數據庫,更多詳細見 supported platforms 。
要使用外部數據庫,它要求明確建立 database schema 和 permission ,當第一次啟動sonar 的時候,table 和 index會自動創建,例如設置使用的外部數據庫為 MySql 數據庫,可以用以下腳本:
#
# Create Sonar database and user.
#
# Command: mysql -u root -p < create_database.sql
#
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;
下載地址: extras/database/mysql
注:當創建數據庫時,Character Set 推薦使用utf-8 ,同時校驗規則 Collation 是對大小寫敏感。
第二步.下載安裝sonar
1.下載並解壓它的發行版本 the distribution.
2.如果你使用sonar默認內嵌的Derby數據庫,編輯 conf/sonar.properties文件配置對數據的訪問,這個模板適用於所有支持的數據庫,只需要注釋掉derby專用的前四行,同取消對要引用外部數據庫鏈接的注釋。
原文如下:
If you do not use the default embedded database, edit conf/sonar.properties to configure the database access. Templates are available for every supported database. Just uncomment them and comment the first four lines dedicated to derby.
-
sonar.jdbc.url : the URL of the database
-
sonar.jdbc.driver : the class of the driver
-
sonar.jdbc.user : the username (default value is 'sonar')
-
sonar.jdbc.password : the password (default value is 'sonar')
Example for MySQL :
#sonar.jdbc.url: jdbc:derby://localhost:1527/sonar;create=true
#sonar.jdbc.driverClassName: org.apache.derby.jdbc.ClientDriver
#sonar.jdbc.defaultTransactionIsolation: 1
#sonar.jdbc.validationQuery: values(1)
sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.driverClassName: com.mysql.jdbc.Driver
sonar.jdbc.validationQuery: select 1
第三步.啟動 sonar 應用
啟動 sonar 應用,這里有幾種方式:
Mode 1 - Start the standalone application
編輯conf/sonar.properties文件,
我這里設置的是:
sonar.web.host : 192.168.5.28
sonar.web.port: 9000
sonar.web.context: /sonar
執行以下腳本,啟動sonar服務;
On Linux/Mac OS : bin/<YOUR OS>/sonar.sh start
On MS Windows : bin/windows-x86-32/StartSonar.bat
Read "Install on AIX, HPUX or Solaris" for other platforms
You can now browse to http://localhost:9000.
在瀏覽器中訪問,如圖:
圖2:
Mode 2 - Deploy on JEE Server
sonar應用也可以打包成war布署到JEE server上,支持 Tomcat 5.x, 6.x, 7.x and Jetty 6.x 。
安裝步驟:
1.Edit conf/sonar.properties as described in standalone mode. The file conf/wrapper.conf is never used when deploying to application server.
2.Execute the script build-war.sh (or build-war.bat on MS Windows) from the directory war/
3.Deploy war/sonar.war to the application server
4.Browse to http://localhost/sonar and follow setup instructions
注:sonar要求的最小堆內存大小是512Mb,所以在啟動tomcat之前,通過設置 CATALINA_OPTS,來增加tomcat的memory heap size。如,修改catalina.bat :
set CATALINA_OPTS=-Xmx1024m -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -XX:MaxPermSize=256m
set set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_24
Set JAVA_OPTS=-Xms512m -Xmx256m
Mode 3 - Run as a service on MS Windows
Install/uninstall NT service (may have to run these batch files via "Run As Administrator"):
bin/windows-x86-32/InstallNTService.bat
bin/windows-x86-32/UninstallNTService.bat
Start/stop the service :
bin/windows-x86-32/StartNTService.bat
bin/windows-x86-32/StopNTService.bat
Mode 4 - Run as a service on Linux
The following has been tested on Ubuntu 8.10.
Create the file /etc/init.d/sonar with this content :
#! /bin/sh
/usr/bin/sonar $*
Register Sonar at boot time :
sudo ln -s $SONAR_HOME/bin/linux-x86-32/sonar.sh /usr/bin/sonar
sudo chmod 755 /etc/init.d/sonar
sudo update-rc.d sonar defaults
Running Sonar behind Nginx
我們假設你已經安裝了Nginx, 而sonar的虛擬主機(visual host)是使用 www.somecompany.com 並且sonar服務已啟動,並且對應的 http://sonahost:sonarport/可用.
編輯Nginx配置文件. 將sonar的主機 http://www.somecompany.com/ 包含進來,如下:
# the server directive is nginx's virtual host directive
server {
# port to listen on. Can also be set to an IP:PORT
listen 80;
# sets the domain[s] that this vhost server requests for
server_name www.somecompany.com;
location / {
proxy_pass http://sonarhost:sonarport;
}
}
Nginx configuration is going to vary based on your own application's requirements and the way you intend to expose Sonar to the outside world. If you need more details about Nginx, please see http://nginx.org.
配置多個tomcat
-
下載壓縮版的 tomcat,
-
增加環境變量 CATALINA_HOME2 ,值為新的 tomcat 的地址;增加環境變量 CATALINA_BASE2 ,值為新的 tomcat 的地址。
-
修改新的 tomcat 中的 startup.bat ,把其中的 CATALINA_HOME 改為 CATALINA_HOME2 。
-
修改新的 tomcat 中的 catalina.bat ,把其中的 CATALINA_HOME 改為 CATALINA_HOME2 , CATALINA_BASE 改為 CATALINA_BASE2 。
-
修改 conf/server.xml 文件 , 將已被占用的端口都修改掉。
注:<Connector port="8180" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8543"
URIEncoding="UTF-8" />
Maven環境的安裝
參考:http://maven.apache.org/download.html
Windows 2000/XP
-
解壓apache-maven-3.0.4-bin.zip 到你指定的安裝目錄. 這里默認假設安裝到 C:\Program Files\Apache Software Foundation.
-
添加 M2_HOME = C:\Program Files\Apache Software Foundation\apache-maven-3.0.4. 不要有任何空格或引號. 注: Maven2.0.9以下版本, M2_HOME 的路徑的值最后面不要有 '\' .
-
在同一個對話框中添加環境變量 M2 = %M2_HOME%\bin.
-
可選: 添加環境變量 MAVEN_OPTS = -Xms256m -Xmx512m. =
-
確保存在環境變量 JAVA_HOME = <YOU JDK INSTALL DIRECTORY>\Java\jdk1.5.0_02 以及 %JAVA_HOME%\bin 也被添加到了 Path 環境變量中.
-
打開命令行,運行 mvn --version 確認maven是否正確安裝.
如下圖:
Unix-based Operating Systems (Linux, Solaris and Mac OS X)
-
解壓 apache-maven-3.0.4-bin.tar.gz 到你指定的安裝目錄,這里假設你安裝到 /usr/local/apache-maven.
-
在命令終端添加環境變量 M2_HOME ,例如 export M2_HOME=/usr/local/apache-maven/apache-maven-3.0.4.
-
添加環境變量 M2 ,例如 export M2=$M2_HOME/bin.
-
可選: 添加環境變量 MAVEN_OPTS用來指JVM的屬性, 例如 export MAVEN_OPTS="-Xms256m -Xmx512m".
-
添加M2環境變量 M2 到你的PATH環境變量中, 例如 export PATH=$M2:$PATH.
-
確保JAVA_HOME 正確的配置到了你的 JDK, 例如 export JAVA_HOME=/usr/java/jdk1.5.0_02,並且 $JAVA_HOME/bin 也添加到了你的環境變量 PATH 中.
-
在終端運 mvn --version 確認Maven是否安裝正確.
在maven中配置sonar
全局配置
使用maven的插件讓Sonar執行項目分析是最簡單、使用最廣泛的一種方式,To do so, you should edit settings.xml file, located into $MAVEN_HOME/conf or ~/.m2, and the database parameters to be used as well as the Sonar server URL。
例如:
<settings>
<profiles>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- EXAMPLE FOR MYSQL -->
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>
<!-- optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://localhost:8180/sonar <!—此處填訪問sonar應用的url -->
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
分析一個由Maven構建的項目
分析一個Maven project,首先要在包含了pom.xml 文件的項目目錄下,運行一個maven goal , maven goal的執行要在sonar分析之前執行,maven命令如下:
mvn clean install -Dtest=false-DfailIfNoTests=false
mvn sonar:sonar
或者直接用這個命令:
mvn clean install sonar:sonar -Dmaven.test.failure.ignore=true
如圖:
注:ayyc 是一個maven project , ayyc目錄下包含了pom.xml文件。
分析一個非maven構建的項目
其實,sonar可以分析任何一個Java項目,即使它不是由maven2構建的。當這個項目中配置了可用的xml文件(下面會它的內容格式)以及收集這個項目的信息的sonar應用服務也被被配置好了,那么就可以分析這個項目的代碼了(包括單元測試的代碼)。
首先,安裝 Maven2 (just unzip, define the $MAVEN_HOME property and add $MAVEN_HOME/bin to $PATH)
然后,在你的項目的根目錄下創建一個名為 pom.xml 的文件。pom.xml如下編輯:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>[YOUR.ORGANIZATION]</groupId>
<artifactId>[YOUR.PROJECT]</artifactId>
<name>[YOUR PROJECT NAME]</name>
<version>[YOUR PROJECT VERSION]</version>
<build>
<sourceDirectory>[YOUR SOURCE DIRECTORY]</sourceDirectory>
<outputDirectory>[YOUR CLASSES/BIN DIRECTORY</outputDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<excludes>
<exclude>**/*.*</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<sonar.dynamicAnalysis>false</sonar.dynamicAnalysis>
</properties>
</project>
這些參數代表的意義如下表:
|
Description |
Example |
[YOUR.ORGANIZATION] |
the id of your organization (no space) |
com.myorganization |
[YOUR.PROJECT] |
the id of your project (no space) |
my.project |
[YOUR PROJECT NAME] |
the name displayed into sonar (spaces allowed) |
My Project |
[YOUR PROJECT VERSION] |
the version. Set 1.0 if no specific version. |
1.0 |
[YOUR SOURCE DIRECTORY] |
the relative path to the sources directory |
src/java |
[YOUR CLASSES/BIN DIRECTORY] |
the relative path to the compiled java classes directory |
bin |
執行maven plugin,使用如下命令:
如下圖:
注:在findbugs和sonar light模式下
在sonar light模式下,findbugs會被激活,但是findbugs需要已被編譯好的class文件,才能去找不合符規范的類。在maven項目下,findbugs默認嘗試在target/classes目錄下找; 如果你是用Ant生成的類,那么你需要在pom.xml文件中的"<sourceDirectory> 結點下添加"<outputDirectory>[YOUR CLASSES/BIN DIRECTORY]</outputDirectory>",另外你在還要在"<dependencies>"結點下為findbugs定義aux classpath,配置如下:
<dependency>
<groupId>deps</groupId>
<artifactId>dep1</artifactId>
<version>0.1</version>
<scope>system</scope>
<systemPath>${basedir}/web_app/WEB-INF/lib/struts.jar</systemPath>
</dependency>
如果你少添加了依賴的jar包,就會看到有如下提示信息:
The following classes needed foranalysis were missing:
org.springframework.jdbc.object.StoredProcedure
org.displaytag.decorator.TableDecorator
更多詳細內容請參見:http://docs.codehaus.org/display/SONAR/Analyse+with+Maven
hudson的安裝配置
安裝
第一步:把的hudson.war 包放到tomcat webapps下,然后啟動tomcat
第二步:在瀏覽器中輸入http://hudsonhost:8080/hudson 如果出現正常頁面表示Hudson 已經安裝成功。
第三步:配置hudson,如下圖:
系統消息:可以理解為登錄系統后的歡迎詞,你可以寫點隨意的東西,然后弄個 Logo 圖片什么的,它也支持 HTML 語言。
生成前等待時間:這個值是表示你可以讓你的構建有等待時間,以防止在提交代碼的過程中去開始構建。這里是全局的變量,也可以在每個項目里面去設定。
啟用安全:這里是 hudson 權限的相應設置,如果想對每個用戶進行相應的權限操作,選擇授權策略項下的"項目矩陣授權策略"這個選項就可以進行相應的設置了。
maven、jdk設置:就是取個名字,然后路徑中指定 maven2 的解壓路徑。在這里設置時,去掉自動安裝,直接指定 MAVEN_HOME(依個人設置)即可。
注:選中hudson專有數據庫,才能有用戶注冊的功能。
集成sonar
sonar搭建好后,進入sonar插件的安裝:
1進入Hudson的系統管理->的插件管理,進入"可用插件",選擇sonar( Hudson Sonar Plugin) 插件,在頁面右下角(最下面)點擊安裝,頁面提示成功,重啟hudson ,插件就生效了。如下圖:
2.配置sonar插件,在系統配置頁面找到Sonar,配置sonar的系統信息,如下圖:
3.新建一個hudson Job,配置構建選項,如下圖:
配置項目關聯到sonar,如下圖:
svn服務端的安裝配置
在windows下安裝,首先,下載svn服務端,直接安裝,完成后,配置svn的數據倉庫,如下:
-
創建SVN儲存庫(repository),可以選擇命令行方式或者通過TortoiseSVN插件進行GUI操作,命令行運行:svnadmin create E:\svn\repository 。
-
repository創建完畢后會在目錄下生成若干個文件和文件夾,dav目錄是提供給Apache與mod_dav_svn使用的目錄,讓它們存儲內部數據;db目錄就是所有版本控制的數據文件;hooks目錄放置hook腳本文件的目錄;locks用來放置Subversion文件庫鎖定數據的目錄,用來追蹤存取文件庫的客戶端;format文件是一個文本文件,里面只放了一個整數,表示當前文件庫配置的版本號。
-
打開 svnserve.conf, 找到:
# [general]
# anon-access = read
# auth-access = write
# password-db = passwd
去之每行開頭的#,password-db = passwd第二行是指定身份驗證的文件名,即passwd文件
-
同樣打開 passwd 文件,找到:
# [users]
# harry = harryssecret
# sally = sallyssecret
把這幾行的開頭#字符去掉,這是設置用戶,一行一個,存儲格式為"用戶名 = 密碼"
-
設置服務
安裝服務
sc create subversion_service binpath= "c:\subversion\bin\svnserve.exe --service -r c:\svn_test\repos" displayname= "Subversion Repository" depend= Tcpip
刪除服務
sc delete subversion_service
6.svn目錄設置
trunk——主干:這里存放的是最新穩寫的源碼,權限為項目組長可寫,其它任何人有可讀的權限。
branches——開發分支:這里存放的是各開發中的版本,權限為任何開發人員可寫,其它任何人不可讀。
tags——快照發布版本:這里存放的是臨時發布的版本,權限為任何開發人員可寫,其它任何人不可讀。
developer-resources——開發資源:這里存放的是開發者所需的開發資源,如:各類公用類庫、.jar等。
在eclipse安裝各種插件
將要安裝的插件包中的features與plugins,解壓到<YOUR INSTALL PATH> \Genuitec\MyEclipse 8.5\dorpins\plugin_name目錄下,並在此目錄下建立一個plugin_name.link,文件內容是:
path=<YOUR INSTALL PATH> \Genuitec\MyEclipse 8.5\dorpins\plugin_name
例如安裝svn插件,即可在此目錄下建立一個svn的文件夾,將插件包中的features與plugins,拷到此目錄下,並在此目錄,新建一個svn.link的文件,文件內容是:
path=<YOUR INSTALL PATH> \Genuitec\MyEclipse 8.5\dorpins\svn.link
下載地址:\\192.168.1.201\wap\技術資源共享\sonar\eclipse-plugins,包括:
subclispe,eclipseplugin-checkstyle,sonar eclipse,pmd,m2eclipse
eclipse中的各項配置
sonar的配置
指定sonar server
當安裝好了sonar-eclipse插件后,可以在 Eclipse 全局 Preferences 窗口中看到,編輯后,如下圖:
連一個projects到sonar server
1.在 Package explore 對要連接到sonar server的項目右擊,選擇"Configure -> Associate with Sonar..." :
注:Q: when i go to eclipse configure>associate with sonar says that my groupId is empty?
A: There few things to check:
- Check the groupId is actually there in your pom.xml.
- Check that the artifactId and the eclipse project name are the same.
- Check that you typed groupId and artifactId in the associate with sonar dialog window. Then click find on server.
- Also make sure that the sonar plugin is set up on your eclipse (by going to Windows->Preferences->Sonar).
關聯好后,在項目上點擊右鍵,選擇,如下圖:
sonar分析此項目的情況,如下圖:
在Dashboard標簽下,可以看到ttpod-ayyc的代碼的行數、類的個數、注釋所占百分比等信息。
sonar應用的使用及對項目的分析詳解
更加詳細可查看:http://docs.codehaus.org/display/SONAR/Documentation
sonar server的整體介紹
sonar workspace
The Sonar web site is divided into 3 main areas:
-
"Home" area
-
Project area
-
Configuration area
頂部工具條,如下圖:
左側菜單,當當前的操作針對所有project時,如下圖:
當當前操作一個 project Area時,如下圖:
sonar應用中項目
包括的分析視圖有:
The Dashboard,The Rules Compliance Index (RCI),Design & Architecture,The project Treemap,The Events,Measures Drilldown,Violations Drilldown,Coverage Clouds,Hotspots,Components,Design / DSM,Managing libraries
詳細內容可參考:http://docs.codehaus.org/display/SONAR/Browsing+a+Project
資源查看器
在這個視圖中包括:
coverage:覆蓋率,是通過標注額外的提示信息和不同顏色顯示覆蓋情況,比如,代碼對應的單元測試的條件的覆蓋率。
Violations:違規的,同樣也是通過標注額外的提示信息和不同顏色顯示違規信息
Duplications:重復的,顯示了具體重復的代碼
Dependencies:依賴關系,例舉出了被選中的文件的內向與外向的依賴關系
LCOM4:緊密關系,
source:項目源代碼
Test:單元測試的代碼
sonar的Advanced parameters
這些參數可以在多個地方設置,比如可以在以下地方設置:
-
Global parameters, defined in the UI, will apply to all projects
-
Project parameters, defined in the UI, will override global parameters
-
Project parameters, defined in configuration file, will override the ones defined in the UI
-
Command line parameters, defined at analysis time, will override any parameters
下表列出了sonar的配置參數:具體參看此鏈接 sonar的高級參數。
sonar的第一部份內容,就介紹到此。