經過幾天的研究,終于實現自動構建部署WEB應用的目標,詳細配置過程記錄如下
一、準備安裝包
jdk1.6.0_26
apache-ant-1.8.2
apache-tomcat-5.5.27
hudson-2.1.0
二、在hudson中配置環境,包括jdk、ant、svn信息等
將hudson-2.1.0拷貝到tomcat/webapps目錄下,啟動tomcat,startup.bat
打開IE在地址欄中輸入
http://localhost:8080/hudson-2.1.0/進入系統管理-》系統設置
JDK環境配置
ANT環境配置
MAVEN環境配置
SHELL命令設置(重要) windows下輸入cmd

MAVEN構建環境配置 ,主要是mvn選擇和目標命令配置

郵件通知配置,用戶默認郵件后綴將加在構建用戶名后面作為郵件地址,以便每次構建郵件通知項目成員

三、在hudson中創建一個新任務,為了配置方便,我們這里選擇自由風格

下面是項目的詳細配置
SCM配置, url中輸入工程代碼倉庫地址,這里涉及到權限驗證,需要輸入用戶和密碼

構建觸發配置,poll scm 采用調度輪詢源代碼庫,配置幫助可以查看輸入框后的幫助
ANT構建配置
首先選擇 Add build step,選擇 Invoke Ant ,然后在ant version中下拉選擇前面配置的ant-1.8.2,targets不是必填項,默認是ant構建default目標 default="deploy"
項目郵箱通知相關干系人, Recipients 為項目負責人,一般填寫經理郵箱,
第一個選項為給所有人發送每一次不穩定的構建
第二個選項為發送給所有與這次構建相關的成員

最后不要忘記點擊Save按鈕保存配置
build.xml
<?xml version="1.0" encoding="utf-8"?>
<project name="category" basedir="." default="deploy">
<property name="lib.dir" value="${basedir}/WebRoot/WEB-INF/lib" />
<property name="src.dir" value="${basedir}/java" />
<property name="build.dir" value="${basedir}/build" />
<property name="app.dir" value="D:\apache-tomcat-5.5.27">
</property>
<property name="runtime.lib" value="${app.dir}\common\lib" />
<property name="deploy.lib" location="${basedir}/deploylib" />
<property name="deploy.dir" value="${app.dir}\webapps" />
<property name="app.url" value="http://localhost:8899/">
</property>
<property name="javac.debug" value="on" />
<property name="javac.optimize" value="off" />
<property name="javac.target" value="1.5" />
<property name="javac.source" value="1.5" />
<condition property="tomcat.open">
<http url="${app.url}" />
</condition>
<condition property="tomcat.close">
<not>
<http url="${app.url}" />
</not>
</condition>
<path id="project.class.path">
<fileset dir="${lib.dir}">
<include name="***.jar" />
</fileset>
<fileset dir="${deploy.lib}">
<include name="*.jar" />
</fileset>
</path>
<target name="init">
<tstamp />
<property environment="env" />
<delete dir="${build.dir}" />
<mkdir dir="${build.dir}" />
</target>
<target name="compaile" depends="init">
<javac srcdir="${src.dir}" destdir="${build.dir}" encoding="utf-8" classpathref="project.class.path" source="${javac.source}" target="${javac.target}" debug="true">
</javac>
<copy todir="${build.dir}">
<fileset dir="${basedir}/src">
</fileset>
<fileset dir="${src.dir}">
<include name="**/*.xml" />
<include name="***.properties" />
</fileset>
</copy>
</target>
<target name="war" depends="compaile">
<copy todir="${basedir}/WebRoot/WEB-INF/classes">
<fileset dir="${build.dir}">
</fileset>
</copy>
<war destfile="${basedir}/${ant.project.name}.war" basedir="${basedir}/WebRoot" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
</war>
</target>
<target name="tomcat-start">
<!-- ALL OK -->
<exec dir="${app.dir}/bin" executable="cmd">
<env path="${app.dir}" key="CATALINA_HOME" />
<env path="${app.dir}\temp" key="CATALINA_TMPDIR" />
<env path="${app.dir}" key="CATALINA_BASE" />
<arg value="/C startup.bat" />
</exec>
<!--
C:\>SCHTASKS /Create /RU SYSTEM /SC ONSTART /TN StartupTomcat /TR "D:\apache-tomcat-5.5.27\bin\startup.bat"
<exec executable="SCHTASKS">
<arg value="/Run"/>
<arg value="/TN"/>
<arg value="startup"/>
</exec>
-->
<!--
<exec executable="${app.dir}/bin/startup.bat" spawn="true" vmlauncher="false">
<env key="CATALINA_HOME" value="${app.dir}" />
<arg line="/c start ${app.dir}/bin/startup.bat" />
</exec>
-->
<!--
<java jar="${app.dir}/bin/bootstrap.jar" fork="true">
<jvmarg value="-Dcatalina.home=${app.dir}"/>
<arg line="start"/>
</java>
-->
</target>
<target name="tomcat-stop" if="">
<!--<exec dir="${app.dir}/bin" executable="cmd">
<env path="${app.dir}" key="CATALINA_HOME" />
<arg value="/c shutdown.bat" />
</exec>
<echo>111</echo>-->
<!--
C:\>SCHTASKS /Create /RU SYSTEM /SC ONSTART /TN ShutdownTomcat /TR "D:\apache-tomcat-5.5.27\bin\shutdown.bat"
<exec executable="SCHTASKS">
<arg value="/Run"/>
<arg value="/TN"/>
<arg value="ShutdownTomcat"/>
</exec>
-->
<java jar="${app.dir}/bin/bootstrap.jar" fork="true">
<jvmarg value="-Dcatalina.home=${app.dir}" />
<arg line="stop" />
</java>
<waitfor maxwait="5" maxwaitunit="second">
<available file="errors.log" />
</waitfor>
</target>
<target name="deploy" depends="war">
<antcall target="tomcat-stop" />
<waitfor maxwait="60000">
<not>
<http url="${app.url}" />
</not>
</waitfor>
<echo>wati for tomcat close</echo>
<delete dir="${deploy.dir}/${ant.project.name}">
</delete>
<copy todir="${deploy.dir}" file="${basedir}/${ant.project.name}.war">
</copy>
<antcall target="tomcat-start" />
</target>
</project>
將build.xml文件放置到工程根目錄下,hudson構建會自動執行ANT
自動部署可以使用catalina-ant.jar中的deploy和undeploy命令,但是這種方式將要在tomcat中反復部署war,最終導致jvm內存不足,所以選擇
shutdown和startup方式來操作tomcat,已達到持續構建的目標
啟動和停止tomcat的方式有多種,其中可以在ant中調用windows計劃任務,具體查看文件中的注釋。
整個配置涉及到啟動2個tomcat,所以需要更改tomcat/conf/server.xml文件中的相關端口,保證2個tomcat端口不沖突
hudson持續構建命令行輸出
