Jenkins+Git+Tomcat自动化部署(Linux环境Jenkins)

先看下参数构建页面效果

 说明:projectname是要部署的项目,SSH_Server是项目运行所在的服务器,GitBranch为分支,from_commitid为远程git仓库项目代码提交id的起始版本,to_commitid为截止版本,如下图,如果要得到红框提交版本的增量部署,那么起始版本为椭圆形的版本,截止版本为红框版本。

下面开始配置

1、设置参数:

 

 

 2、从git拉取代码:

 3、设置一下构建环境,每次构建前先清空工作空间:

 4、构建前准备,包括复制build.xml的ant脚本,(下面附上脚本)

<?xml version="1.0" encoding="UTF-8"?>  
<project name="Deploy" default="compile" basedir=".">  
    <property environment="env" />  
    <property name="webapp.name" value="Deploy" />  
    <property name="catalina.home" value="/usr/tomcat/apache-tomcat-7.0.94" />  
    <property name="dist.dir" value="${basedir}/dist" />  
    <property name="ant.dir" value="/usr/ant/apache-ant-1.9.14" />  
    <property name="webRoot.dir" value="${basedir}/WebRoot" />  
    <property name="src.dir" value="${basedir}/src" />  
    <!--<property name="config.dir" value="${basedir}/config" />-->  
    <property name="lib.dir" value="${webRoot.dir}/WEB-INF/lib" />  
    <property name="build.dir" value="${webRoot.dir}/WEB-INF" />  
    <!-- 使用eclipse jdt进行编译,而不使用JDK编译  -->  
    <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" />  
  
    <!-- 初始化classpath -->  
    <path id="project.classpath">  
        <fileset dir="${lib.dir}">  
            <include name="*.jar" />  
        </fileset>  
        <!-- 添加tomcat类路径 -->  
        <fileset dir="${catalina.home}/lib">  
            <include name="*.jar" />  
        </fileset>  
        <!-- ant lib包  -->  
        <fileset dir="${ant.dir}">  
            <include name="**/*.jar" />  
        </fileset>  
    </path>  
  
    <!-- get the source compile classpath in a printable form -->  
    <pathconvert pathsep="${line.separator}|   |-- "  
             property="echo.path.compile"  
             refid="project.classpath">  
    </pathconvert>  
      
    <!-- show classpath jars -->  
    <target name="print_classpath">  
        <echo message="|-- compile classpath"/>  
        <echo message="|   |"/>  
        <echo message="|   |-- ${echo.path.compile}"/>  
    </target>  
      
      
    <!-- 删除之前的目录结构 -->  
    <target name="clear" description="清理旧文件">  
        <delete dir="${build.dir}/classes" />  
        <delete dir="${dist.dir}" />  
        <delete file="${catalina.home}/webapps/${webapp.name}.war" />  
        <delete dir="${catalina.home}/webapps/${webapp.name}" />  
    </target>  
  
    <!-- 创建目录结构 -->  
    <target name="init" depends="clear" description="创建初始化目录结构">  
        <mkdir dir="${build.dir}/classes" />  
        <mkdir dir="${dist.dir}" />  
    </target>  
  
    <!-- 编译java -->  
    <target name="compile" depends="init" description="编译java文件">  
        <echo message="begin compile..." />  
        <javac srcdir="${src.dir}" destdir="${build.dir}/classes"   
            includeantruntime="false" nowarn="false"   
            source="1.6" target="1.6" deprecation="true" debug="true"    
            encoding="UTF-8" classpathref="project.classpath"   
            >  
            <compilerarg line="-Xlint:unchecked" />  
            <!--<classpath refid="project.classpath" /> --> 
        </javac>  
        <copy todir="${build.dir}/classes">  
            <!--<fileset dir="${src.dir}">  
                <include name="**/*.xml" />  
                <include name="**/*.properties" />  
                <include name="**/*.sql" />  
            </fileset>-->  
            <fileset dir="${src.dir}">  
                <exclude name="**/*.java" />  
                <exclude name="test/**.*" />
                <exclude name="**/*.properties" />
                <exclude name="**/*.propertites" />
            </fileset>
        </copy>
        <delete dir="${build.dir}/classes/test" />        
        <echo message="end compile..." />  
    </target>  
  
    <!-- 将class文件打成 jar包 -->  
       
        <target name="pack" depends="compile">   
            <jar jarfile="${build.dir}/${webapp.name}.jar">   
                <fileset dir="${build.dir}/classes">   
                    <include name="**/*.class"/>   
                </fileset>   
            </jar>   
        </target>   
      
  
    <!-- 打成war包, 名称默认为 项目名 -->  
    <target name="war" depends="compile" description="将工程打成war包">  
        <echo message="begin war..." />  
        <war destfile="${dist.dir}/${webapp.name}.war" basedir="${webRoot.dir}"   
            webxml="${webRoot.dir}/WEB-INF/web.xml">  
            <lib dir="${lib.dir}" />  
            <classes dir="${build.dir}/classes" />  
            <fileset dir="${webRoot.dir}">  
                <include name="***.*" />  
            </fileset>  
        </war>  
        <echo message="end war..." />  
    </target>  
  
    <!-- copy war包 tomcat的deploy目录 -->  
    <!--
    <target name="deploy" depends="war" description="部署项目">  
        <echo message="begin deploy..." />  
        <copy file="${dist.dir}/${webapp.name}.war" todir="${catalina.home}/webapps" />  
        <echo message="end deploy..." />  
    </target>  
    -->
  
