Cruise Control 持续集成 - 如何自动编译,打包,并自动发布至Tomcat

一, 前言

目标是,利用CruiseControl 自动抓取SVN下的源代码,并且将项目源码自动编译,打包成war,并自动部署到 Tomcat 中。

 

二, CruiseControl 如何自动获取SVN源码

1. 首先, 将 SVN 工程 checkout 到 CruiseControl Project 目录下。

 

cd  ${CC_PROJECT_PATH}/yourproject/resources (${CC_PROJECT_PATH} CruiseControl 安装路径 )
svn co svn://127.0.0.1/trunk/yourproject/ (需要安装 SVN Server 端,命令可以执行)

 

2. 其次,CuriseControl 可以自动感知代码库中的源码是否有变更

 

CruiseControl 通过自身的 plugin <svnbootstrapper> 即可以通过checkout 的工程目录种的.svn,自动感知有没有新的变更,如若有新的变更,首先更新工程源码,然后触发项目中的ant脚本进行自动编译,打包。

<plugin name="svnbootstrapper"  classname="net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper"/>
<plugin name="svn" classname="net.sourceforge.cruisecontrol.sourcecontrols.SVN"/>

<bootstrappers>
  <svnbootstrapper localWorkingCopy="projects/${project.name}/resource"/>
</bootstrappers>
		
<!--
  quietperiod: 
  The number of seconds required to have passed since the last modification before a build can commence. This attribute is used to avoid starting a build while someone is in mid-checkin.
-->
<modificationset quietperiod="30"> 
  <svn localWorkingCopy="projects/${project.name}/resource"/>
</modificationset>

<!-- 3 min -->
<schedule interval="180"> 
  <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/resource/build.xml" />
</schedule>

上面的配置既是告诉 CruiseControl 每隔 3分钟去 check 一下 yourproject 项目源码是否有变更,如果有,先更新,然后调用yourporject项目中的build.xml脚本自动进行build!

 

(CruiseControl默认情况下是必须要有变更才进行build,如果需要强制build,可以再 <project> 上加属性 requiremodification="N")

 

三, 一个完整的自动build的配置

<project name="yourproject" requiremodification="N">

  <plugin name="svnbootstrapper" classname="net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper"/>
  <plugin name="svn" classname="net.sourceforge.cruisecontrol.sourcecontrols.SVN"/>

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

  <bootstrappers>
    <svnbootstrapper localWorkingCopy="projects/${project.name}/resource"/>
  </bootstrappers>
		
<!--
  quietperiod: 
  The number of seconds required to have passed since the last modification before a build can commence. This attribute is used to avoid starting a build while someone is in mid-checkin.
-->
  <modificationset quietperiod="30">
    <svn localWorkingCopy="projects/${project.name}/resource"/>
  </modificationset>

<!-- 3 min -->
<schedule interval="180"> 
   <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/resource/build.xml" /> 
</schedule>

<log dir="logs/${project.name}">
		  <merge dir="projects/${project.name}/build/logs/"/>
</log>

<publishers>
  <email mailhost="SMTP_HOST" 
             buildresultsurl="http://localhost:8080/cruisecontrol/buildresults/${project.name}"
             skipusers="true"
             spamwhilebroken="true"
             returnaddress="project@example.com">
            <failure address="comedshang@gmail.com" reportWhenFixed="true"/>
    </email>
  </publishers>
</project> 

 

将上面这段配置内容更新到 ${CC_PROJECT_PATH}/config.xml 中,这样,CruiseControl就会定期的(3分钟一次)感知代码库的变化,如果有变化,则更新,然后执行 scheduler 中的 ant 脚本。

 

这样,自动 build 的功能就实现了。

 

四,自动部署到 Tomcat

通常情况下,我们有两种方案。

 

1. 利用Tomcat自动部署功能,在 server.xml 中,将<Host>的属性autoDeploy设置为true。

 

