使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持續集成環
來源:未知 時間:2021-28-16 瀏覽次數:241次
持續集成環境和持續化構建技術是比較新的IT技術,主要借助于第三方開源組件,持續化構建技術主要解決了大型團開發的協作問題,例如,代碼的沖突,代碼合并,重復的代碼調試與發布,甚至基本的代碼測試,通過將重復的工作利用程序處理以降低開發成本,解放勞動力
一、持續化構建能解決如下問題
1、團隊彼此協作不流暢,出現彼此阻塞的情況;
2、使用的類庫版本不統一,造成難以估計的風險;
3、代碼未經嚴格測試就上傳,造成不斷的返工;
4、版本發布規范欠缺,版本質量不能保證;
5、代碼質量低,其他人難以接手。
二、使用nexus搭建maven本地倉庫:
1、下載maven(讀:妹吻)和nexus(讀:耐克色兒絲):
http://maven.apache.org/download.cgi
http://nexus.sonatype.org/downloads/
2、將下載的nexus放置到linux服務器解壓并啟動:

選擇自己的系統并進入:

啟動nexus
./nexus start

nexus啟動成功,訪問:http://192.168.6.204:8081/nexus/

3、將下載的maven解壓放置在開發機上(windows),并配置conf目錄下的setting.xml文件:
(1)在<settings><profiles></profiles></settings>節點之間添加配置:
接著在<settings></settings>節點之間添加配置:
以上配置好了連接Nexus私服。
(2)安裝eclipse的m2eclipse插件,并配置maven。
m2eclipse的安裝地址:http://m2eclipse.sonatype.org/sites/m2e(安裝過程略)
安裝完成后配置maven:


配置eclipse的maven為本地下載的maven地址。主要為了方便配置和版本管理。
至此,nexus和maven就搭建配置完成了,下面我們要利用這個環境解決兩個問題:
1、不同的模塊項目都使用統一的類庫版本;如spring都使用3.1.2.RELEASE,log4j都使用1.2.17。這樣避免因為jar包版本的不同,引發的諸多問題。
2、模塊開發完畢后,將編譯的庫文件發布到nexus私服上,以便其他模塊引用。
這里說一下maven的一個特性,繼承。簡單來說繼承就是先建立一個父項目,其他項目如果繼承這個父項目,就可以繼承這個項目定義的庫文件及版本。利用這個特性,我們可以讓多個模塊都繼承一個父項目,而在父項目中定義好類庫的版本,這樣所有模塊都使用統一的類庫文件。例如:
建立名為maven-parent的父項目,pom配置為:
<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>com.cnblogs.leefreeman</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<!-- junit -->
<junit.version>4.10</junit.version>
<!-- servlet -->
<servlet-api.version>2.5 </servlet-api.version>
<!-- log4j -->
<log4j.version>1.2.17 </log4j.version>
<!-- commons.codec -->
<commons.codec.version>1.7</commons.codec.version>
<!-- maven-support -->
<maven-support.version>0.0.1-SNAPSHOT</maven-support.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- commons包 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons.codec.version}</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
這個pom定義了一些類庫以及它的版本。
然后再建立模塊項目:maven-sample(web項目)、maven-support(支撐模塊,包括一些工具類以及業務封裝,提供給maven-sample引用)。
maven-sample的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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.cnblogs.leefreeman</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>maven-sample</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
</dependencies>
<build>
<finalName>maven-sample</finalName>
</build>
</project>
maven-support的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>
<parent>
<groupId>com.cnblogs.leefreeman</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>maven-support</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
</dependencies>
</project>
通過以上配置,maven-sample和maven-support引用的jar包,都會使用相同的版本:

接下來我們解決協作開發的問題,maven-support開發完畢之后,將之發布到nexus服務器,以便maven-sample可以引用。我們需要3步:
1、本地maven的conf目錄下的setting.xml,在<servers></servers>節點之間添加:
2、在maven-support項目的pom.xml中,<project></project>節點之間添加:
<!-- 構件部署倉庫 -->
<distributionManagement>
<repository>
<id>releases</id>
<name>發布版本倉庫</name>
<url>http://192.168.0.109:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>快照版本倉庫</name>
<url>http://192.168.0.109:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
3、對maven-support項目進行編譯,并執行發布命令:


可以看到maven-support已經成功發布到nexus私服中:


這樣maven-sample就可以引用maven-support模塊,而開發maven-support的人則可以繼續開發,持續發布新版本。

四、利器Jenkins完成自動部署
Jenkins源于另外一個持續集成工具Hudson,Hudson在oracle收購sun之前,是開源社區在開發和維護,oracle收購sun之后聲明擁有hudson的商標使用權,后來開發hudson的開源力量只能重新起個名字“Jenkins”來繼續開發,原Hudson則由oracle持續維護,但更新速度比較慢。
jenkins地址:http://jenkins-ci.org/
hudson地址:http://hudson-ci.org/
可以看到hudson官網右下角oracle的版權logo。我們這里就使用Jenkins來搭建持續集成環境。
首先從官方上下載jenkins,http://mirrors.jenkins-ci.org/war/ 可以選擇不同的版本。下載完成后放置在服務器某個目錄下,cd到該目錄下,執行:
java -jar jenkins.war
jenkins內置一個jetty容器,默認使用8080端口,如果你的8080被占用了,請執行:
java -jar jenkins.war --httpPort=8081
當然你也可以直接把war包放到tomcat目錄下啟動,這樣jenkins就啟動起來了。

