要學Spring,要學svn,要學Jenkins,還要學持續集成,所以自己做了一個簡單的例子與大家分享。
(一) 環境搭建
(1) 安裝JDK
下載JDK並安裝后,設置JAVA_HOME環境變量為:C:\Program Files\Java\jdk1.7.0_02,然后需要將JAVA_HOME\bin加到PATH環境變量中。
(2) 安裝Ant
下載Ant並將其解壓到C盤下,設置ANT_HOME環境變量為:C:\apache-ant-1.8.2,然后將ANT_HOME\bin加到PATH環境變量中。
(3) 安裝SVN
下載VisualSVN Server並安裝后,將C:\Program Files (x86)\VisualSVN Server\bin加入PATH環境變量中。
請注意:以上(1)-(3)中所有軟件的環境變量的設置應根據你自己的安裝路徑做相應的修改。
(4) 安裝Tomcat服務器
下載Tomcat並將其解壓到任意目錄下,筆者的為G:\download\apache-tomcat-7.0.23,執行bin目錄下的startup.bat文件,Tomcat便啟動了,此時你可以在瀏覽器窗口中輸入:http://localhost:8080 ,如果能看到Apache Tomcat頁面,則表示Tomcat運行成功。
(5) 安裝Jenkins
下載Jenkins並將該war文件直接放到Tomcat安裝路徑的webapps下,然后在在瀏覽器中輸入http://localhost:8080/jenkins,如果能看到Jenkins主頁,則表示Jenkins安裝成功。
(6) 下載Spring MVC 3
(二)創建工程
新建spring-mvc-3-walk-through目錄,我們稱此目錄為根目錄,在根目錄下創建original-project子目錄,該目錄用於將原始的工程import到SVN中(見下文),之后便可忽略了。
在original-project下創建war文件夾,在war文件夾下創建index.jsp文件,內容如下:
<html>
<head><title>spring mvc 3 walk through</title></head>
<body>
<h1>Spring MVC 3</h1>
<p>This is my spring mvc 3 tutorial.</p>
</body>
</html>
在war文件夾下創建WEB-INF文件夾,在WEB-INF文件夾下創建lib和classes文件夾,並將下載的spring庫文件(在spring的dist文件夾下)拷到lib文件夾下,事實上對於本例,你不用將spring的庫文件全部拷過來的,但是我為了省事,將它們全拷了。另外將commons-logging.jar, jstl.jar和 junit-3.8.2.jar也拷到lib文件夾下。
在orginal-project下創建src文件夾,並在src下創建com\thoughtworks\davenkin\spring\HelloController.java:
package com.thoughtworks.davenkin.spring;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
public class HelloController implements Controller {
protected final Log logger = LogFactory.getLog(getClass());
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.info("Returning hello view");
return new ModelAndView("hello.jsp");
}
}
該為HelloController添加測試了,在orginal-project下建立test文件夾,在test文件夾下創建com\thoughtworks\davenkin\spring\HelloControllerTests.java:
package com.thoughtworks.davenkin.spring;
import org.springframework.web.servlet.ModelAndView;
import com.thoughtworks.davenkin.spring.HelloController;
import junit.framework.TestCase;
public class HelloControllerTests extends TestCase {
public void testHandleRequestView() throws Exception{
HelloController controller = new HelloController();
ModelAndView modelAndView = controller.handleRequest(null, null);
assertEquals("hello.jsp", modelAndView.getViewName());
}
}
之后在war下創建hello.jsp文件:
<html>
<head><title>spring mvc 3 walk through</title></head>
<body>
<h1>spring mvc 3 walk through</h1>
<p>From HelloController</p>
</body>
</html>
該文件將被HelloController.java調用。
在WEB-INF下創建web.xml文件,在該文件中將注冊spring的DispatcherServlet用於攔截請求:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
</web-app>
同時,在WEB-INF下創建springapp-servlet.xml文件,至於為什么要取這個名字,我想你比我更清楚:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean name="/hello.htm" class="com.thoughtworks.davenkin.spring.HelloController"/>
</beans>
在springapp-servlet.xml中,通過傳統的方式將hello.htm映射到HelloController。
接下來該寫ant腳本了,在orginal-project文件下創建build.properties:
appserver.home=G:/download/apache-tomcat-7.0.23
appserver.lib=${appserver.home}/lib
deploy.path=${appserver.home}/webapps
根據你的Tomcat安裝路徑,以上文件應該做相應的修改。
再在original-project下創建build.xml:
<?xml version="1.0"?>
<project name="spring-mvc-3-walks-through" basedir="." default="usage">
<property file="build.properties"/>
<property name="src.dir" value="src"/>
<property name="web.dir" value="war"/>
<property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
<property name="name" value="spring-mvc-3-walks-through"/>
<path id="master-classpath">
<fileset dir="${web.dir}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${appserver.lib}">
<include name="servlet*.jar"/>
</fileset>
<pathelement path="${build.dir}"/>
</path>
<target name="build" description="Compile main source tree java files">
<mkdir dir="${build.dir}"/>
<javac destdir="${build.dir}" source="1.6" target="1.6" debug="true"
deprecation="false" optimize="false" failonerror="true">
<src path="${src.dir}"/>
<classpath refid="master-classpath"/>
</javac>
</target>
<target name="deploy" depends="build" description="Deploy application">
<copy todir="${deploy.path}/${name}" preservelastmodified="true">
<fileset dir="${web.dir}">
<include name="**/*.*"/>
</fileset>
</copy>
</target>
<target name="deploywar" depends="build" description="Deploy application as a WAR file">
<war destfile="${name}.war"
webxml="${web.dir}/WEB-INF/web.xml">
<fileset dir="${web.dir}">
<include name="**/*.*"/>
</fileset>
</war>
<copy todir="${deploy.path}" preservelastmodified="true">
<fileset dir=".">
<include name="*.war"/>
</fileset>
</copy>
</target>
<property name="test.dir" value="test"/>
<target name="buildtests" description="Compile test tree java files">
<mkdir dir="${build.dir}"/>
<javac destdir="${build.dir}" source="1.6" target="1.6" debug="true"
deprecation="false" optimize="false" failonerror="true">
<src path="${test.dir}"/>
<classpath refid="master-classpath"/>
</javac>
</target>
<target name="tests" depends="build, buildtests" description="Run tests">
<junit printsummary="on"
fork="false"
haltonfailure="false"
failureproperty="tests.failed"
showoutput="true">
<classpath refid="master-classpath"/>
<formatter type="brief" usefile="false"/>
<batchtest>
<fileset dir="${build.dir}">
<include name="**/*Tests.*"/>
</fileset>
</batchtest>
</junit>
<fail if="tests.failed">
Test Failed.
</fail>
</target>
</project>
到此,工程創建好,可以運行ant tests來跑單元測試了。
(三)將工程導入SVN
(1)首先需要建立svn庫(關於svn的使用,請參考筆者的八步學SVN),在項目根目錄(spring-mvc-3-walk-through)下創建repo文件夾來存放svn庫,切換當前目錄到根目錄下,運行:
svnadmin create .\repo
(2)修改svn配置文件,為了方便使用,我們修改repo\conf\svnserve.conf配置文件,找到以下兩行(默認被注釋掉了),取消注釋,並將其改為:
anon-access = write
auth-access = write
這樣你便不用配置svn的用戶名和密碼了。
(3)運行svn服務器,監聽1986端口:
svnserve -d -r .\repo --listen-port=1986
(4)導入original-project工程:
svn import original-project svn://localhost:1986 -m "import project"
(5)現在你便可以check out一份工作拷貝了:
svn checkout svn://localhost:1986 working
我們將工作拷貝check out到了working目錄下,以后便可以在working進行修改提交了。
(四)在Jenkins中新建Job
在瀏覽器中打開http://localhost:8080/jenkins進入jenkins主頁(當然前提是你已啟動Tomcat並已將jenkins的war文件拷到了Tomcat的webapps文件夾下),點擊“新job”,在新頁面中的“任務名稱”中輸入自己job的名字(筆者為spring-mvc3-walk-through),選擇“構建一個自由風格的軟件項目”,點擊“OK”進入job的配置頁面。
在“源代碼管理”中選擇Subversion,並在Repository URL中輸入:http://localhost:1986,這樣jenkins便知道到從什么地方獲取源代碼了,然后在“構建觸發器”中選擇“Poll SCM",並在“日程表”中輸入“* * * * *”,這表示jenkins將每分鍾從svn更新一次代碼,如果有新的提交,便自動觸發構建。
點擊“增加構建步驟”,選擇“Invoke Ant”,在Target中輸入“ant build”,表明我們第一步希望完成build目標,在用相同的方法依次創建“ant tests”和“ant deploy”兩個構建目標,然后點擊保存。
返回jenkins主頁,你便可以看到新建了一個spring-mvc3-walk-through的job,這時你便可以在working目錄下做自己的修改,然后提交,提交后不到1分鍾便能看到該job前的燈在一閃一閃的,表明jenkins正在構建你的項目。(想想為什么是“不到”,而不是之前設置的“恰恰”一分鍾)
如果構建成功,那么燈將變成藍色,否則紅色。