这样,一旦有新的war部署到Tomcat 的工程目录webapps下,则Tomcat 可以自动部署!

 

这样做的好处是,我们只需要新建另外一个Ant脚本,把新打包的war部署到Tomcat中,既可。

但是这样做的问题是,自动部署后,由于JVM清理不干净,日而久之,则容易导致 java.lang.OutOfMemoryError: Java heap space.

 

2. 先自动关闭Tomcat,删除Tomcat中的工程文件,然后将打包的war部署,然后启动Tomcat

<project name="yourproject" default="startuptomcat" basedir=".">  
    
  <property name="tomcat.dir" value="D:\Program Files\apache-tomcat-5.5.36"/>  
     
  <property name="war.dir"      value="../yourproject/" />	
  <property name="war.dist.dir" value="${war.dir}/build/dist"/>	
  <property name="war.name"     value="yourproject.war"/>
  <!-- 自动关闭 Tomcat  -->
  <target name="shutdowntomcat">  
    <exec executable="${tomcat.dir}/bin/shutdown.bat" failonerror="false">
      <env key="CATALINA_HOME" value="${tomcat.dir}" />
    </exec>  
         <!-- sleep 30 seconds until it's completed. -->  
    <sleep seconds="30"/>  
  </target> 
     
  <target name="clean" depends="shutdowntomcat">  
    <delete dir="${tomcat.dir}/work/Catalina/localhost/${ant.project.name}"/>  
    <delete dir="${tomcat.dir}/webapps/${ant.project.name}"/>  
    <delete file="${tomcat.dir}/webapps/${ant.project.name}.war"/>  
  </target>  

  <target name="copyWar" depends="clean">  
    <copy file="${war.dist.dir}/${war.name}" todir="${tomcat.dir}/webapps"></copy>
  </target>     
   
  <target name="startuptomcat" depends="copyWar">  
    <exec executable="${tomcat.dir}/bin/startup.bat" spawn="true" vmlauncher="false">  
      <env key="CATALINA_HOME" value="${tomcat.dir}" />  	
    </exec>
  </target>  
       
</project>  

 

上述Ant 脚本,调用批处理文件,自动关闭Tomcat,部署后,自动启动Tomcat,