來到這個界面我們先做一個事情:系統配置,主要是配置maven和發布插件。
1、進入“系統管理”——>“系統設置”:
新增maven,將linux上安裝好的maven配置上去。

其他保持默認配置,保存!
2、進入“系統管理”——>“管理插件”——>“高級”上傳插件

上傳完成之后,jenkins就具備了發布web應用到tomcat各類容器的能力。
注:deploy.hpi插件是我事先從網上下載好了,你也可以使用jenkins自帶的插件安裝功能完成插件安裝,但那個比較慢。
3、配置linux服務器上的maven,跟上篇類似你也需要配置linux服務器上的maven,使之連接到nexus私服,以及支持發布模塊到nexus上。
在<settings><servers></servers></settings>節點之間添加:
1: <server>
2: <id>snapshots</id>
3: <username>deployment</username>
4: <password>123456</password>
5: </server>
6: <server>
7: <id>releases</id>
8: <username>deployment</username>
9: <password>123456</password>
10: </server>
在<settings></settings>節點之間添加:
1: <profiles>
2: <profile>
3: <id>dev</id>
4: <repositories>
5: <repository>
6: <id>local-nexus</id>
7: <url>http://192.168.0.109:8081/nexus/content/groups/public/</url>
8: <releases>
9: <enabled>true</enabled>
10: </releases>
11: <snapshots>
12: <enabled>true</enabled>
13: </snapshots>
14: </repository>
15: </repositories>
16: </profile>
17: </profiles>
18:
19: <!-- activeProfiles | List of profiles that are active for all builds. | -->
20: <activeProfiles>
21: <activeProfile>dev</activeProfile>
22: </activeProfiles>
完成這些配置,我們就可以在jenkins上新建項目了。
我們事先在eclipse中開發的三個項目:maven-parent(父項目,用于統一類庫版本)、maven-support(后端模塊,支撐web項目)、maven-sample(web項目,依賴maven-support),依次來添加:

下一步進入后,主要配置兩個地址,svn和maven命令。

根據提示進行SVN用戶名、密碼認證即可。

對于maven-parent項目,我們執行install命令即可。保存!
接著創建maven-support項目,由于該項目是后端模塊,需要發布到nexus服務器上,所以稍有不同:

這里需要執行deploy命令,將該項目發布到nexus上。另外你最好配置該項目構建在maven-paremt執行之后開始:

最好保存!
最好創建maven-sample項目,這是個web項目,配置又稍有不同:

執行package命令將項目打包成war包。下面做最重要的事情:將打包后的war包自動發布到tomcat下:

注意幾點:
1、WAR/EAR files,一定要填寫相對地址;
2、Manager username、Manager password是你安裝的tomcat用戶名、密碼,如果沒有請通過tomcat的配置文件tomcat-users.xml設置。
3、tomcat url為你安裝的tomcat訪問地址。
最后還是設置下構建順序,讓它在maven-support執行完成之后構建:

保存!
jenkins首頁上就出現了三個我們創建好的項目,我們只需要構建maven-parent就可以了,因為我們設置了構建順序:

查看構建信息,可以看到構建的進程,項目先從svn更新下來,然后進行編譯,運行測試用例,打包,發布的過程。整個過程都由jenkins完成,


至此jenkins就實現了自動化編譯、測試(自己寫測試用例)、打包發布、部署。

可以看到tomcat上已經多了maven-sample應用。

部署Sonar
從http://www.sonarqube.org/官網上下載sonar安裝包,解壓到系統目下,進入到bin目錄下,選擇你的系統版本,進入后執行:
./sonar.sh start
sonar就啟動起來了,默認的端口是9000,你也可以到conf/sonar.properties配置文件中修改:
sonar.web.port: 8066

在Jenkins安裝sonar插件
和安裝deploy插件方法類似,我們在系統管理——插件管理中,上傳sonar插件。安裝完成之后,請重啟jenkins。

配置jenkins的sonar插件:
進入系統配置

根據你的情況配置sonar,我這里僅僅修改過sonar的應用端口,所以只需要配置這個,其他保留默認值。
進入特定項目配置sonar:


選擇下maven版本,其他保留默認值。保存!
然后開始構建項目,構建完成后,可以看到該項目的代碼檢查結果已經被導入到sonar平臺上,通過sonar系統就可以方便查看該項目的代碼質量情況:
sonar可以檢查代碼的復雜度、代碼重復、單元測試覆蓋率、是否有注釋、潛在bug等代碼問題,對于sonar的項目介紹,可以進一步去研究摸索,在這里僅介紹jenkins和sonar整合的方法,可以再實際工作時進一步研究。



掃一掃