ci&ant
自己两个多星期以来对持续集成的概念和应用有了一些了解。下面主要对自己配置持续集成的环境进行总结。(看上去简单,但是对我开始对持续集成都没什么了解的人来说确实费了不少周折)
一 本次持续集成环境的搭建所使用的工具有
cruisecontrol、ant、svn、junit、Slik-Subversion-1.5.6-win32、svnant-1.1.0-RC2.zip
cruisecontrol:是一种持续集成过程的框架,包括了邮件通知,ant 和各种源码控 制工具的插 件。并提供了web接口,用于查看当前和以前的创建的结果.
ant:构建工具。
svn:版本控制工具。
junit:单元测试工具。
slik-subversion:是为了调用svn的客户端命令安装的。
svnant:主要是用到它里面的lib中的jar包,它具体使用还不是很清楚
另外本次的辅助环境还有jdk,相信大家都再也熟悉不过了。
二 环境的搭建步骤:
jdk的安装:根据jdk安装包的提示安装jdk。设置系统的环境变量:
a) JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:\java\jdk1.5.0_08,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat都需要依赖此变量);
b) Path使得系统可以在任何路径下识别java命令,设为%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
c)CLASSPATH为java加载类(class or lib)路径,只有类在 classpath中,java命令才能识别,设为:.;JAVA_HOME\lib\dt.jar;JAVA_HOME% \lib\tools.jar (要加.表示当前路径);%JAVA_HOME%就是引用前面指定的JAVA_HOME;不过本人还是比较相信绝对路径的。
2 ant的安装:ant是集成构建工具,想必大家都不太陌生了。只需要到ant.apache.org的网站下载ant的适当版本解压缩后,配置系统的环境变量:ANT_HOME:d:\apache-ant-1.7.0, path:d:\apache-ant-1.7.0\bin 后,ant就可以在任意目录下运行了,如cmd下运行ant,显示:buildfile:build.xml does not exsit。。。。。
3 安装svn,因为cruisecontrol要用到svn(不知道这两个有什么先后顺序没,因为cc要用svn就先装cc喽)。svn的安装TortoiseSVN-1.5.3.13783-win32-svn-1.5.2.msi安装提示装就可以了。
4 安装tomcat ,设置系统环境变量CATALINA_HOME=c:\tomcat,CLASSPATH=C:\tomcat\common\lib(加载必要的包)。
5 cuisecontrol的安装,因为本文使用的操作系统为XP,就使用CruiseControl-2.8.2.exe安装就可以了(.exe文件还是很受大家喜欢的)。配置系统的环境变量:CC_HOME=d:\cruisecontrol
6 安装slik-subversion,它会自动写入到path=D:\SlikSvn\bin\ 如果没有写入的话,要麻烦手动加入到系统的环境变量path中,本人曾经遇到过,cmd窗口已经打开但是配置文件执行过程中svn的命令总不能识别发现此处的路径没有加入到path中。
7下载svnant-1.1.0-RC2.zip,把lib包中的jar考到ant的jar中。
三 以上的准备工作已经基本搞定,下面就介绍一下配置文件。此次环境的搭建配置文件是很关键的,因为他们各自有自己的标签,所以还要想达到什么功能慢慢查找,(如果有时间系统学习一下就好了)。
1 ant的关键文件为build.xml(当然也可以起别的名称,自己还要改它的启动文件,就用这个名称吧)下面是一个实例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
定义basedir当前的根目录,default默认执行的标签,name工程名
<project basedir="." default="all" name="framework">
<property environment="env" />
定义tomcat的安装目录
<property name="TOMCAT_DIR" location="D:/Tomcat 5.5" />
定义debug的级别
<property name="debuglevel" alue="source,lines,vars" />
为了引用tomcat固有包方便所以增加次属性
<property name="coolink.dist.path" location="D:/Tomcat 5.5/webapps/txsd/WEB-INF" />
指定要编译的工程目录
<property name="CLASS_DIR" location="D:/CruiseControl/projects/framework" />
<property name="target" value="1.5" />
<property name="source" value="1.5" />
编译时候所使用的类路径,id为引用的名称
<path id="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath">
<pathelement location="${TOMCAT_DIR}/common/lib/commons-el.jar" />
....
<pathelement location="${TOMCAT_DIR}/common/lib/servlet-api.jar" />
</path>
<path id="Web App Libraries.libraryclasspath">
<pathelement location="${coolink.dist.path}/lib/activation.jar" />
.............
<pathelement location="${coolink.dist.path}/lib/xmlParserAPIs.jar" />
</path>
<path id="ant.svn.classpath">
<fileset dir="D:/CruiseControl/apache-ant-1.7.0/lib">
<include name="*.jar" />
</fileset>
</path>
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask">
<classpath refid="ant.svn.classpath" />
</taskdef>
<path id="txsd.classpath">
<path refid="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath" />
<path refid="Web App Libraries.libraryclasspath" />
</path>
clean操作,如果build之前不执行此操作,build检查到原有的class文件就不再编译。
<target name="clean">
<delete file="${CLASS_DIR}/longcon-framework.jar" />
<delete dir="target" quiet="true" />
<delete dir="${CLASS_DIR}/source/classes" />
</target>
要build模块的名称build-framework看来可以随便起名字,但是有人说必须和模块名称一致,至今还不知道为什么
<target name="build-framework">
<echo message="${ant.project.name}: ${ant.file}" />
<mkdir dir="${CLASS_DIR}/source/classes" />
<copy includeemptydirs="false" todir="source/classes">
<fileset dir="${CLASS_DIR}/source" excludes="**/*.launch, **/*.java" />
</copy>
<javac debug="true" debuglevel="${debuglevel}" destdir="${CLASS_DIR}/source/classes" source="${source}" target="${target}" encoding="UTF-8">
<src path="${CLASS_DIR}/source" />
<exclude name="**/.svn/**" />
<classpath refid="txsd.classpath" />
</javac>
</target>
单元测试的部分
<target name="test">
<mkdir dir="target/test-classes" />
<javac encoding="UTF-8" srcdir="${CLASS_DIR}/test" destdir="target/test-classes">
<classpath>
<pathelement location="${CLASS_DIR}/source/classes" />
<path refid="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath" />
<path refid="Web App Libraries.libraryclasspath" />
</classpath>
</javac>
<mkdir dir="target/test-results" />
<junit haltonfailure="no" printsummary="on">
<classpath>
<pathelement location="${CLASS_DIR}/source/classes" />
<pathelement location="${coolink.dist.path}/lib/junit.jar" />
<pathelement location="target/test-classes" />
</classpath>
<formatter type="brief" usefile="false" />
<formatter type="xml" />
<batchtest todir="target/test-results">
<fileset dir="target/test-classes" includes="**/*.class" />
</batchtest>
</junit>
</target>
打包放到指定目录
<target name="jar">
<jar destfile="${CLASS_DIR}/longcon-framework.jar" encoding="UTF-8" update="false" excludes="**/*Test*.class">
<fileset dir="${CLASS_DIR}/source/classes" />
</jar>
<copy includeemptydirs="false" todir="${coolink.dist.path}/lib">
<fileset file="${CLASS_DIR}/longcon-framework.jar" excludes="**/*.launch, **/*.java" />
</copy>
</target>
调用svn命令,这与三中的步骤7有密切的联系
<target name="commit">
<svn username="aaa" password="aaa">
<commit file="${coolink.dist.path}/lib/longcon-framework.jar" message="${msg.commit}" />
</svn>
</target>
<target name="all" depends="clean,build-framework,jar,commit"/>
</project>
注释:
a设置编译所需要的类路径可以用: <classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
<dirset dir="build">
<include name="apps/**/classes"/>
<exclude name="apps/**/*Test*"/>
</dirset>
<filelist refid="third-party_jars"/>
</classpath>
b <target name="test" depends="clean">depends表示依赖关系
2 cruisecontrol的config文件,CC启动的时候会自动寻找此文件,当然你可以通过修改启动文件修改config.xml名称,只要两处一致就能找到,下面是一个config文件的实例:
<cruisecontrol>//cc的固有标签,cc中可以有多个project
<project name="framework">// 工程名称
<plugin name="labelincrementer" classname="net.sourceforge.cruisecontrol.labelincrementers.SVNLabelIncrementer"/>
<labelincrementer workingcopypath="projects/${project.name}"/> // 显示svn的版本号
listeners:监听器,来报告cc的此项目的运行信息
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt" />
</listeners>
bootstrappers从svn源码控制程序更新本地版本,据说还有向其它插件提供当前创建的状态
<bootstrappers>
<svnbootstrapper localWorkingCopy="projects/${project.name}" username="luojing" password="luojing" />
</bootstrappers>
<bootstrappers>//向ant提供当前信息
<antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="jar" />
</bootstrappers>
<modificationset quietperiod="30">// 通过svn更新原代码
<!-- touch any file in connectfour project to trigger a build -->
<svn localWorkingCopy="projects/${project.name}" username="luojing" password="luojing" />
</modificationset>
<schedule interval="28800">设定检查编译build版本的时间单位s
<ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" />
</schedule>
<log>//显示单元测试信息
<merge dir="projects/${project.name}/framework/target/test-results" />
</log>
<publishers>//发布版本
<onsuccess>//成功,并生成有时间戳的目录
<artifactspublisher dest="D:/CruiseControl/artifacts/${project.name}" file="projects/${project.name}/longcon-framework.jar" />
</onsuccess>
<onfailure>//失败发送邮件到响应的人员
<htmlemail buildresultsurl="http://localhost:8080/cruisecontrol/buildresults/${project.name}" mailhost="邮件服务器" password="密码" username="用户名" defaultsuffix="@**.com.cn" returnname="PetClinic Continuous Integration" returnaddress="sunny@**.com.cn" charset="UTF-8" skipusers="true" xsldir="webapps/cruisecontrol/xsl" css="webapps/cruisecontrol/css/cruisecontrol.css">
<always address="接收邮件方的邮箱" />
</htmlemail>
</onfailure>
</publishers>
</project>
<project name="site">
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt" />
</listeners>
<bootstrappers>
<svnbootstrapper localWorkingCopy="projects/${project.name}" username="sunny" password="sunny" />
</bootstrappers>
<bootstrappers>
<antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="jar" />
</bootstrappers>
<modificationset>//设置只有framework工程成功了才执行此次的操作,体现了project的依赖关系
<buildstatus logdir="logs/framework"/>
</modificationset>
</project>
</cruisecontrol>
四 启动CC可以实现集成编译、集成构建、单元测试的功能,对于持续构建这是最简单不过了,要继续努力学习哦。
五 持续集成使用了一段时间发现了源代码目录总是不能自动更新,认真查找发现是因为自己对标签<svnbootstrapper>的理解不正确,现在就是在ant的build.xml中调用svn的提交命令来解决的,不知道思路是否正确,请大家指教。
下面就更清晰的介绍一下常用的标签把。
CC配置文件范connectfour范例Config.xml如下:
<cruisecontrol>
<project name="connectfour">
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>
<bootstrappers>
<antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="clean" />
</bootstrappers>
<modificationset quietperiod="30">
<!-- touch any file in connectfour project to trigger a build -->
<filesystem folder="projects/${project.name}"/>
</modificationset>
<schedule interval="300">
<ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
</schedule>
<log>
<merge dir="projects/${project.name}/target/test-results"/>
</log>
<publishers>
<onsuccess>
<artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
</onsuccess>
</publishers>
</project>
</cruisecontrol>
<cruisecontrol>根元素是<cruisecontrol>,该元素很简单,没什么需要配置的属性。
目前CC支持多项目(multiproject),因此可以有多个并行的<project>元素。支持的子元素包括:
<project>
<property/>
<plugin/>
<dateformat/>
<labelincrementer/>
<listeners>
<cmsynergysessionmonitor/>
<currentbuildstatusftplistener/>
<currentbuildstatuslistener/>
<currentbuildstatuspagelistener/>
<lockfilelistener/>
</listeners>
<bootstrappers>
<accurevbootstrapper/>
<alienbrainbootstrapper/>
<antbootstrapper/>
<clearcasebootstrapper/>
<clearcaseviewstrapper/>
<cmsynergybootstrapper/>
<currentbuildstatusbootstrapper/>
<currentbuildstatusftpbootstrapper/>
<cvsbootstrapper/>
<execbootstrapper/>
<gitbootstrapper/>
<harvestbootstrapper/>
<lockfilebootstrapper/>
<mercurialbootstrapper/>
<p4bootstrapper/>
<plasticscmbootstrapper/>
<snapshotcmbootstrapper/>
<starteambootstrapper/>
<surroundbootstrapper/>
<svnbootstrapper/>
<tfsbootstrapper/>
<vssbootstrapper/>
</bootstrappers>
<modificationset>
<accurev>
<alienbrain/>
<alwaysbuild/>
<buildstatus/>
<clearcase/>
<cmsynergy/>
<compound>
<targets/>
<triggers/>
</compound>
<cvs/>
<darcs/>
<filesystem/>
<forceonly/>
<git/>
<harvest/>
<httpfile/>
<mavensnapshotdependency/>
<maven2snapshotdependency/>
<mercurial/>
<mks/>
<p4/>
<plasticscm/>
<pvcs/>
<snapshotcm/>
<starteam/>
<store/>
<surround/>
<svn/>
<tfs/>
<timebuild>
<ucm>
<veto/>
<vss/>
<vssjournal/>
</modificationset>
<schedule>
<ant/>
<maven/>
<maven2/>
<pause/>
<nant/>
<phing/>
<rake/>
<exec/>
<composite/>
</schedule>
<log>
<merge/>
<gzip/>
<delete/>
</log>
<publishers>
<antpublisher/>
<artifactspublisher/>
<clearcasebaselinepublisher/>
<cmsynergybaselinepublisher/>
<cmsynergytaskpublisher/>
<compoundpublisher/>
<currentbuildstatuspublisher/>
<currentbuildstatusftppublisher/>
<email/>
<execute/>
<ftppublisher/>
<htmlemail/>
<http>
<jabber/>
<onfailure/>
<onsuccess/>
<rss/>
<sametimeannouncement/>
<scp/>
<sfeedocman/>
<sfeefrs/>
<sfeetracker/>
<socket/>
<weblog>
<x10/>
<xsltlogpublisher/>
<yahoopublisher/>
</publishers>
</project>
子元素过多所以详情可以参看官方文档的说明。
这里只介绍几个常用的子元素:
<bootstrappers>:<bootstrappers>在创建之前会运行,相当于一个预处理的作用,<bootstrappers>下面每个子元素都是独立的,因此可以同时配置多个bootstrappers。
CC提供的bootstrappers包括两种,一种用于向其他插件提供项目当前创建的状态,还有一种是从某个源码控制系统更新本地文件,其中最常用的就是<currentbuildstatusbootstrapper>和<svnbootstrappers>。<currentbuildstatusbootstrapper>指定了状态文件的位置,主要是用来访问项目当前创建的状态,CC的<currentbuildstatusbootstrapper>会将创基爱你的状态写入这个文件。
<svnbootstrapper>的作用有点难理解,因为我们每次项目的创建都应该基于最新的代码,因此在创建之前就要获得最新的项目文件,如果使用的是ant来完成这个任务,那么buildfile本身在创建开始之前发生了变化,我们是不是应该先更新这个buildfile,然后才通过buildfile来对项目进行构建呢?<svnbootstrapper>就是为从源码控制系统更新buildfile文件而设计的(还有一种替代的使用方法是使用wrapper buildfile,这样就不用使用<svnbootstrapper>了,wrapper buildfile也是推荐的方法,<modificationset>部分会进行详细的讨论)。
<modificationset>:包括了SourceControl插件的配置信息,用于检查各个源码控制系统中是否发生变化,<schedule>会用到这里的配置信息,如果检测到变化,会触发创建过程。
<modificationset>的属性quietperiod(单位为秒)定义了一个时间值。如果CC检查到了变化,会自检查到变化的源码控制系统的最后一次check in 的时间开始等待,等待时间由quietperiod决定,等待结束之后才触发创建(build)过程,主要是防止有人在check in的过程当中就触发创建过程(可能check in只做了一半,这个时候触发创建显然是不正确的).
下面是一个modificationset的例子:
<modificationset quietperiod="30">
<svn localworkingcopy="projects/SFA"/>
</modificationset>
一 本次持续集成环境的搭建所使用的工具有
cruisecontrol、ant、svn、junit、Slik-Subversion-1.5.6-win32、svnant-1.1.0-RC2.zip
cruisecontrol:是一种持续集成过程的框架,包括了邮件通知,ant 和各种源码控 制工具的插 件。并提供了web接口,用于查看当前和以前的创建的结果.
ant:构建工具。
svn:版本控制工具。
junit:单元测试工具。
slik-subversion:是为了调用svn的客户端命令安装的。
svnant:主要是用到它里面的lib中的jar包,它具体使用还不是很清楚
另外本次的辅助环境还有jdk,相信大家都再也熟悉不过了。
二 环境的搭建步骤:
jdk的安装:根据jdk安装包的提示安装jdk。设置系统的环境变量:
a) JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:\java\jdk1.5.0_08,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat都需要依赖此变量);
b) Path使得系统可以在任何路径下识别java命令,设为%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
c)CLASSPATH为java加载类(class or lib)路径,只有类在 classpath中,java命令才能识别,设为:.;JAVA_HOME\lib\dt.jar;JAVA_HOME% \lib\tools.jar (要加.表示当前路径);%JAVA_HOME%就是引用前面指定的JAVA_HOME;不过本人还是比较相信绝对路径的。
2 ant的安装:ant是集成构建工具,想必大家都不太陌生了。只需要到ant.apache.org的网站下载ant的适当版本解压缩后,配置系统的环境变量:ANT_HOME:d:\apache-ant-1.7.0, path:d:\apache-ant-1.7.0\bin 后,ant就可以在任意目录下运行了,如cmd下运行ant,显示:buildfile:build.xml does not exsit。。。。。
3 安装svn,因为cruisecontrol要用到svn(不知道这两个有什么先后顺序没,因为cc要用svn就先装cc喽)。svn的安装TortoiseSVN-1.5.3.13783-win32-svn-1.5.2.msi安装提示装就可以了。
4 安装tomcat ,设置系统环境变量CATALINA_HOME=c:\tomcat,CLASSPATH=C:\tomcat\common\lib(加载必要的包)。
5 cuisecontrol的安装,因为本文使用的操作系统为XP,就使用CruiseControl-2.8.2.exe安装就可以了(.exe文件还是很受大家喜欢的)。配置系统的环境变量:CC_HOME=d:\cruisecontrol
6 安装slik-subversion,它会自动写入到path=D:\SlikSvn\bin\ 如果没有写入的话,要麻烦手动加入到系统的环境变量path中,本人曾经遇到过,cmd窗口已经打开但是配置文件执行过程中svn的命令总不能识别发现此处的路径没有加入到path中。
7下载svnant-1.1.0-RC2.zip,把lib包中的jar考到ant的jar中。
三 以上的准备工作已经基本搞定,下面就介绍一下配置文件。此次环境的搭建配置文件是很关键的,因为他们各自有自己的标签,所以还要想达到什么功能慢慢查找,(如果有时间系统学习一下就好了)。
1 ant的关键文件为build.xml(当然也可以起别的名称,自己还要改它的启动文件,就用这个名称吧)下面是一个实例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
定义basedir当前的根目录,default默认执行的标签,name工程名
<project basedir="." default="all" name="framework">
<property environment="env" />
定义tomcat的安装目录
<property name="TOMCAT_DIR" location="D:/Tomcat 5.5" />
定义debug的级别
<property name="debuglevel" alue="source,lines,vars" />
为了引用tomcat固有包方便所以增加次属性
<property name="coolink.dist.path" location="D:/Tomcat 5.5/webapps/txsd/WEB-INF" />
指定要编译的工程目录
<property name="CLASS_DIR" location="D:/CruiseControl/projects/framework" />
<property name="target" value="1.5" />
<property name="source" value="1.5" />
编译时候所使用的类路径,id为引用的名称
<path id="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath">
<pathelement location="${TOMCAT_DIR}/common/lib/commons-el.jar" />
....
<pathelement location="${TOMCAT_DIR}/common/lib/servlet-api.jar" />
</path>
<path id="Web App Libraries.libraryclasspath">
<pathelement location="${coolink.dist.path}/lib/activation.jar" />
.............
<pathelement location="${coolink.dist.path}/lib/xmlParserAPIs.jar" />
</path>
<path id="ant.svn.classpath">
<fileset dir="D:/CruiseControl/apache-ant-1.7.0/lib">
<include name="*.jar" />
</fileset>
</path>
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask">
<classpath refid="ant.svn.classpath" />
</taskdef>
<path id="txsd.classpath">
<path refid="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath" />
<path refid="Web App Libraries.libraryclasspath" />
</path>
clean操作,如果build之前不执行此操作,build检查到原有的class文件就不再编译。
<target name="clean">
<delete file="${CLASS_DIR}/longcon-framework.jar" />
<delete dir="target" quiet="true" />
<delete dir="${CLASS_DIR}/source/classes" />
</target>
要build模块的名称build-framework看来可以随便起名字,但是有人说必须和模块名称一致,至今还不知道为什么
<target name="build-framework">
<echo message="${ant.project.name}: ${ant.file}" />
<mkdir dir="${CLASS_DIR}/source/classes" />
<copy includeemptydirs="false" todir="source/classes">
<fileset dir="${CLASS_DIR}/source" excludes="**/*.launch, **/*.java" />
</copy>
<javac debug="true" debuglevel="${debuglevel}" destdir="${CLASS_DIR}/source/classes" source="${source}" target="${target}" encoding="UTF-8">
<src path="${CLASS_DIR}/source" />
<exclude name="**/.svn/**" />
<classpath refid="txsd.classpath" />
</javac>
</target>
单元测试的部分
<target name="test">
<mkdir dir="target/test-classes" />
<javac encoding="UTF-8" srcdir="${CLASS_DIR}/test" destdir="target/test-classes">
<classpath>
<pathelement location="${CLASS_DIR}/source/classes" />
<path refid="Apache Tomcat v5.5 [Apache Tomcat v5.5].libraryclasspath" />
<path refid="Web App Libraries.libraryclasspath" />
</classpath>
</javac>
<mkdir dir="target/test-results" />
<junit haltonfailure="no" printsummary="on">
<classpath>
<pathelement location="${CLASS_DIR}/source/classes" />
<pathelement location="${coolink.dist.path}/lib/junit.jar" />
<pathelement location="target/test-classes" />
</classpath>
<formatter type="brief" usefile="false" />
<formatter type="xml" />
<batchtest todir="target/test-results">
<fileset dir="target/test-classes" includes="**/*.class" />
</batchtest>
</junit>
</target>
打包放到指定目录
<target name="jar">
<jar destfile="${CLASS_DIR}/longcon-framework.jar" encoding="UTF-8" update="false" excludes="**/*Test*.class">
<fileset dir="${CLASS_DIR}/source/classes" />
</jar>
<copy includeemptydirs="false" todir="${coolink.dist.path}/lib">
<fileset file="${CLASS_DIR}/longcon-framework.jar" excludes="**/*.launch, **/*.java" />
</copy>
</target>
调用svn命令,这与三中的步骤7有密切的联系
<target name="commit">
<svn username="aaa" password="aaa">
<commit file="${coolink.dist.path}/lib/longcon-framework.jar" message="${msg.commit}" />
</svn>
</target>
<target name="all" depends="clean,build-framework,jar,commit"/>
</project>
注释:
a设置编译所需要的类路径可以用: <classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
<dirset dir="build">
<include name="apps/**/classes"/>
<exclude name="apps/**/*Test*"/>
</dirset>
<filelist refid="third-party_jars"/>
</classpath>
b <target name="test" depends="clean">depends表示依赖关系
2 cruisecontrol的config文件,CC启动的时候会自动寻找此文件,当然你可以通过修改启动文件修改config.xml名称,只要两处一致就能找到,下面是一个config文件的实例:
<cruisecontrol>//cc的固有标签,cc中可以有多个project
<project name="framework">// 工程名称
<plugin name="labelincrementer" classname="net.sourceforge.cruisecontrol.labelincrementers.SVNLabelIncrementer"/>
<labelincrementer workingcopypath="projects/${project.name}"/> // 显示svn的版本号
listeners:监听器,来报告cc的此项目的运行信息
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt" />
</listeners>
bootstrappers从svn源码控制程序更新本地版本,据说还有向其它插件提供当前创建的状态
<bootstrappers>
<svnbootstrapper localWorkingCopy="projects/${project.name}" username="luojing" password="luojing" />
</bootstrappers>
<bootstrappers>//向ant提供当前信息
<antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="jar" />
</bootstrappers>
<modificationset quietperiod="30">// 通过svn更新原代码
<!-- touch any file in connectfour project to trigger a build -->
<svn localWorkingCopy="projects/${project.name}" username="luojing" password="luojing" />
</modificationset>
<schedule interval="28800">设定检查编译build版本的时间单位s
<ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" />
</schedule>
<log>//显示单元测试信息
<merge dir="projects/${project.name}/framework/target/test-results" />
</log>
<publishers>//发布版本
<onsuccess>//成功,并生成有时间戳的目录
<artifactspublisher dest="D:/CruiseControl/artifacts/${project.name}" file="projects/${project.name}/longcon-framework.jar" />
</onsuccess>
<onfailure>//失败发送邮件到响应的人员
<htmlemail buildresultsurl="http://localhost:8080/cruisecontrol/buildresults/${project.name}" mailhost="邮件服务器" password="密码" username="用户名" defaultsuffix="@**.com.cn" returnname="PetClinic Continuous Integration" returnaddress="sunny@**.com.cn" charset="UTF-8" skipusers="true" xsldir="webapps/cruisecontrol/xsl" css="webapps/cruisecontrol/css/cruisecontrol.css">
<always address="接收邮件方的邮箱" />
</htmlemail>
</onfailure>
</publishers>
</project>
<project name="site">
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt" />
</listeners>
<bootstrappers>
<svnbootstrapper localWorkingCopy="projects/${project.name}" username="sunny" password="sunny" />
</bootstrappers>
<bootstrappers>
<antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="jar" />
</bootstrappers>
<modificationset>//设置只有framework工程成功了才执行此次的操作,体现了project的依赖关系
<buildstatus logdir="logs/framework"/>
</modificationset>
</project>
</cruisecontrol>
四 启动CC可以实现集成编译、集成构建、单元测试的功能,对于持续构建这是最简单不过了,要继续努力学习哦。
五 持续集成使用了一段时间发现了源代码目录总是不能自动更新,认真查找发现是因为自己对标签<svnbootstrapper>的理解不正确,现在就是在ant的build.xml中调用svn的提交命令来解决的,不知道思路是否正确,请大家指教。
下面就更清晰的介绍一下常用的标签把。
CC配置文件范connectfour范例Config.xml如下:
<cruisecontrol>
<project name="connectfour">
<listeners>
<currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
</listeners>
<bootstrappers>
<antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="clean" />
</bootstrappers>
<modificationset quietperiod="30">
<!-- touch any file in connectfour project to trigger a build -->
<filesystem folder="projects/${project.name}"/>
</modificationset>
<schedule interval="300">
<ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
</schedule>
<log>
<merge dir="projects/${project.name}/target/test-results"/>
</log>
<publishers>
<onsuccess>
<artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
</onsuccess>
</publishers>
</project>
</cruisecontrol>
<cruisecontrol>根元素是<cruisecontrol>,该元素很简单,没什么需要配置的属性。
目前CC支持多项目(multiproject),因此可以有多个并行的<project>元素。支持的子元素包括:
<project>
<property/>
<plugin/>
<dateformat/>
<labelincrementer/>
<listeners>
<cmsynergysessionmonitor/>
<currentbuildstatusftplistener/>
<currentbuildstatuslistener/>
<currentbuildstatuspagelistener/>
<lockfilelistener/>
</listeners>
<bootstrappers>
<accurevbootstrapper/>
<alienbrainbootstrapper/>
<antbootstrapper/>
<clearcasebootstrapper/>
<clearcaseviewstrapper/>
<cmsynergybootstrapper/>
<currentbuildstatusbootstrapper/>
<currentbuildstatusftpbootstrapper/>
<cvsbootstrapper/>
<execbootstrapper/>
<gitbootstrapper/>
<harvestbootstrapper/>
<lockfilebootstrapper/>
<mercurialbootstrapper/>
<p4bootstrapper/>
<plasticscmbootstrapper/>
<snapshotcmbootstrapper/>
<starteambootstrapper/>
<surroundbootstrapper/>
<svnbootstrapper/>
<tfsbootstrapper/>
<vssbootstrapper/>
</bootstrappers>
<modificationset>
<accurev>
<alienbrain/>
<alwaysbuild/>
<buildstatus/>
<clearcase/>
<cmsynergy/>
<compound>
<targets/>
<triggers/>
</compound>
<cvs/>
<darcs/>
<filesystem/>
<forceonly/>
<git/>
<harvest/>
<httpfile/>
<mavensnapshotdependency/>
<maven2snapshotdependency/>
<mercurial/>
<mks/>
<p4/>
<plasticscm/>
<pvcs/>
<snapshotcm/>
<starteam/>
<store/>
<surround/>
<svn/>
<tfs/>
<timebuild>
<ucm>
<veto/>
<vss/>
<vssjournal/>
</modificationset>
<schedule>
<ant/>
<maven/>
<maven2/>
<pause/>
<nant/>
<phing/>
<rake/>
<exec/>
<composite/>
</schedule>
<log>
<merge/>
<gzip/>
<delete/>
</log>
<publishers>
<antpublisher/>
<artifactspublisher/>
<clearcasebaselinepublisher/>
<cmsynergybaselinepublisher/>
<cmsynergytaskpublisher/>
<compoundpublisher/>
<currentbuildstatuspublisher/>
<currentbuildstatusftppublisher/>
<email/>
<execute/>
<ftppublisher/>
<htmlemail/>
<http>
<jabber/>
<onfailure/>
<onsuccess/>
<rss/>
<sametimeannouncement/>
<scp/>
<sfeedocman/>
<sfeefrs/>
<sfeetracker/>
<socket/>
<weblog>
<x10/>
<xsltlogpublisher/>
<yahoopublisher/>
</publishers>
</project>
子元素过多所以详情可以参看官方文档的说明。
这里只介绍几个常用的子元素:
<bootstrappers>:<bootstrappers>在创建之前会运行,相当于一个预处理的作用,<bootstrappers>下面每个子元素都是独立的,因此可以同时配置多个bootstrappers。
CC提供的bootstrappers包括两种,一种用于向其他插件提供项目当前创建的状态,还有一种是从某个源码控制系统更新本地文件,其中最常用的就是<currentbuildstatusbootstrapper>和<svnbootstrappers>。<currentbuildstatusbootstrapper>指定了状态文件的位置,主要是用来访问项目当前创建的状态,CC的<currentbuildstatusbootstrapper>会将创基爱你的状态写入这个文件。
<svnbootstrapper>的作用有点难理解,因为我们每次项目的创建都应该基于最新的代码,因此在创建之前就要获得最新的项目文件,如果使用的是ant来完成这个任务,那么buildfile本身在创建开始之前发生了变化,我们是不是应该先更新这个buildfile,然后才通过buildfile来对项目进行构建呢?<svnbootstrapper>就是为从源码控制系统更新buildfile文件而设计的(还有一种替代的使用方法是使用wrapper buildfile,这样就不用使用<svnbootstrapper>了,wrapper buildfile也是推荐的方法,<modificationset>部分会进行详细的讨论)。
<modificationset>:包括了SourceControl插件的配置信息,用于检查各个源码控制系统中是否发生变化,<schedule>会用到这里的配置信息,如果检测到变化,会触发创建过程。
<modificationset>的属性quietperiod(单位为秒)定义了一个时间值。如果CC检查到了变化,会自检查到变化的源码控制系统的最后一次check in 的时间开始等待,等待时间由quietperiod决定,等待结束之后才触发创建(build)过程,主要是防止有人在check in的过程当中就触发创建过程(可能check in只做了一半,这个时候触发创建显然是不正确的).
下面是一个modificationset的例子:
<modificationset quietperiod="30">
<svn localworkingcopy="projects/SFA"/>
</modificationset>
相关推荐
2. 使用持续集成工具:如Jenkins、Travis CI等,可以自动化执行Ant构建和JUnit测试,确保每次代码提交后都能及时发现潜在问题。 3. 快速失败策略:通过设置`haltonfailure`属性,当测试失败时立即停止构建,便于快速...
在软件开发的持续集成(CI)环境中,Eclipse PDE Export ANT Script是一种非常有用的技术,它允许开发者通过ANT构建脚本来自动化插件的打包和发布过程。 ANT是Apache开源组织提供的一款Java项目构建工具,它使用XML...
### CI & Jenkins 基础知识点详解 #### 一、CI (Continuous Integration) 概念与目的 **CI**(持续集成)是一种软件开发实践,其中开发者经常将他们的工作成果合并到一个共享的主分支中,通常是每天至少一次。通过...
在描述中反复出现的"ant ant ant antant ant ant antant ant ant ant"可能象征着构建过程的自动化和持续性,每一个“ant”代表一次自动化的构建动作,强调了Ant在持续集成和持续部署(CI/CD)中的作用。 至于标签...
本指南将详细介绍如何搭建一个基于CI的环境,涉及以下关键技术:Hudson、Archiva、Ant、Maven、Tomcat和SVN。 **1. 需求分析** 在开始搭建之前,理解CI环境的核心需求是关键。这些包括自动化的构建、测试、部署和...
在IT行业中,持续集成(Continuous Integration,CI)是一种软件开发实践,它强调开发人员频繁地将他们的代码更改合并到共享存储库中,并且每次合并后都会自动构建和测试整个项目,以尽早发现并修复错误。Ant是...
11. **持续集成(Continuous Integration,CI)**:Ant也常用于CI服务器,如Jenkins,自动执行构建、测试和部署流程。 总结起来,Ant作为Java项目管理的强大工具,可以帮助开发者自动化处理项目的构建过程,包括...
Ant可以被集成到CI服务器中,比如Hudson、Jenkins等,实现自动构建和测试。 7. Ant与其他技术的集成:Ant不仅限于Java项目,它也可以和其他技术或工具进行集成,如XML处理、Web服务的开发、数据库操作等,从而支持...
在IT行业中,自动化工具的使用是提升效率的关键。在Android或Java开发中,"ant批量打包脚本"是一个非常实用的技巧,它...同时,这样的自动化流程也符合持续集成和持续部署(CI/CD)的最佳实践,有助于项目的高效迭代。
- **持续集成(Continuous Integration, CI)**: 配合Jenkins、Travis CI等工具,实现自动化的持续集成和部署。 6. **最佳实践** - **模块化构建**: 将大型工程拆分为多个模块,分别处理,提高可维护性。 - **...
Ant的命令行界面也使得它在CI/CD流程中非常实用。 总的来说,"apache-ant-1.8.2"是Java开发者必备的工具之一,它简化了项目构建过程,提高了开发效率,同时提供了丰富的功能和高度的定制性。虽然后续版本如Ant 1.9....
这样,在CI服务器上执行`ant ci-all`命令就能完成整个构建过程。 总结来说,Ant作为一个强大的构建工具,可以方便地管理项目的构建过程,同时通过整合质量控制插件,确保代码质量和一致性。通过合理配置`build....
例如,在持续集成(CI)环境中,Ant被用于自动化构建流程,包括但不限于代码检查、单元测试执行、静态分析等。此外,Ant还常用于多模块项目的构建,通过灵活的构建文件,实现不同模块间的依赖管理和并行构建,极大提升...
通过合理配置,Ant可以很好地集成到持续集成(CI)流程中,确保项目构建的一致性和可重复性。 总结,Ant作为一个强大的构建工具,为Java开发者提供了便利,使得项目构建过程自动化,提高了开发效率。通过阅读提供的...
标题中的“ant远程上传并部署tomcat”是指使用Apache Ant工具执行自动化构建任务,将本地的Web应用(如WAR或EAR...这种自动化部署方法在持续集成/持续部署(CI/CD)流程中尤其重要,可以减少手动操作的错误和时间消耗。
14. **持续集成**:Ant可以与其他持续集成工具如Jenkins、Travis CI等结合,实现自动化构建和测试流程。 总的来说,Apache Ant 1.9.4是Java项目构建的强大工具,尤其在Linux环境中,它提供了丰富的任务和高度可定制...
在持续集成(CI)环境中,Ant也发挥着重要作用,自动化构建、测试和部署极大地提高了开发效率。 总结来说,Ant 1.7.0作为一款强大的构建工具,其简洁的配置方式、丰富的任务库以及良好的扩展性,使其在Java开发领域...
在IT行业中,Ant是一个广泛应用的构建工具,尤其在Java项目中。它是由Apache软件基金会开发的一个开源项目,主要用来自动化构建、编译、测试和...同时,它也是资深开发者进行持续集成和持续交付(CI/CD)的基础工具之一。
6. 考虑持续集成:在持续集成环境中,如Jenkins或Travis CI,这种集成会更加重要,因为它们需要自动从SVN仓库拉取代码并执行构建。 总的来说,"ant学习之集成svn"是一个关于如何在Java开发环境中利用Apache Ant工具...