地址:http://tieba.baidu.com/p/800871177
构建的定义:构建就是把源代码转换成class文件的过程
构建解决的问题:研发给的class进行部署,然后我们就会发现研发给的东东有许多错误;给的class文件不是最新的;更甚至一个项目需要多个工程进行合并才能运行.
为什么要构建:一般研发是通过IDE工具进行构建的,当研发给出的错误的class文件时,压根在测试中就发现不了问题;所以我们要寻求另一种途径来编译class文件.
构建的主流程:先整合在一起,然后进行编译,生产jar包,最后自动部署到测试机上。
搭建自动构建环境:
1 安装版本控制工具(cvs或svn)
2 编译工具(或构建工具,代码走查工具)
3 邮箱
下面以java 在windows环境下为例:
1 安装cvs(或svn)工具
2 安装ant
a)部署JDK环境,配置jdk环境变量
b)下载ant包,然后进行解压;配置环境变量
c)进入cmd,确定ant安装成功
d)ant的介绍:ant的核心是build.xml 文件 以下是一个简单的build.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<project name="SVN Ant Test" default="start" basedir=".">
<taskdef resource="checkstyletask.properties" classpath="C:\Program Files\CruiseControl\apache-ant-1.7.0\lib\checkstyle-all-4.4.jar"/>
<property name="svn.user" value="yanshunhua"/>
<property name="svn.password" value="yanshunhua#6268"/>
<property name="svn.url" value=" http://192.168.0.85/svn/archives/PMO/team/shyan/temp"/>
<property name="local.dir" value="${basedir}"/>
<property name="classes" value="${basedir}\classes"/>
<property name="jar" value="hello.jar"/>
<property name="lib" value="${basedir}\lib"/>
<target name="init">
<tstamp>
<format property="today" pattern="yyyyMMdd" offset="0" unit="day"/>
</tstamp>
<property name="tag.curr.no" value="ITMaster_520_build_10006_${today}" />
<echo message="tag.curr.no:${tag.curr.no}" />
</target>
<target name="prepare" depends="init" description="Prepare the dirs for other tasks">
<delete dir="src"/>
<delete dir="classes"/>
<delete dir="lib"/>
<delete dir="log"/>
<mkdir dir="classes"/>
<mkdir dir="lib"/>
<mkdir dir="log"/>
</target>
<!--SVN CheckOut-->
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask" />
<target name="checkout" depends="prepare">
<svn username="${svn.user}" password="${svn.password}" javahl="true">
<checkout url="${svn.url}" revision="HEAD" destPath="${local.dir}" />
</svn>
</target>
<!--Src Checkstyle-->
<target name="checkstyle" depends="checkout">
<ant antfile="checkstyle_build.xml" output="${basedir}\log\checkstyle_build-${today}.log" />
</target>
<!--run-->
<target name="compile" depends="checkstyle">
<javac srcdir="${basedir}\src" destdir="${classes}"/>
</target>
构建的定义:构建就是把源代码转换成class文件的过程
构建解决的问题:研发给的class进行部署,然后我们就会发现研发给的东东有许多错误;给的class文件不是最新的;更甚至一个项目需要多个工程进行合并才能运行.
为什么要构建:一般研发是通过IDE工具进行构建的,当研发给出的错误的class文件时,压根在测试中就发现不了问题;所以我们要寻求另一种途径来编译class文件.
构建的主流程:先整合在一起,然后进行编译,生产jar包,最后自动部署到测试机上。
搭建自动构建环境:
1 安装版本控制工具(cvs或svn)
2 编译工具(或构建工具,代码走查工具)
3 邮箱
下面以java 在windows环境下为例:
1 安装cvs(或svn)工具
2 安装ant
a)部署JDK环境,配置jdk环境变量
b)下载ant包,然后进行解压;配置环境变量
c)进入cmd,确定ant安装成功
d)ant的介绍:ant的核心是build.xml 文件 以下是一个简单的build.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<project name="SVN Ant Test" default="start" basedir=".">
<taskdef resource="checkstyletask.properties" classpath="C:\Program Files\CruiseControl\apache-ant-1.7.0\lib\checkstyle-all-4.4.jar"/>
<property name="svn.user" value="yanshunhua"/>
<property name="svn.password" value="yanshunhua#6268"/>
<property name="svn.url" value=" http://192.168.0.85/svn/archives/PMO/team/shyan/temp"/>
<property name="local.dir" value="${basedir}"/>
<property name="classes" value="${basedir}\classes"/>
<property name="jar" value="hello.jar"/>
<property name="lib" value="${basedir}\lib"/>
<target name="init">
<tstamp>
<format property="today" pattern="yyyyMMdd" offset="0" unit="day"/>
</tstamp>
<property name="tag.curr.no" value="ITMaster_520_build_10006_${today}" />
<echo message="tag.curr.no:${tag.curr.no}" />
</target>
<target name="prepare" depends="init" description="Prepare the dirs for other tasks">
<delete dir="src"/>
<delete dir="classes"/>
<delete dir="lib"/>
<delete dir="log"/>
<mkdir dir="classes"/>
<mkdir dir="lib"/>
<mkdir dir="log"/>
</target>
<!--SVN CheckOut-->
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask" />
<target name="checkout" depends="prepare">
<svn username="${svn.user}" password="${svn.password}" javahl="true">
<checkout url="${svn.url}" revision="HEAD" destPath="${local.dir}" />
</svn>
</target>
<!--Src Checkstyle-->
<target name="checkstyle" depends="checkout">
<ant antfile="checkstyle_build.xml" output="${basedir}\log\checkstyle_build-${today}.log" />
</target>
<!--run-->
<target name="compile" depends="checkstyle">
<javac srcdir="${basedir}\src" destdir="${classes}"/>
</target>
<target name="clean" depends="compile">
<jar jarfile="${lib}\${jar}" basedir="${classes}"/>
</target>
<!--Findbugs-->
<target name="findbugs" depends="clean">
<ant antfile="findbugs_build.xml" output="${basedir}\log\findbugs_build-${today}.log" />
</target>
<!--Ant Email-->
<target name="email">
<mail mailhost="192.168.1.212" mailport="25" subject="Test Ant">
<from address="yanshunhua@mantis.com"/>
<to address="yanshunhua@mantis.com"/>
<!--<cc address="limeng@mantis.com"/>-->
<message>This is test</message>
<fileset dir="${basedir}">
<include name="*.bak"/>
</fileset>
</mail>
</target>
<target name="start">
<ant target="findbugs"/>
<ant target="email"/>
</target>
</project>
关于build.xml 简单介绍:
<?xml version="1.0" encoding="UTF-8" ?> 这是xml的头文件
<project> 根节点
<project name="SVN Ant Test" default="start" basedir=".">
default是调用project根下面的某个target,name属性可以自己定义 ,basedir是根目录 注意到是basedir属性可以作为变量
<target>标签 target标签是把每一步功能划分开来
<target name="prepare" depends="init" description="Prepare the dirs for other tasks">
<delete dir="src"/>
<delete dir="classes"/>
<delete dir="lib"/>
<delete dir="log"/>
<mkdir dir="classes"/>
<mkdir dir="lib"/>
<mkdir dir="log"/>
</target>
<!--SVN CheckOut-->
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask" />
<target name="checkout" depends="prepare">
<svn username="${svn.user}" password="${svn.password}" javahl="true">
<checkout url="${svn.url}" revision="HEAD" destPath="${local.dir}" />
</svn>
</target>
第一个target作用是删除老文件夹,创建新文件夹,后面一个target是自动从svn上迁出源代码.
我们把代码迁出来了,我们会发现ant自动生成了3个文件夹分别是src,classes,lib。src文件夹是放源码的,classes和lib是空的,作用后面讲。
这一步做好,我们需要面临一个选择:1。直接编译,2。java代码走查;一般正规的需要进行代码走查,于是延伸出了另一个xml文件;
<ant antfile="checkstyle_build.xml" output="${basedir}\log\checkstyle_build-${today}.log" />
这个脚本的作用是调用外部的*_build.xml文件并生成log日志。
ant标签还支持文件的增,删,移动
<delete dir="src"/>,这个就是删除名为src的文件夹. 注意到是每次构建环境需要一个干净的环境。
<!--run-->
<target name="compile" depends="checkstyle">
<javac srcdir="${basedir}\src" destdir="${classes}"/>
</target>
这个就是编译的target,简单不?一行命令(哈哈)。javac是jdk的命令,srcdir="${basedir}\src"这个属性就定义需要编译的远文件路径.destdir="${classes}"这个属性是把编译好的class文件放入指定的目录.
<jar jarfile="${lib}\${jar}" basedir="${classes}"/>
</target>
<!--Findbugs-->
<target name="findbugs" depends="clean">
<ant antfile="findbugs_build.xml" output="${basedir}\log\findbugs_build-${today}.log" />
</target>
<!--Ant Email-->
<target name="email">
<mail mailhost="192.168.1.212" mailport="25" subject="Test Ant">
<from address="yanshunhua@mantis.com"/>
<to address="yanshunhua@mantis.com"/>
<!--<cc address="limeng@mantis.com"/>-->
<message>This is test</message>
<fileset dir="${basedir}">
<include name="*.bak"/>
</fileset>
</mail>
</target>
<target name="start">
<ant target="findbugs"/>
<ant target="email"/>
</target>
</project>
关于build.xml 简单介绍:
<?xml version="1.0" encoding="UTF-8" ?> 这是xml的头文件
<project> 根节点
<project name="SVN Ant Test" default="start" basedir=".">
default是调用project根下面的某个target,name属性可以自己定义 ,basedir是根目录 注意到是basedir属性可以作为变量
<target>标签 target标签是把每一步功能划分开来
<target name="prepare" depends="init" description="Prepare the dirs for other tasks">
<delete dir="src"/>
<delete dir="classes"/>
<delete dir="lib"/>
<delete dir="log"/>
<mkdir dir="classes"/>
<mkdir dir="lib"/>
<mkdir dir="log"/>
</target>
<!--SVN CheckOut-->
<taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask" />
<target name="checkout" depends="prepare">
<svn username="${svn.user}" password="${svn.password}" javahl="true">
<checkout url="${svn.url}" revision="HEAD" destPath="${local.dir}" />
</svn>
</target>
第一个target作用是删除老文件夹,创建新文件夹,后面一个target是自动从svn上迁出源代码.
我们把代码迁出来了,我们会发现ant自动生成了3个文件夹分别是src,classes,lib。src文件夹是放源码的,classes和lib是空的,作用后面讲。
这一步做好,我们需要面临一个选择:1。直接编译,2。java代码走查;一般正规的需要进行代码走查,于是延伸出了另一个xml文件;
<ant antfile="checkstyle_build.xml" output="${basedir}\log\checkstyle_build-${today}.log" />
这个脚本的作用是调用外部的*_build.xml文件并生成log日志。
ant标签还支持文件的增,删,移动
<delete dir="src"/>,这个就是删除名为src的文件夹. 注意到是每次构建环境需要一个干净的环境。
<!--run-->
<target name="compile" depends="checkstyle">
<javac srcdir="${basedir}\src" destdir="${classes}"/>
</target>
这个就是编译的target,简单不?一行命令(哈哈)。javac是jdk的命令,srcdir="${basedir}\src"这个属性就定义需要编译的远文件路径.destdir="${classes}"这个属性是把编译好的class文件放入指定的目录.