</project> 
View Code

5、ant编译:

 6、编译后获取增量class文件(附上代码):

#!/bin/bash
cd $WORKSPACE
projectname=ABC
stringName=compile_list.txt
stringName1=filelist.txt
src=WebRoot/WEB-INF/classes
scsspath=/scss/$projectname/webapps/$projectname/
#python loop.py -otf $stringName -ntf $stringName1
cp $stringName $stringName1

# 把清单中的属于配置文件的地址以及测试目录去掉,如xml和properties文件,test目录下的文件

sed -i '/./{/.xml/d;/.properties/d;/.propertites/d;//test/d}' $stringName

# 把com目录下如果有xml文件,则加入到增量清单中

grep ^.*/com/.*.xml.*$ $stringName1>>$stringName


# 把增量清单文件地址改为本地服务器文件地址

TheStart=$WORKSPACE/
sed -i "s#^#$TheStart&#g" $stringName

sed -i "/./{s/.java/.class/;s#src#$src#}" $stringName

#sed -i 's/.java/.class/g' $stringName
#sed -i 's#src#$src#g' $stringName

# 若果不是文件,为目录的行则删除掉

sed -i -e '/./!d' $stringName
localdir=$WORKSPACE
tempdir=$localdir/temp
WebRoot=$tempdir/WebRoot/
cd $localdir 
# 如果存在旧的temp目录,则删除掉
if [ -d "$tempdir" ];then
rm -rf $tempdir 
echo 删除旧的temp目录
fi
mkdir $tempdir
#复制增量清单为一个临时文件tempfile.txt备用,后面用这个临时文件生成增量目录清单

#cp $stringName tempfile.txt
cp $stringName origindir.txt
#sed -i 's#$localdir#$tempdir#g' tempfile.txt


#遍历目录清单并按清单新建目录
echo 按目录清单新建目录并把增量文件复制到temp目录下
while read line
do
#把temp目录加在路径里
eval newfilepath=${line/$localdir/$tempdir}
 #获取temp的文件路径,不包含文件名
eval newfiledir=`dirname $newfilepath`
if [ ! -d "$newfiledir" ];then
#新建temp目录下的文件路径
eval mkdir -p $newfiledir    
echo 新建目录$newfiledir完成
fi  
#以圆点分割去掉原文件路径中文件扩展名,并获取左边部分
eval originfilepath=${line%.*}
if [ -f $originfilepath.class ];then
eval cp $originfilepath*.class $newfiledir/
elif [ -f $originfilepath.xml ];then
eval cp $originfilepath.xml $newfiledir/
else
eval cp $originfilepath*.* $newfiledir/
fi
done<origindir.txt

#生成增量清单
if [ -f $projectname\_$GitBranch.xls ];then
yes|rm $projectname\_$GitBranch.xls
fi
for files in `find  $tempdir -name "*.*"`
do
    echo  $files >>$projectname\_$GitBranch.xls
done
echo 生成增量清单$projectname\_$GitBranch.xls

#把清单中每行的文件地址由本地地址变更为项目服务器地址

sed -i "s#$WebRoot#$scsspath#g" $projectname\_$GitBranch.xls

if [ -d "$WebRoot" ];then
cd $WebRoot
else
echo 增量文件复制到temp目录没有成功或版本$from_commitid到版本$to_commitid间根本就没有增量文件!!!
exit 1
fi

echo 进入$WebRoot目录打tar包
tar -cvf WebRoot.tar ./

cd $WORKSPACE
cp  $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_NUMBER/log $WORKSPACE/ 
error=`cat log|grep ": Error"`

if [ ! -n "$error" ];then
echo 构建完成。
else
echo 构建出错!!!
exit 1
fi
View Code

7、构建后通过SSH把增量文件上传到服务器,并解压,重启服务

cd /scss/$projectname/webapps
compiledir=$projectname

if [ "$projectname" == "sds" ];then
 compiledir=sds
fi
if [ "$projectname" == "ATFE" ];then
 compiledir=TFE
fi
if [ $firsttime == Y ];then
tar zcvf $compiledir.tar.gz $compiledir
fi
cp /scss/$projectname/webapps/temp/WebRoot/WebRoot.tar WebRoot.tar
rm -rf temp
tar -xvf  WebRoot.tar -C $compiledir

pid=`ps aux|grep java|grep $projectname|grep -v grep|awk '{print $2}'`
if [ "${pid}" ]; then
    kill -9 $pid
else
   echo "server is not started,can startup"  
fi
sh /scss/$projectname/bin/startup.sh
sleep 10
pid=`ps aux|grep java|grep $projectname|grep -v grep|awk '{print $2}'`
if [ "${pid}" ]; then
    echo "restart ok,server is running and pid=$pid"
else
   echo "restart fail,server is not started"  
    exit 1
fi

配置完成,就可以构建了。

 还有需要把下面这些文件放到Linux的ant/lib目录下:

 这些安装了eclipse的话都会有的,去eclipse下面找

晚生不才,请多指教!
原文地址:https://www.cnblogs.com/lkc-test/p/11891563.html