jenkins+svn+ant+tomcat+socket自动部署(Windows下,其实linux也差不多)

jenkins自动部署含socket的项目

前几天,我想用Jenkins实现代码更新,自动编译并部署,就研究了一下,我也是小白,就弄了几天而已。
我采用的是Jenkins+svn+ant+tomcat,用Jenkins来管理,svn提交代码,ant来编译,最后部署在tomcat上。
tomcat的配置这些,那些教程上都有,我也不细说了,我就提几点我遇到的问题和解决方案,具体步骤大家百度一下吧,虽然有很多都不全,但是我也找到几个比较全的,本来想放链接的,但是找不到了,下面我还是大概介绍一下吧。

  • 第一步 下载Jenkins,ant,tomcat,svn,安装配置好,这个就不细说了,安装包就直接安装,压缩包就解压,然后配置一下环境变量,基本就完成了,需要注意的是Jenkins和tomcat的默认端口都是8080,需要改一下
  • 第二步 那些怎么使用Jenkins这些都是比较简单的,这个在网上都好找,我就说一下配置项目那一块吧
    这里写图片描述
    这是最开始的,名称填上就行了,这个可以跟实际项目名字不同,也没什么重要的
    这里写图片描述
    这里就是配置svn,那个URL就是项目代码存在svn上的路径,第二个就是从svn下载代码需要的账号和密码,其它的我都没改了
    这里写图片描述
    这里就是配置什么时候构建的。具体意思我也是查出来的,我圈出来第一个勾上,就是强制构建,具体构建的时间,勾上之后会像下面弹出来一个日程表,在日程表里面配置。我圈出来的第二个,也就是我勾上的,就是检查svn代码,有更新才构建,日程表里面的意思就是每10分钟检查一次更新,如果有更新就构建,如果没有就不构建。
    这里写图片描述
    这里就是我弄得最久的,如果项目中没有socket或者说不需要有些特殊的,就不用写下面的命名,也不用勾选execute Windows batch command,上面invoke ant就是说构建用ant,里面什么都不写,就是ant执行需要的build.xml就放在Jenkins的workspace中项目的根目录下,这样Jenkins在构建项目的时候就会自动调用ant去编译了。还有一点没有提到的就是,Jenkins需要的有些插件需要自己下载,没有的自己下载一下,不知道下哪些的,百度一下就出来了。
    ant的build.xml如下
<?xml version="1.0" encoding="UTF-8" ?>
<project name="ROOT" default="war" basedir=".">
    <!--<property name="tomcat.lib" value="/opt/apache-tomcat-8.0.45/lib" />-->
    <property name="tomcat.lib" value="D:/worksoft/Tomcat8.5/lib" />
    <property name="dest.dir" value="${basedir}/WebRoot/WEB-INF/classes" />
    <property name="src.dir" value="src" />
    <!-- 定义属性,打成war包的名称。 -->
    <property name="warFileName" value="ROOT.war">
    </property>

    <target name="clean">
        <delete dir="${dest.dir}" />
        <delete file="${basedir}/${warFileName}">
        </delete>
        <echo>删除完成!</echo>
    </target>
    <target name="init" depends="clean">
        <mkdir dir="${dest.dir}" />
        <echo>初始化完成!</echo>
    </target>
    <target name="build" depends="init">
        <javac srcdir="${src.dir}" destdir="${dest.dir}" includeantruntime="on" debug="true">
            <!--给编译器指定编码,防止出现:"警告: 编码 GBK 的不可映射字符"-->
            <compilerarg line="-encoding UTF-8 " />
            <classpath>
                <fileset dir="${tomcat.lib}">
                    <include name="*.jar" />
                </fileset>
                <fileset dir="WebRoot/WEB-INF/lib">
                    <include name="*.jar" />
                </fileset>
            </classpath>
        </javac>
        <!--复制源代码以外的其他文件如mybaits/hibernate的映射文件等-->  
        <copy todir="${basedir}/WebRoot/WEB-INF/classes">
            <fileset dir="${src.dir}" excludes="**/*.java" />
        </copy>
        <!--复制配置文件-->  
        <copy todir="${basedir}/WebRoot/WEB-INF/classes">
            <fileset dir="${basedir}/resources">
                <include name="*.xml" />
                <include name="*.properties" />
            </fileset>
        </copy>

        <copy todir="${basedir}/WebRoot/WEB-INF/classes">

            <fileset dir="${basedir}/resources">
            <include name="**/**.*" />
            <exclude name="**/*.java"/>

            </fileset>

        </copy>
        <echo>编译完成!</echo>
    </target>

    <!-- 定义默认任务,将class文件集合成jar包。 -->
    <target name="war" depends="build">
        <!-- 删除原有war包。 
        <delete dir="${basedir}/${warFileName}" />-->
        <echo>${basedir}/${warFileName}生成war准备!</echo>
        <!-- 建立新war包。 -->
        <war destfile="${basedir}/${warFileName}" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
            <!-- 将非jar和非class文件拷贝到war包的对应路径下。 -->
            <fileset dir="${basedir}/WebRoot">
                <include name="**/**.*" />
                <exclude name="**/*.jar" />
                <exclude name="**/*.class" />
            </fileset>
            <!-- 将jar和class文件拷贝到war包的对应路径下。 -->
            <lib dir="${basedir}/WebRoot/WEB-INF/lib" />
            <classes dir="${dest.dir}" />
        </war>
        <echo>${basedir}/${warFileName}生成war完成!</echo>
    </target>

