`
flysnowxf
  • 浏览: 578763 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

重构CruiseControl配置和Ant脚本

    博客分类:
  • Java
阅读更多
代码的重复是件麻烦事,配置文件的重复也让人不爽。当配置文件出现bad smell时,也要着手进行重构了。

当在CruiseControl(以下简称cc)监控多个项目时,config.xml很容易出现大堆的重复配置。比如我的:
<cruisecontrol>
	<property file="common.properties" />
	<property name="anthome" value="apache-ant-1.7.0" />

	<project name="cc">
		<listeners>
            <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        </listeners>
        <modificationset quietperiod="30">
			<svn RepositoryLocation="${svnloc}/${project.name}" username="${user}" password="${password}"/>
        </modificationset>
        <schedule interval="20">
            <ant anthome="${anthome}" buildfile="buildfiles/${project.name}.xml" target="update"/>
        </schedule>
        <publishers>
            <onsuccess>
                <antpublisher anthome="${anthome}" buildfile="buildfiles/${project.name}.xml" target="deploy"/>
            </onsuccess>
        </publishers>
	</project>

	<project name="dd">
		<listeners>
            <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        </listeners>
        <modificationset quietperiod="30">
			<svn RepositoryLocation="${svnloc}/${project.name}" username="${user}" password="${password}"/>
        </modificationset>
        <schedule interval="20">
            <ant anthome="${anthome}" buildfile="buildfiles/${project.name}.xml" target="update"/>
        </schedule>
        <publishers>
            <onsuccess>
                <antpublisher anthome="${anthome}" buildfile="buildfiles/${project.name}.xml" target="deploy"/>
            </onsuccess>
        </publishers>
	</project>
</cruisecontrol>

当存在多个project时,由于每个project的处理过程是一模一样的,因此配置写了重复的n次。使用plugin定义模板来改变:
<cruisecontrol>
	<property file="common.properties" />
	<property name="anthome" value="apache-ant-1.7.0" />

	<!-- template --> 
	<plugin name="project">
        <listeners>
            <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        </listeners>

		<!-- monitoring the svn change -->
        <modificationset quietperiod="30">
			<svn RepositoryLocation="${svnloc}/${project.name}" username="${user}" password="${password}"/>
        </modificationset>
		
		<!-- task --> 
        <schedule interval="20">
            <ant anthome="${anthome}" buildfile="buildfiles/${project.name}.xml" target="update"/>
        </schedule>
		
		<!-- publish -->
        <publishers>
            <onsuccess>
                <antpublisher anthome="${anthome}" buildfile="buildfiles/${project.name}.xml" target="deploy"/>
            </onsuccess>
        </publishers>
	</plugin>
	<!-- 1..n project -->
	<project name="cc"/>
	<project name="dd"/>
</cruisecontrol>

有更多的project都只需添加一句话而已。plugin的使用可参考官方http://cruisecontrol.sourceforge.net/main/plugins.html。其中name属性如果是cc默认定义的,可以不加classname属性,比如这里的name="project"。

由于cc经常和ant配合使用,ant也容易出现大堆的重复配置。比如我的:
cc.xml
<project name="cc" basedir=".">
	<property file="../common.properties" />
	<property name="project" value="../projects/${ant.project.name}" />
	<property name="tomcat" value="../apache-tomcat-5.5.26/webapps" />

	<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" />

	<target name="checkout">
		<svn username="${user}" password="${password}">
			<checkout url="${svnloc}/${ant.project.name}" 
				destPath="${project}"/>
		</svn>
	</target>

	<target name="update">
		<svn username="${user}" password="${password}">
			<update dir="${project}"/>
		</svn>
		<!-- war -->
		<ant dir="${project}"/> 
	</target>

	<target name="deploy">
		<copy todir="${tomcat}">
			<fileset dir="${project}/war"/>
		</copy>
	</target>
</project>

dd.xml
<project name="dd" basedir=".">
	<property file="../common.properties" />
	<property name="project" value="../projects/${ant.project.name}" />
	<property name="tomcat" value="../apache-tomcat-5.5.26/webapps" />

	<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" />

	<target name="checkout">
		<svn username="${user}" password="${password}">
			<checkout url="${svnloc}/${ant.project.name}" 
				destPath="${project}"/>
		</svn>
	</target>

	<target name="update">
		<svn username="${user}" password="${password}">
			<update dir="${project}"/>
		</svn>
		<!-- war -->
		<ant dir="${project}"/> 
	</target>

	<target name="deploy">
		<copy todir="${tomcat}">
			<fileset dir="${project}/war"/>
		</copy>
	</target>
</project>

cc.xml和dd.xml几乎一模一样,只是project name不同而已。使用import task来改变:
先定义公共的xml,这里为import.xml:
<!-- this project name is unuseful -->
<project name="import">
	<property file="../common.properties" />
	<property name="project" value="../projects/${ant.project.name}" />
	<property name="tomcat" value="../apache-tomcat-5.5.26/webapps" />

	<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" />

	<target name="checkout">
		<svn username="${user}" password="${password}">
			<checkout url="${svnloc}/${ant.project.name}" 
				destPath="${project}"/>
		</svn>
	</target>

	<target name="update">
		<svn username="${user}" password="${password}">
			<update dir="${project}"/>
		</svn>
		<!-- war -->
		<ant dir="${project}"/> 
	</target>

	<target name="deploy">
		<copy todir="${tomcat}">
			<fileset dir="${project}/war"/>
		</copy>
	</target>
</project>

在cc.xml和dd.xml中import进来即可:
cc.xml
<project name="cc" basedir=".">
	<import file="import.xml" />
</project>

dd.xml
<project name="dd" basedir=".">
	<import file="import.xml" />
</project>

需要注意的是,import.xml中的project name是没用的,${ant.project.name}不是指该值,而是指最上层引用的xml的project name。比如cc.xml引用了import.xml,那么${ant.project.name}是指cc.xml的project name。import task有点复制代码的味道。

参考:
http://www.blogjava.net/chelsea/archive/2008/03/06/184374.html
http://cruisecontrol.sourceforge.net/main/plugins.html
http://ant.apache.org/manual/index.html
分享到:
评论

相关推荐

    cruisecontrol配置文件.rar

    本压缩包“cruisecontrol配置文件.rar”包含了一些关键文件,它们是CruiseControl配置和运行的核心部分。 `main.jsp` 是CruiseControl Web界面的一个页面,用户可以通过这个页面查看构建状态、历史记录以及错误报告...

    cruisecontrol配置定时运行

    CruiseControl是一款持续集成工具,它能够自动化地构建、测试和部署软件项目,极大地提高了开发效率和产品质量。在本文中,我们将深入探讨如何配置CruiseControl以实现定时运行,确保项目始终保持最新状态。 首先,...

    CruiseControl及ant配置

    通过本文档,我们可以了解到CruiseControl和Ant在持续集成中的应用。CruiseControl作为一个强大的CI工具,可以帮助团队自动化构建流程,提高软件开发效率。而Ant作为构建工具,则负责具体的构建任务执行。两者结合...

    CruiseControl + ANT +SVN

    【CruiseControl + ANT + SVN】是一个集成开发环境(IDE)自动化构建和版本控制的解决方案。这个组合在软件开发过程中发挥着关键作用,确保代码的持续集成和版本管理。下面将详细阐述这三个组件以及它们如何协同工作...

    [CruiseControl]binary安装和启动

    - **启动脚本**:`cruisecontrol.bat` 和 `cruisecontrol.sh` 脚本用于启动 CruiseControl 服务。它们会调用 `config.xml` 和 `dashboard-config.xml` 文件中的配置信息。 - **SSH 支持**:如果使用基于 SSH 的 CVS ...

    CruiseControl简介及使用举例

    安装完成后,系统会包含一系列必要的文件和目录,比如`cruisecontrol.bat`用于启动服务,`config.xml`作为主要的配置文件,`apache-ant-1.6.5`是CruiseControl依赖的Ant环境,`docs`包含使用文档和示例,`lib`存放...

    cruisecontrol+maven2配置

    - **配置文件修改**:在`%CruiseControl_Home%/config.xml`中,定义了CruiseControl的核心配置,包括项目名称、监听器、启动程序、修改集、调度、日志记录和发布者等。例如: - `&lt;property&gt;`标签用于设置环境变量。...

    持续集成之CruiseControl.rb

    2. **配置文件**:CruiseControl.rb的配置文件通常是`config/cruise_control.rb`,它定义了项目的构建流程,包括源码管理、构建触发器、构建任务、测试和报告等。 3. **构建生命周期**:CruiseControl.rb的构建过程...

    Cruisecontrol

    3. **集成示例**:具体案例中通常会包含如何配置CruiseControl来执行ANT构建脚本的例子。 #### 四、CruiseControl的实施细节 CruiseControl的实施过程中,涉及到了几个重要的概念和技术点: 1. **分布式架构**:...

    利用CruiseControl软件进行持续集成

    安装之后,CruiseControl预先配置了一个配置文件,轮询CVS(或其它版本控制系统)存储库并执行ANT构建脚本。服务环境不需要安装Web服务器,CruiseControl已经内嵌了Jetty web服务程序。 3.CruiseControl的配置 当...

    ant脚本资料ant

    - **持续集成**:Ant常与CruiseControl、Jenkins等持续集成工具结合,自动执行构建和测试。 - **项目管理**:大型项目中,Ant可以帮助管理和协调各个模块的构建过程。 通过阅读`命令.txt`、`ant知识.txt`、`ant...

    电子邮件 CruiseControl 配置

    总结来说,CruiseControl的电子邮件配置涉及`config.xml`文件中的`&lt;notification&gt;`和`&lt;email&gt;`标签,通过定制这些设置,我们可以实现构建状态的通知,确保团队成员始终保持对项目进度的了解。正确配置邮件通知是持续...

    cruisecontrol_ant_svn持续集成

    cruisecontrol.war 文件,你可以直接将这个文件 COPY 到你的%TOMCAT_HOME%\webapps 目录下,不 过这种方式通常都会出错,前 面我们讲过CC的WEB组件要访问我们的项目build 的状态文件,而下载的 CC2.2 里面自带的 ...

    SVN+cruisecontrol 搭建持续集成开发环境

    同时,需要在 CruiseControl 中配置构建脚本,以便自动地构建和测试软件。 在这个例子中,我们使用 SVN 和 CruiseControl 搭建了一个持续集成开发环境。首先,我们安装了 SVN 服务器,并且创建了一个 SVN 仓库。...

    CruiseControl使用指南.rar

    6. **向CruiseControl中加入新项目**:"CruiseControl step by step(3)"部分可能详细介绍了如何添加新的项目到CruiseControl服务器,包括项目配置文件的修改和项目构建规则的设定。 7. **了解CruiseControl的配置...

    CruiseControl学习教程.pdf

    通过熟悉其架构、配置文件和插件机制,你可以有效地利用CruiseControl来实现自动化构建和测试流程。 请注意,本教程仅为CruiseControl学习的起点,实际使用中可能还需要了解更深入的配置技巧、插件用法以及与其他...

    CruiseControl使用总结

    CruiseControl 的安装和配置是其使用的关键环节。通常,你需要下载CruiseControl的二进制包,然后根据项目需求配置XML配置文件。配置文件包含了项目源码位置、构建命令、测试脚本、邮件通知等信息。例如,你可以设置...

Global site tag (gtag.js) - Google Analytics