ant 一个自动化构建的工具
可以帮你实现自动化打包和发布到web环境上。
项目目录如下:
项目一:common-framework
项目二:estun-platform-web
其中项目一是项目二的框架,需要先把项目一打包成jar包,然后把这个jar包传到项目二的lib里面,供项目二使用。
整体流程如下:
一:把项目一打包成jar包
二:把项目二打包成war包(记得传项目一的jar包进来lib里面)
三:把war包传到tomcat的webapps下进行发布。
四:这里也可以不用传war包,直接通过tomcat的manmger 管理页面进行发布。
具体详解如下:
#####################################################
一:common-framework.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="common-framework" basedir="./common-framework" default="jar">
<property environment="env" />
<property name="temp" value="temp"/>
<property name="jar.dir" value="${basedir}"/>
<property name="lib.dir" value="lib"/>
<property name="src.dir" value="src"/>
<target name="init">
<delete dir="${temp}"/>
<delete file="${basedir}/common-framework.jar" />
<mkdir dir="${temp}"/>
</target>
<target name="cp3" >
<echo message="拷贝rt.jar ,开始。。。"/>
<copy todir="${lib.dir}">
<fileset dir="${env.JAVA_HOME}/jre/lib">
<include name="rt.jar" />
</fileset>
</copy>
<echo message="拷贝jar,完成!"/>
</target>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<target name="compile" depends="init,cp3">
<javac srcdir="${src.dir}" destdir="${temp}" classpathref="classpath"/>
</target>
<target name="cp4" depends="compile">
<copy todir="${temp}">
<fileset dir="${src.dir}">
<include name="**/**.*" />
<exclude name="**/*.jar"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="jar" depends="cp4">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${temp}"/>
</target>
</project>
#####################################################
二和三:build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="start_tomcat" basedir="./estun-platform-web">
<!-- 流程说明:
1.定义变量
2.初始化工作:删除build目录,建build目录
3.下载svn代码到文件夹
4.替换文件夹中的文件
5.javac编译;war打包
6.停tomcat
7.删除tomcat下的webapps下的文件夹和war包
8.把war包传到tomcat/webapps下
9.启动tomcat
-->
<!-- 1.定义变量 -->
<echo message="1.定义变量,开始。。。"/>
<!-- 加载环境变量 -->
<property environment="env" />
<!-- java源代码目录 -->
<property name="src.dir" location="src" />
<!-- 构建目录 -->
<property name="build.dir" location="build" />
<!-- class文件目录 -->
<property name="build.classes" location="${build.dir}/classes" />
<!-- 打包目录 -->
<property name="build.war" location="${build.dir}/war" />
<!-- 打包后的文件名-->
<property name="war.name" value="estun-platform-web" />
<!-- WebContent 根目录 -->
<property name="web.root" value="WebContent" />
<property name="web.WEB-INF" location="${web.root}/WEB-INF" />
<property name="web.lib" location="${web.WEB-INF}/lib" />
<!-- common-framework 根目录-->
<property name="common-framework.dir" location="../common-framework" />
<!-- tomcat根目录 -->
<property name="tomcat.home" location="/opt/apache-tomcat-8.0.36" />
<property name="tomcat.webapps" location="${tomcat.home}/webapps" />
<property name="tomcat.lib" location="${tomcat.home}/lib" />
<property name="tomcat.bin" location="${tomcat.home}/bin" />
<property name="ant.dir" value="${env.ANT_HOME}" />
<echo message="1.定义变量,完成!"/>
<!-- 2.初始化工作:删除build目录,建build目录 -->
<target name="init" description="初始化">
<echo message="2.初始化工作:删除build目录,建build目录,开始。。。"/>
<delete dir="${build.dir}"/>
<mkdir dir="${build.dir}" />
<mkdir dir="${build.classes}" />
<mkdir dir="${build.war}" />
<echo message="2.初始化工作:删除build目录,建build目录,完成!"/>
</target>
<!-- 3.下载svn代码到文件夹 jenkins自己完成这个操作 -->
<!-- 通过jenkins更新svn代码。当然,也可以通过ant更新svn代码 -->
<!-- 4.替换文件夹中的文件 -->
<target name="cp" depends="init">
<echo message="4.替换webapps中的文件,开始。。。"/>
<delete file="${src.dir}/main/resource/jdbc.properties" />
<delete file="${src.dir}/main/resource/site.properties" />
<delete file="${src.dir}/main/resource/upload.properties" />
<copy todir="${src.dir}/main/resource">
<fileset dir="/root/.jenkins/workspace/workspace/webapps">
<include name="**/*.*" />
</fileset>
</copy>
<echo message="4.替换webapps中的文件,完成!"/>
</target>
<!-- 4.1拷贝jre/lib/rt.jar文件到webapps/lib下 -->
<target name="cp2" depends="cp">
<echo message="拷贝rt.jar 和 common-framework.jar,开始。。。"/>
<copy todir="${web.lib}">
<fileset dir="${env.JAVA_HOME}/jre/lib">
<include name="rt.jar" />
</fileset>
</copy>
<delete file="${web.lib}/common-framework.jar" />
<copy todir="${web.lib}">
<fileset dir="${common-framework.dir}">
<include name="common-framework.jar" />
</fileset>
</copy>
<echo message="拷贝rt.jar 和 common-framework.jar,完成!"/>
</target>
<!-- 5.javac编译;war打包 -->
<!-- 定义编译时的classpath(定义路径,编译java文件时用到的jar包) -->
<path id="compile.path">
<fileset dir="${web.lib}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${tomcat.lib}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${ant.dir}/lib">
<include name="**/*.jar" />
</fileset>
<pathelement location="${build.classes}"/>
</path>
<target name="compile" depends="cp2" description="编译">
<echo message="编译开始。。。" />
<javac destdir="${build.classes}" srcdir="${src.dir}" includeantruntime="false" fork="true" nowarn="on" debug="true" >
<compilerarg line="-encoding UTF-8 " />
<compilerarg line="-Xlint:unchecked" />
<classpath refid="compile.path" />
</javac>
<echo message="编译完成!" />
<echo message="拷贝非java文件,开始。。。" />
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/activity/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/apply/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/article/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/center/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/comment/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/enterprise/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/fund/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/help/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/main/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/member/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/message/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/news/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/order/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/partner/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/pay/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/product/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/reward/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/service/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/shop/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/task/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/user/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/wxpay/java" excludes="**/*.java"/>
</copy>
<copy todir="${build.classes}" >
<fileset dir="${src.dir}/main/resource" excludes="**/*.java"/>
</copy>
<echo message="拷贝非java文件,完成!" />
</target>
<!-- 删除webapps/lib下的rt.jar -->
<target name="del" depends="compile" description="删除jar">
<echo>删除jar,开始。。。</echo>
<delete file="${web.lib}/rt.jar" />
<echo>删除jar完成!</echo>
</target>
<target name="war" depends="del" description="打包war文件">
<echo>打包开始。。。</echo>
<war destfile="${build.war}/${war.name}.war" webxml="${web.WEB-INF}/web.xml">
<!-- 将非jar和非class文件拷贝到war包的对应路径下。 -->
<fileset dir="${web.root}">
<include name="**/**.*" />
<exclude name="**/*.jar"/>
<exclude name="**/*.class"/>
</fileset>
<!-- 将jar和class文件拷贝到war包的对应路径下。 -->
<lib dir="${web.lib}" />
<classes dir="${build.classes}" />
</war>
<echo>打包完成!</echo>
</target>
<!--
6.停tomcat
7.删除tomcat下的webapps下的文件夹和war包
8.把war包传到tomcat/webapps下
9.启动tomcat
-->
<target name="stop_tomcat" depends="war" >
<echo message="停止tomcat,开始。。。" />
<exec executable="/bin/sh" failonerror="false" append="true">
<arg line="-c 'kill -9 `/usr/sbin/lsof -n -P -t -i :8080` '" /> <!-- 系统要有lsof命令-->
</exec>
<sleep seconds="5"/>
<echo message="停止tomcat,完成!" />
</target>
<!-- 删除tomcat-webapps下的war包和目录;复制war包到tomcat的webapps下 -->
<target name="delcopy" depends="stop_tomcat" description="删除和拷贝">
<echo>删除tomcat->webapps下的war包和目录;复制war包到tomcat->webapps下,开始。。。</echo>
<delete file="${tomcat.webapps}/${war.name}.war" />
<delete dir="${tomcat.webapps}/${war.name}" />
<copy todir="${tomcat.webapps}">
<fileset dir="${build.war}" includes="*.war" />
</copy>
<echo>删除和拷贝war完成!</echo>
</target>
<target name="start_tomcat" depends="delcopy" >
<echo message="启动tomcat,开始。。。" />
<!-- <exec executable="${tomcat.bin}/startup.sh" failonerror="false" /> -->
<exec executable="/bin/sh" failonerror="false" append="true" >
<arg line="-c '${tomcat.bin}/catalina.sh start'" />
</exec>
<sleep seconds="6"/>
<echo message="启动tomcat,完成!" />
</target>
</project>
jenkins方面的设置:
a。系统管理-Global Tool Configuration
在这里添加ant的路径,需要添加,不然ant时会失败。
b。系统管理-系统设置
添加build_id的全局变量,需要添加,不然tomcat启动时,会失败。
之前就是因为没有加这个环境变量,导致一直启动tomcat启不启来,苦恼了我多日,
虽然现在知道了解决方案,但还是不知道为什么。
网上有人说是因为你启动tomcat是最后一步,当你执行完ant的最后一步后,jenkins就认为构建结束了,就会把相关构建进程给杀掉,但是实际你这时tomcat start并未完成启动好就被杀掉了。那如果是这样的话,为什么加了个build_id的全局变量后,就会好了呢? 高手知道的请留言。
c。系统管理-管理节点-新建节点:
这里我添加一个节点。为什么我要添加一个节点呢?
因为jienkins是发布在我A环境,但是我要发布的web环境是在B环境,我不想在B环境再部署一个jenkins,我想通过A环境的jenkins来把war包部署到B环境,
所以我就新增了一个B环境的节点。后面点击立即构建时,都是到B环境上进行的。
接上图
d。新建job项目-源码管理:
e。新建job项目-构建:
f。
这时点击立即构建,就可以了,可以看日志了
#####################################################
四:
a。jenkins做如下操作:
a。1:系统管理-系统设置-全局属性:
键:BUILD_ID
值:allow_to_run_as_daemon
a。2:
b。tomcat下的conf的tomcat-users.xml文件最下面添加这么一句话:
<user username="admin" password="123456" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
c。构建前,要确保你项目名下有war文件,如下图:
d。点击立即构建后,日志如下:
这时jenkins会把test001下的war包传到tomcat/webapps下,然后发布。
(我的环境再传war包时有一段时间)
出现上图的success,说明发布完成,这时通过浏览器访问 http://ip:8080/包名/
#####################################################