前言html
但凡一個略有規模的項目都須要一個持續集成環境的支撐,爲何須要持續集成環境,咱們來看一個例子。假如一個項目,由A、B兩位程序員來協做開發,A負責前端模塊,B負責後端模塊,前端依賴後端。A和B都習慣使用SVN做爲代碼管理工具,他們分別開始工做,一個功能完成後會提交到SVN,以便對方可以使用。一天B告訴A,個人某個功能完成了,提交到SVN,你更新下來試一下。A便從SVN更新下來代碼,結果一試,我檫報錯,因而告訴B你的代碼有問題,B檢查了一下確實有問題,而後B通過1個小時修改後,從新上傳到SVN,A更新下來可使用了。又過了幾個小時,A發現B的代碼仍然有問題,B檢查了半天,沒找到問題所在,後來開發組長檢查他們的代碼發現是兩我的使用不一樣版本的jar包致使的,這個問題確認難以發現,A把jar包的版本弄得和B同樣,A和B又開始繼續工做。終於有一天項目完成了,須要發佈程序,這時A從本身的開發環境上編譯一個版本,把他上傳到服務器上,程序運行的前幾天比較穩定,後來A有點急事請假了,但服務器上的程序這時好像出現了問題,這時B只能使用本身的電腦調試、解決問題並試着發一個版本,但由於他平時作後端,對版本發佈不是很熟悉,又搞了半天終於弄好了。項目上線了,穩定運行了半年,後來A、B前後離職了,新來的C負責維護這個項目,儘管A、B在離職前作了一些工做交接,但當C真正接手的時候才發現頭大,我檫竟然註釋都沒寫,有沒有這麼坑的,因爲C開始硬着頭皮看代碼,發現代碼中各類飄逸寫法,各類爲了臨時需求而打的補丁,C幾乎抓狂。前端
以上的例子有點誇大,但或多或少均可能遇到過,咱們須要一種規範來約束這個開發過程,使開發過程嚴格有序的進行。java
從問題出發linux
就以上面這個例子,咱們看其中暴露出了哪些問題:程序員
一、團隊彼此協做不流暢,出現彼此阻塞的狀況;web
二、使用的類庫版本不統一,形成難以估計的風險;spring
三、代碼未經嚴格測試就上傳,形成不斷的返工;apache
四、版本發佈規範欠缺,版本質量不能保證;windows
五、代碼質量低,其餘人難以接手。後端
團隊開發時,咱們經常約定好彼此之間的接口規範,而後開始各自開發,開發完成後,按照接口規範對接起來,這是一個理想的流程,但現實每每不那麼順利,問題經常在於,接口規範可能根據需求變化而常常變動,並且在實際對接時常常發現諸多問題。咱們沒法經過工具來解決這些問題,只能要求開發人員在制定接口規範時,爲可能變動的需求多一些擴展,在開發時多考慮諸多素質,儘可能將減小對接過程當中的問題。下面將講述如何使用Maven和Nexus保證開發人員引用統一的類庫版本,以及如何將本身開發的模塊上傳至Nexus服務器,以提供給其餘模塊引用。
關於Maven和Nexus的搭建在Maven實戰(Maven+Nexus創建私服【Linux系統】)中已經介紹過,在此介紹下主要步驟:
一、下載maven(讀:妹吻)和nexus(讀:耐克色兒絲):
http://maven.apache.org/download.cgi
http://nexus.sonatype.org/downloads/
二、將下載的nexus放置到linux服務器解壓並啓動:
cd /data/program/nexus-2.3.1-01/bin/jswll
選擇本身的系統並進入:
啓動nexus
./nexus start
nexus啓動成功,訪問:http://192.168.6.204:8081/nexus/
三、將下載的maven解壓放置在開發機上(windows),並配置conf目錄下的setting.xml文件:
(1)在<settings><profiles></profiles></settings>節點之間添加配置:
<profile> <id>dev</id> <repositories> <repository> <id>local-nexus</id><url>http://192.168.6.204:8081/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots><enabled>true</enabled> </snapshots> </repository> </repositories> </profile>
接着在<settings></settings>節點之間添加配置:
<activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
以上配置好了鏈接Nexus私服。
(2)安裝eclipse的m2eclipse插件,並配置maven。
m2eclipse的安裝地址:http://m2eclipse.sonatype.org/sites/m2e(安裝過程略)
安裝完成後配置maven:
配置eclipse的maven爲本地下載的maven地址。主要爲了方便配置和版本管理。
至此,nexus和maven就搭建配置完成了,下面咱們要利用這個環境解決兩個問題:
一、不一樣的模塊項目都使用統一的類庫版本;如spring都使用3.1.2.RELEASE,log4j都使用1.2.17。這樣避免由於jar包版本的不一樣,引起的諸多問題。
二、模塊開發完畢後,將編譯的庫文件發佈到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步:
一、本地maven的conf目錄下的setting.xml,在<servers></servers>節點之間添加:
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
二、在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>
三、對maven-support項目進行編譯,並執行發佈命令:
能夠看到maven-support已經成功發佈到nexus私服中:
這樣maven-sample就能夠引用maven-support模塊,而開發maven-support的人則能夠繼續開發,持續發佈新版本。
小結
本文主要介紹maven和nexus的環境搭建,以及怎麼使用maven和nexus統一管理庫文件和版本,怎麼講本身的模塊上傳至nexus私服,供其餘模塊引用。這樣咱們基本解決了兩個問題:
一、團隊彼此協做不流暢,出現彼此阻塞的狀況;
二、使用的類庫版本不統一,形成難以估計的風險;
下一篇將使用jenkins、svn、tomcat以及sonar解決自動化測試、自動化版本發佈、代碼質量檢查等問題。
前言
上一篇隨筆Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持續集成環境(一)介紹maven和nexus的環境搭建,以及如何使用maven和nexus統一管理庫文件和版本,以及怎麼將本身的模塊上傳至nexus私服,供其餘模塊引用。下面將主要介紹如何利用Jenkins、SVN、Tomcat以及Sonar來完成項目的自動化編譯、測試和發佈,以及檢查項目的代碼質量。
利器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和發佈插件。
一、進入「系統管理」——>「系統設置」:
新增maven,將linux上安裝好的maven配置上去。
其餘保持默認配置,保存!
二、進入「系統管理」——>「管理插件」——>「高級」上傳插件
上傳完成以後,jenkins就具有了發佈web應用到tomcat各種容器的能力。
注:deploy.hpi插件是我事先從網上下載好了,你也可使用jenkins自帶的插件安裝功能完成插件安裝,但那個比較慢。
三、配置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下:
注意幾點:
一、WAR/EAR files,必定要填寫相對地址;
二、Manager username、Manager password是你安裝的tomcat用戶名、密碼,若是沒有請經過tomcat的配置文件tomcat-users.xml設置。
三、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整合的方法,能夠再實際工做時進一步研究。
小結
本文主要介紹如何搭建jenkins以及怎麼利用maven、deploy插件打包、發佈你的項目,最後使用jenkins和sonar配合進行項目的代碼質量檢查。完成整個過程咱們能夠發現,以往的測試、打包、發佈、代碼檢查的工做均可以由人工轉化工具來完成,讓程序員的寶貴時間集中在開發上。回過頭看Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持續集成環境(一)開頭的故事,咱們可能會有不一樣的想法。