( 将上面这个Ant Script 加入CruiseControl的config.xml的<scheduler>中,既可实现自动部署!

 

但是看似一切很完美,但是,CruiseControl却只能自动部署一次,再也不会定期进行build部署了。也就是说,当Tomcat启动过后,CruiseControl被卡住了,它在等待新建的Tomcat窗口执行完毕,但新启动的Tomcat永远不会自动关闭,除非人为,所以 CruiseControl会被永远的卡住。

 

那么该如何解决?

 

经过测试,需要将 Tomcat 设置为服务模式既可!

 

cd %TOMCAT_HOME%\bin

service install tomcat

 

运行上面两行 command line 即可以将 Tomcat 设置为后台服务! 这样我们可以使用 net start tomcat 启动,同样可以使用 next stop tomcat 来停止,故,更新 deploy ANT 脚本

 

<target name="shutdowntomcat">  
  <exec executable="c:\Windows\System32\cmd.exe" failonerror="false">
    <arg line="/C NET STOP tomcat"></arg>			
  </exec>  
  <sleep seconds="30"/>
</target> 

<target name="startuptomcat" depends="copyWar">  
  <exec executable="c:\Windows\System32\cmd.exe" failonerror="false">
    <arg line="/C NET START tomcat"></arg>			
  </exec>  
</target>  

 这样,CruiseControl 即不会被 Tomcat 启动窗口所阻塞,因为此时Tomcat已在后台运行,已无窗口!

 

 

 

 

 

 

短距激光雷达专业讲解:定义、架构、技术路线与选型逻辑 短距激光雷达,通常指有效探测距离不大于 50 米的激光雷达产品。它主要服务于服务机器人、扫地机器人、AGV/AMR、无人机、智能手机、AR/VR、工业安全等中近距感知场景。它与车载中长距激光雷达的最大区别,不是“探测距离短一点”,而是整套工程目标不同。短距激光雷达的核心诉求是:小体积、低成本、高帧率、强抗光、嵌入式集成。单价从百元级扫地机模组,到数千元级工业 3D 雷达不等。一句话概括:中长距车载激光雷达追求远距离、高可靠、车规寿命; 阅读详情

相关推荐

多模态RAG实战:为LLM装上视觉之眼,实现图文混合文档智能问答

检索增强生成(RAG)技术通过结合外部知识库,有效缓解了大语言模型(LLM)的幻觉问题,并扩展了其知识边界。其核心原理是将文档切分、向量化后存入向量数据库,在问答时通过语义检索召回相关上下文,辅助LLM生成更精准的答案。这项技术的核心价值在于,它为大模型应用提供了一种低成本、高效率的知识注入与实时更新方案,广泛应用于智能客服、知识库问答、文档分析等场景。随着应用深入,纯文本RAG在处理产品手册、学术论文、设计图纸等富含视觉信息的文档时面临瓶颈。本文聚焦的**多模态RAG**和**视觉理解**技术,正是为了解

weixin_30698527的博客 722

CruiseControl编译与安装

CruiseControl(CC)是一个开源免费的持续集成(CI)工具,说到CI工具,大家现在比较熟知的是Jenkins,CC可以说是比较古早的一个CI工具了,不过CC的扩展性强,在源码的基础上进行二次开发也能达到一些运维开发(Devops)业务上的需要,今天来说说CC源代码的编译与安装 准备工作 准备工作需要先下载CC的源码,CC的源码可以在sourceforge上获取,点这里下载...

aekkprvz836124的博客 189

C#海康威视摄像头控制,将IntPtr转换成Bitmap图片

C#通过skd控制海康威视摄像头,获取bitmap格式图片

ReflexMechanism的博客 6586

持续集成之CruiseControl

持续集成用于定时检测、构建项目。 常用的持续集成工具有CruiseControl,简称CC。 那么我们是如何部署项目到持续集成服务器中的呢? 首先我们可以将我们的项目copy到cc根目下的project目录下,然后通过在cc根目录下得config.xml文件中进行项目配置,具体配置主要参照里面的demo就ok。 在进行配置时有几项需要注意的: 静默时间:是用来配置项目组中有人提交代码后c...

Tang Ji Zhong 197

金融波动率的“捕手”:GARCH模型,揭秘市场波动的“聚集密码”

摘要: GARCH模型(广义自回归条件异方差)是金融时间序列分析中用于捕捉“波动聚类”现象的核心工具。传统模型(如ARIMA)无法刻画金融数据的时变波动特性,而GARCH通过建模条件方差的动态变化(如$\sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \beta \sigma_{t-1}^2$),精准预测波动率。Python实战显示,GARCH能有效拟合模拟金融数据的波动聚类,残差无自相关,验证了其优越性。该模型在波动率预测、风险价值(VaR)计算和期权定

u010257409的博客 2055

使用GitLab+Drone CI持续集成自动部署web项目,图文详细

kind: pipeline # 定义对象类型,还有secret和signature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: mall-tiny-drone # 定义流水线名称 steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: package # 流水线名称 image: maven:3-jdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库

4105

编译器与集成开发环境

编辑器编译器与集成开发环境(IDE) 字数2309 阅读258 评论0 喜欢2 引言 Boom,为了了解学长学姐学弟学妹的大致比例,在自己在校内建立的编程讨论群里做了一个小调查,根据结果来看,处处都恰到好处地映射了我们学校男女的比例—— 2:1 。投票参与人数比例约为 1/8 ,还是有很大的发展空间~ 群内年级性别调查表~ 好了切入技术正题,这一期,我

hyl52101314的博客 3507

GD32F470实战:如何用EXMC+SDRAM搞定LVGL大内存需求(附完整代码)

本文详细介绍了如何在GD32F470微控制器上通过EXMC接口驱动外部SDRAM,以满足LVGL图形库的大内存需求。内容涵盖硬件连接、EXMC时序配置、轻量级内存管理器实现,以及将LVGL帧缓冲和资源无缝集成到SDRAM的实战方法,并提供了完整的代码示例和调试技巧,帮助开发者构建稳定可靠的嵌入式GUI系统。

k9l0m1的博客 442

敏捷持续集成工具CruiseControl

持续化集成工具便是服务于敏捷软件开发的一个系列。它主要将原本分散,无序的工作流程,通过工具软件有机的组织起来,并且在组织的过程中,参与开发设计测试的各个部门的人员都能从中获取到自动化方面的优惠。使得团队的工作效率大大提升。     CruiseControl是一个针对持续构建程序(项目持续集成)的框架,它包括一个email通知的插件,Ant和各种各样的CVS工具。CruiseControl提供了一

东子的博客 1155

Nuclei漏洞扫描:从零到精通的Windows实战指南

本文详细介绍了Nuclei漏洞扫描工具在Windows平台上的安装与使用教程,从基础安装到高级实战技巧全面覆盖。通过具体案例展示如何利用Nuclei的模板库快速检测常见漏洞,并提供自定义POC开发指南,帮助安全从业者高效开展漏洞扫描工作。

weixin_28683689的博客 250

​网格划分理论:CFD理论67 网格划分-三大理论问题_哔哩哔哩_bilibili传统解释非结构化网格是不对的——计算传热学大叔专题讨论2--CFD网格类型_哔哩哔哩_bilibili

传统解释非结构化网格是不对的——计算传热学大叔。fluent计算理论和离散方法原理视频推荐。

qq_15963745的博客 183

Ant和cruisecontrol持续集成工具配置(转)

http://blog.sina.com.cn/s/blog_61aed0450100r0x6.html 1Ant的安装 (1)在官方网站http://ant.apache.org/下载apache-ant-1.8.1-bin.tar.gz二进制版本包。 (2)使用命令tar -zxvf apache-ant-1.8.1-bin.tar.gz解压。 (3)将解压好的文件夹apache-an...

yangjianli868的专栏 297

手把手打通全流程:在华为昇腾310/Atlas 200DK上实现深度学习模型从移植到部署

通过以上步骤,你已成功在华为昇腾310 Atlas 200DK上完成深度学习模型的移植与推理。这一流程可复用到目标检测、语义分割等其他任务,快去尝试将自己的AI模型部署到昇腾设备上,打造属于你的边缘智能应用吧!上部署深度学习模型,这篇教程将带你走完从模型转换到推理运行的完整流程。无需担心技术壁垒,我们以通俗易懂的方式拆解每一步,让你轻松在昇腾嵌入式设备上实现AI应用。是专为边缘AI设计的高性能处理器,Atlas 200DK是其开发板形态,能高效运行图像分类、目标检测等深度学习任务。

FJN110的博客 183

CruiseControl配置详解

将下载好的cruisecontrol-bin-2.8.4.zip解压后,目录结构如下图所示:

闸北米 3084

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

多文件/文件夹打包zip,response加入请求头即可下

package com.lic.fussel.foundation.filecabinets.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** .

Cruise的博客 1549

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Hibernate 2nd-level cache: 基础概念

 Introduction The goal for this document is to mainly describe the Hibernate 2nd-level caching strategy, learning how to use it and how can we got the performance benefit from the caching strategy. ...

DGenerationX的专栏 634

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JSTL - <form:select> 的用法

转载自: http://www.web-tag.net/3c98ca7b0cac8312.htm 下拉框组件标签       下拉框标签的典型形式为:    &lt;form: select path="city" items="${cityList}"/&gt;,它包括两方面的数据:     1)对应表单对象属性值(city);    2)用于构造整个下拉框选项的数据(cityList)...

DGenerationX的专栏 502

JUDE UML 操作技巧

1. How to create Assembly Connector - 1 Step 1: Step 2: Step 3: Completed 2. How to create Assembly Connector - 2 Step 1. There are two same interfaces on diagram. One is connected by...

DGenerationX的专栏 421

Java Thread: CountDownLatch 例子

public class CountDownLatchTest {    @Test  public void ThreadControllTest() throws InterruptedException{   // Suppose we have total 10 thread waiting to execute   final int TOTAL_THREAD_NUM = 10...

DGenerationX的专栏 352

eclipse indigo 目前运行时遇到的问题汇总

用了几天 Eclipse Indigo, 运行时经常无故退出。   1. 启动报错,can not initialize JVM     解决办法: 修改 eclipse.ini,将 XXMaxPermSize 改为 128M   2. 用 SVN Checkout 项目,经常报错,无故退出     这个问题让我百思不得其解,但是解决办法是,将我本地安装的 SVN Server 端 给...

DGenerationX的专栏 347

Java 如何获得本机IP 或者 公网IP

你应该是拔号上网 如果可以的话,请搜索一下网络,得到java怎么调用dos的方法,然后你可以解析ipconfig /all这个命令的结果,得到你想要的公网IP 大部分情况下,用户都是通过路由来上网的,也就是说,电脑根本不知道自己的公网IP是多少,他只知道路由分配给它的内网IP,这个时候,我们只能通过别的网站来判断。 下面是以前我以前写的一个小程序,通过www.ip138.com 得到自...

DGenerationX的专栏 343

Hibernate 2nd-level cache: JBoss Caching 配置与注意事项

依赖包: jboss-cache-1.4.1.jar jboss-client-4.0.2.jar jboss-common-client.jar jboss-jmx.ja jboss-system-4.0.2.jar jgroups-2.4.1.jar concurrence   check those under the attached file ensential-jar...

DGenerationX的专栏 335

Sysdeo Eclipse Tomcat Launcher plugin 使用总结

TomcatLauncher plugin 很轻量级,很喜欢. 以下是如何通过 TomcatLauncher 搭建Tomcat 开发环境 step-by-step   1. 工程目录:         注 1. conf/server.xml 直接拷贝自 Tomcat 安装目录下的conf 文件,唯一要修改的地方是        注 2. WEB-INF 下面还应创建一个 classes ...

DGenerationX的专栏 295

Hiberante 中 sort 的实现方式

http://hi.baidu.com/accpandsvse/blog/item/a12c22f23d0d1bc20a46e091.html http://hi.baidu.com/accpandsvse/blog/item/a12c22f23d0d1bc20a46e091.html 從資料庫的觀點來看,Set、Map、Bag是無序的,而List是有序的,這邊所謂的無序或有序,是指將容器...

DGenerationX的专栏 259

Java 打包成可执行程序 .exe

将java应用程序打包成独立运行的.exe方法 2009年02月06日 星期五 22:10 将java应用程序打包成独立运行的.exe方法 对于windows用户来说,将java应用程序打包成.exe最好不过了,现在我介绍两个方法。 1、用专业的应用程序打包工具InstallAnywhere,这个软件几乎能在所有平台上运行,当然你要下载到你需要的那个平台的啦!而且它也...

DGenerationX的专栏 251

JAXB Marchel and UnMarchel Quick Start

reference link: http://www.oracle.com/technetwork/articles/javase/index-140168.html (1.x) http://www.java-tips.org/java-ee-tips/java-architecture-for-xml-binding/what-is-new-in-jaxb-2.0.html   Plu...

DGenerationX的专栏 240
上一篇: eclipse indigo 目前运行时遇到的问题汇总
下一篇: JQuery实现图片的预加载与延时加载
伤神v
博客等级 码龄19年 17粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值