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已在后台运行,已无窗口!

 

 

 

 

 

 

SIMULINK开发项目实例 1000 例专栏之第960例--基于电力系统稳定性的建模与仿真场景:-含分布式电源的配电网电压稳定性研究 间歇性与随机性:例如,太阳能依赖于日照强度,风能依赖于风速,这使得它们的输出功率具有不确定性。逆变器接口:大多数分布式电源通过逆变器接入电网,这对电网的动态响应特性产生了影响。位置分散:通常分布在用户侧或靠近负荷中心的位置。本文详细介绍了如何使用Simulink结合Simscape Electrical 构建一个用于研究含分布式电源配电网电压稳定性的模型,并提供了详细的仿真流程说明。 阅读详情

相关推荐

SAP 公司间库存调拨通过IDOC完成自动发票校验

本文仅用于SAP软件的应用与学习,不代表SAP公司。(注:文中所示截图来源SAP ERP软件,软件相应著作权归SAP所有。公司间采购时,通过SAP内部EDI 数据传输功能, 由销售方开的公司间发票自动触发采购方的发票校验。​欢迎扫码加如下微信,我会把大家拉到SAP PP学习群,随时欢迎跟我和其他SAP PP顾问一起交流和学习,如下图库存调拨订单,系统已经完成了发货方发货和收货方收货。

2402_84262664的博客 923

CruiseControl编译与安装

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

aekkprvz836124的博客 189

CTF实战:手把手教你用Python破解转轮机加密(附完整脚本)

本文详细介绍了如何使用Python逆向破解转轮机加密,特别针对CTF比赛中的Crypto类题目。通过解析转轮机加密原理、实战Python脚本编写及调试技巧,帮助参赛者快速掌握破解方法,提升在攻防世界等CTF比赛中的解题效率。

silver的专栏 1116

持续集成之CruiseControl

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

Tang Ji Zhong 197

PyTorch实战(12)——图神经网络(Graph Neural Network,GNN)

在本节中,我们首先简要概述了图神经网络 (Graph Neural Network, GNN) 的核心概念与应用,GNN 通过构建计算图分层聚合节点特征,解决了传统神经网络处理图数据时的四大局限:信息深度不足、节点顺序敏感、动态扩展困难和特征稀疏性问题。了解了不同类型的图学习任务(包括节点级、边级和图级三大类)。接着我们研究了几种流行的 GNN 模型,包括:GCN (通过权重共享实现图卷积)、GAT (引入注意力机制区分邻居重要性)和 GraphSAGE (采用随机采样应对大规模图)。

盼小辉丶的博客 3652

TIA protal与SCL从入门到精通(1)——SCL编程入门

SCL语言是由Pascal而生的结构化程序语言,与梯形图相(LAD)比,SCL语言的灵活程度更高,易于编写控制算法。 本教程基于的平台如下 软件:TIA 15.1 CPU 1516 (1)直接创建纯SCL的程序块儿; (2)在LAD/FBD中在插入SCL程序段。 在程序段中直接右击插入即可,但是插入的程序段并不能完全使用SCL语法,GOTO等跳转指令就不能使用。在SCL中一般不能使用绝对地址进...

苦走一口田 7万+

编译器与集成开发环境

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

hyl52101314的博客 3507

飞腾平台(FT2000/4 D2000/8)配置GPIO引脚

飞腾平台配置CPU的引脚为GPIO工作模式的方式有永久型和暂时型: - 永久型是通过UEFI中的MmioWrite32函数来实现的,该方法可以在UEFI阶段就对复用引脚的工作模式配置为GPIO,并且在进入操作系统后仍然不会发生便会; - 临时型是通过rw工具,在系统下手动修改复用引脚的工作模式,该方法在系统重启后会失效,所以是暂时型的。

qq_30135687的博客 5614

敏捷持续集成工具CruiseControl

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

东子的博客 1155

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%)

效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1258

RK3588开发笔记-Hailo AI模块调试

本文详细介绍了在RK3588开发板上调试HailoAI模块的全过程。首先概述了RK3588处理器的强大性能(4核A76+4核A55,6TOPS算力)和Hailo-8 AI加速模块的特点,重点阐述了通过PCIe接口连接两者的硬件方案。调试步骤包括:确认内核PCIe配置、编译Hailo驱动、下载固件文件并部署到指定目录,最后通过运行resnet模型验证模块性能(实测FPS达2456)。文中提供了完整的软件包下载地址和GitHub源码链接,为开发者实现类似AI加速方案提供了实用参考。

flypig has a dream! 963

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

FM收音机调试-RDA5807M

收音机调试 IC型号:RDA5807M

mangofu的博客 6163

CruiseControl配置详解

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

闸北米 3084

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

多文件/文件夹打包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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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、付费专栏及课程。

余额充值