</project>

上面图片下面的windows脚本就是因为我那个项目需要接受socket发的数据,相当于有一部分是socket的客户端,监听了两个端口。就是这样,导致了我那个项目在tomcat里启动的时候,我再部署就部署不上去了,因为Jenkins比较智能,在它完全部署好一个项目之前,是不会去动之前的项目的。所以我之前tomcat里运行的项目监听了那两个端口,Jenkins部署的项目又监听那两个端口,就报错了,也就部署不成功了,所以我就写了这个脚本。我估计Jenkins本身应该有这样的配置,因为我是小白,没找到,所以只好写Windows脚本来先关闭tomcat,然后把tomcat里面的项目删除,然后再启一个空的tomcat,这就是我这段脚本的作用。
这里写图片描述
最后一步就是配置一下tomcat,首先就是配置war的路径,context path就是别人访问你的项目的路径,我这里不写的意思就是,别人直接访问我的ip+端口号就可以访问这个项目了,不需要加项目名字,然后就是配置tomcat的账号密码,还有访问这个tomcat的ip和端口号,这里是支持部署在远程的服务器上的,我这里是直接部署在本地的。但是这里需要注意的是,要给tomcat配置账号密码和角色,就在tomcat的conf文件夹的tomcat-user.xml里面,配置内容如下:

 <role rolename="manager-gui" />
 <role rolename="manager-status" />
 <role rolename="manager-jmx" />
 <role rolename="manager-script"/>
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>

 <user username="tomcat" password="tomcat" roles="manager-gui,manager-status,manager-jmx,manager-script,admin-gui,admin-script"/>

整个过程就是这样,其实别人也写了,但是我主要想写的就是我遇到的那些问题:

  • 1. 要先把代码用ant编译通过,运行没有问题,如果单独用ant编译不过,Jenkins用ant还是编译报错
  • 2. ant的build.xml一定要写对,不然编译的时候会出问题
  • 3. 也是我最想说的,因为这个问题我在网上没找到解决办法,我上谷歌搜到了同样的问题,却没有解决方案,虽然我的解决办法不好,但是至少解决了问题,就是上面的脚本解决项目含socket部署的问题,刚才我又改了一下脚本,因为有的时候占用端口的进程没有关闭,会导致socket接收不到数据,所以我加了一段脚本,用来强行kill占用端口的进程,完成的脚本如下:
@echo restart tomcat8.5 service, delete ROOT.war

@echo 1. stop tomcat8.5 service 

@echo 2. 删除ROOT.war

@echo 3. start tomcat8.5 service 

echo [%date%%time%] 准备重新启动tomcat 

echo [%date%%time%] 停止服务 

cd D:\worksoft\Tomcat8.5\bin\

call shutdown.bat

echo [%date%%time%] 强制停止占用95269527端口的进程
set port=9527
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"^|findstr "LISTENING"') do (
    echo kill the process %%m who use the port %port%
    taskkill /pid %%m -f
)
set port2=9526
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port2%"^|findstr "LISTENING"') do (
    echo kill the process %%m who use the port %port2%
    taskkill /pid %%m -f
)

echo [%date%%time%] 删除ROOT.war

cd D:\worksoft\Tomcat8.5\webapps

del /a /f /q ROOT.war

rd /s /q D:\worksoft\Tomcat8.5\webapps\ROOT

echo [%date%%time%] 重新启动 

cd D:\worksoft\Tomcat8.5\bin\

call startup.bat

echo -------------------------------------------------------- 

echo 
  • 本来感觉有好多要写的,我弄了一周左右踩了好多坑,但是真正写的时候又忘了,对不住大家了。。。希望对大家有点帮助

    这里加一句,就是build.xml是放在Jenkins的安装目录下的workspace文件夹中项目名文件夹中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值