公司的开发环境每次部署项目都很麻烦,需要手动打包并上传上去。这个太麻烦了,所以就准备搞个自动打包的脚本。脚本自动从svn代码库里面更新最新的代码下来,然后maven打包,最后把war包丢到tomcat里面去。其实搞个Jenkins就完事了,但是还是想自己写个脚本玩玩,因此特意记录下自己写这些脚本的过程,方便后续查阅。

一、环境介绍

        CentOs6.9 + svn + maven

二、编写maven打包脚本

        这里先提一下,公司有个公共的框架项目framework,其他项目都依赖了它。所以其他项目打包前,都需要mvn install 一下这个公共框架项目。这个 mvn 命令执行后,想获取是编译成功还是失败了,就需要点技巧了。下面说说怎么获取mvn install 后是否编译成功的方案。
    一般来说,如果mvn install 后出现了BUILD SUCCESS字眼,那就说明是编译成功了。所以我们把 mvn命令的输出内容直接存放到一个文件中,然后我们在文件中查询有没有BUILD SUCCESS这个字符串,如果有就说明是编译成功了。

        下面为maven install 公共框架framework项目的脚本代码(/root/workspace/mvnscript/install_framework.sh):
#!/bin/sh
# this is maven install framework script
echo "[The install framework script is running.....]"
# go to framework dir
cd /root/workspace/framework # 定义该脚本的临时文件的名字
TmpFileName=/tmp/framework_sh_tmp # 先把原来的这个脚本的临时文件删除
rm -rf ${TmpFileName}* # 获取当前时间
Time=`date +"%Y%m%d%H%M%S"` # 把mvn命令的结果在屏幕显示的同时写入到文件中,文件名为:上面定义的文件名+当前时间
mvn clean install | tee ${TmpFileName}${Time} # 文件中查找 BUILD SUCCESS 字眼
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}` # 如果结果为空那就是失败,否则就成功了
if [ -z "$result" ];
then
echo "[ install framework error! -------- you can see the log on ${TmpFileName}${Time}]"
echo "[ ------------------------ script exit!! ------------------- ] "
exit
else
echo "[framework install SUCCESSS] "
fi
echo "[The install framework script is end]"
31
 
1
#!/bin/sh 
2
# this is maven install framework script
3
echo "[The install framework  script is running.....]"
4
# go to framework dir
5
cd /root/workspace/framework
6

7
# 定义该脚本的临时文件的名字
8
TmpFileName=/tmp/framework_sh_tmp
9

10
# 先把原来的这个脚本的临时文件删除
11
rm -rf ${TmpFileName}*
12

13
# 获取当前时间
14
Time=`date +"%Y%m%d%H%M%S"`
15

16
# 把mvn命令的结果在屏幕显示的同时写入到文件中,文件名为:上面定义的文件名+当前时间
17
mvn clean install | tee ${TmpFileName}${Time}
18

19
# 文件中查找 BUILD SUCCESS 字眼
20
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}`
21

22
# 如果结果为空那就是失败,否则就成功了
23
if [ -z "$result" ];
24
then
25
 echo "[ install framework error! --------  you can see the log on ${TmpFileName}${Time}]"
26
 echo "[ ------------------------ script exit!!  ------------------- ] "
27
 exit
28
else
29
 echo "[framework install SUCCESSS] "
30
fi
31
echo "[The install framework script is end]"
        下面为maven打包sp项目的脚本代码(/root/workspace/mvnscript/package_sp.sh):
#!/bin/sh
# this is maven package sp script
echo "[The package sp script is running.....]"
# go to sp dir
cd /root/workspace/sp # 定义该脚本的临时文件的名字
TmpFileName=/tmp/sp_sh_tmp # 先把原来的这个脚本的临时文件删除
rm -rf ${TmpFileName}* # 获取当前时间
Time=`date +"%Y%m%d%H%M%S"` # 把mvn命令的结果在屏幕显示的同时写入到文件中,文件名为:上面定义的文件名+当前时间
mvn clean package | tee ${TmpFileName}${Time} # 文件中查找 BUILD SUCCESS 字眼
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}` # 如果结果为空那就是失败,否则就成功了
if [ -z "$result" ];
then
echo "[ package sp error! -------- you can see the log on ${TmpFileName}${Time}]"
echo "[ ------------------------ script exit!! ------------------- ] "
exit
else
echo "[ sp package SUCCESSS] "
fi
echo "[The package sp script is end]"
x
 
1
#!/bin/sh
2
# this is maven package sp script
3
echo "[The package sp script is running.....]"
4
# go to sp dir
5
cd /root/workspace/sp
6

7
# 定义该脚本的临时文件的名字
8
TmpFileName=/tmp/sp_sh_tmp
9

10
# 先把原来的这个脚本的临时文件删除
11
rm -rf ${TmpFileName}*
12

13
# 获取当前时间
14
Time=`date +"%Y%m%d%H%M%S"`
15

16
# 把mvn命令的结果在屏幕显示的同时写入到文件中,文件名为:上面定义的文件名+当前时间
17
mvn clean package | tee ${TmpFileName}${Time}
18

19
# 文件中查找 BUILD SUCCESS 字眼
20
result=`grep 'BUILD SUCCESS' ${TmpFileName}${Time}`
21

22
# 如果结果为空那就是失败,否则就成功了
23
if [ -z "$result" ];
24
then
25
 echo "[ package sp error! --------  you can see the log on ${TmpFileName}${Time}]"
26
 echo "[ ------------------------ script exit!!  ------------------- ] "
27
 exit
28
else
29
 echo "[ sp package SUCCESSS] "
30
fi
31
echo "[The package sp script is end]"

        上面这个两个脚本主要目的其实是为了在执行maven命令的同时获取maven执行的结果,如果install或者package失败了,直接给出提示,并退出脚本。
       

三、编写自动svn更新代码+maven打包并发布的脚本

    因为sp项目依赖framework项目,所有每次都要先更新framework项目,然后再install。这样sp项目打包后的framework的依赖才是最新的。
  • 具体步骤为:
    • svn命令更新framework项目
    • svn命令更新sp项目
    • maven命令install公共框架项目framework
    • maven命令打包sp项目
    • 停止tomcat
    • 删除tomcat里面的项目
    • 把新打包好的项目copy到tomcat中
    • 启动tomcat
  • 脚本代码为(/root/deploy_sp.sh):
# 此脚本用于自动从svn上面更新sp代码并打包
cd /root/workspace/framework
echo "[ update framework from svn....]"
svn update
cd /root/workspace/sp
echo "[ update sp from svn....]"
svn update
echo "[ maven install framework ....]"
#导入安装framework脚本
source /root/workspace/mvnscript/install_framework.sh
echo "[ maven package sp....]"
#导入打包sp脚本
source /root/workspace/mvnscript/package_sp.sh
#打包完成后先停止tomcat
/root/tomcat-instance/shutdown_sp.sh
#删除tomcat里面原来的sp相关的war包和文件夹
rm -rf /root/tomcat-instance/sp-tomcat/webapps/sp*
#copy新的war包到tomcat里面
cp /root/workspace/sp/sp-deploy/target/sp.war /root/tomcat-instance/sp-tomcat/webapps/sp.war
echo "[ sp.war copy SUCCESS ]"
#重新启动tomcat
/root/tomcat-instance/sp-tomcat/bin/startup.sh
cd ~
echo [" sp deploy SUCCESS "]
 
1
# 此脚本用于自动从svn上面更新sp代码并打包
2
cd /root/workspace/framework
3
echo "[ update framework from svn....]"
4
svn update
5
cd /root/workspace/sp
6
echo "[ update sp from svn....]"
7
svn update
8
echo "[ maven install framework ....]"
9
#导入安装framework脚本
10
source /root/workspace/mvnscript/install_framework.sh
11
echo "[ maven package sp....]"
12
#导入打包sp脚本
13
source /root/workspace/mvnscript/package_sp.sh
14
#打包完成后先停止tomcat
15
/root/tomcat-instance/shutdown_sp.sh
16
#删除tomcat里面原来的sp相关的war包和文件夹
17
rm -rf /root/tomcat-instance/sp-tomcat/webapps/sp*
18
#copy新的war包到tomcat里面
19
cp /root/workspace/sp/sp-deploy/target/sp.war /root/tomcat-instance/sp-tomcat/webapps/sp.war
20
echo "[ sp.war copy SUCCESS ]"
21
#重新启动tomcat
22
/root/tomcat-instance/sp-tomcat/bin/startup.sh
23
cd ~
24
echo [" sp deploy SUCCESS "]

    这个脚本代码里有个好玩的东西就是用了source这个命令来实现类似于静态包含的功能,把其他脚本的内容导入进来。为什么要用这个东西?直接调用其他脚本不就好了。

        主要原因是那两个安装脚本和打包脚本有退出的功能,如果mvn命令执行失败,是直接退出了。如果我直接用调用的方式,就不能实现调用第一个脚本失败后,退出整个脚本;会出现第二个脚本继续执行的情况。这不是我想要的结果,我希望第一个脚本失败后就直接结束了。因此百度了一下怎么才能实现这种包含的功能,后面发现用source能够实现把其他脚本的内容导入到当前脚本来执行的功能。这个和java的jsp的静态包含的效果是类似的,因为它是相当于把其他脚本的内容拿到当前脚本来执行了,所以第一个脚本执行exit命令就相当于把整个脚本退出了。

    source命令导入功能参考链接:http://www.runoob.com/linux/linux-shell-include-file.html

四、小结

    (1)通过查找mvn命令执行后的关键字的方法来实现判断mvn命令是否执行成功
    (2)通过source命令来实现脚本的静态包含,从而实现导入的脚本中exit时可以退出整个脚本
        (3)其实也可以通过 $? 来判断mvn命令的执行结果
  

Linux下Maven+SVN自动打包脚本的更多相关文章

  1. linux下使用shell 自动执行脚本文件

    以下实例本人在Centos6.5 64位操作系统中使用 一.定时复制文件 a.在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件 文件内容: #将tomcat ...

  2. 在Linux下使用gradle自动打包

    一.下载软件包 1.下载地址 wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz wget http://services ...

  3. linux下简单的备份的脚本 2 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4577034 之前写过linux下简单的 ...

  4. React Native开发中自动打包脚本

    React Native开发中自动打包脚本 在日常的RN开发中,我们避免不了需要将我们编写的代码编译成安装包,然后生成二维码,供需要测试的人员扫描下载.但是对于非原生的开发人员来说,可能不知如何使用X ...

  5. Linux下安装SVN,仓库创建,用户权限管理

    Exported from Notepad++           Linux下安装SVN,仓库创建,用户权限管理 1.SVN安装 Ubuntu系统下安装:sudoapt-getinstallsubv ...

  6. ​Linux下的SVN服务器搭建

    ​Linux下的SVN服务器搭建 鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,故此总 ...

  7. linux下安装svn

    linux下SVN服务器如何搭建和使用 | 浏览:12117 | 更新:2013-09-18 14:28 | 标签:linux linux下SVN服务器如何搭建和使用?说到SVN服务器,想必大家都知道 ...

  8. linux下搭建svn本地服务器

    在linux下搭建svn本地服务器可以很好的管理自己的代码,具体过程如下: # mkdir svn_local # cd svn_local  # svnadmin create led_diplay ...

  9. xcode8.3 shell 自动打包脚本 记录

    题记 xcode升级8.3后发现之前所用的xcode自动打包基本无法使用,因此在网上零碎找到些资料,将之前的脚本简化.此次脚本是基于xcode证书配置进行打包(之前是指定描述文件.相对繁琐).因此代码 ...

随机推荐

  1. MVC与单元测试实践之健身网站(二)-管理员模块

    开始动手做这个项目时,发现无法做到完全的先设计.再编码,于是决定分模块进行,从管理员模块开始设计.编码,而且接口就已经改了好几次了. 管理员模块涉及的功能有登录和后台对管理员的维护,其中也涉及前端的开 ...

  2. Intellij IDEA创建javaweb步骤详解

    一.创建并设置javaweb工程 1.创建javaweb工程File --> New --> Project... 设置工程名字: 创建完成后工程结构如下: 2. Web工程设置2.1 在 ...

  3. 与ServletContext相关的监听器

    概述 与ServletContext相关的监听器有ServletContextListener与ServletContextAttributeListener. ServletContextListe ...

  4. Google Play内购测试

    Google Play内购测试 最近项目做海外版本,接入Google wallet支付后,测试验证比较繁琐,故记录一下. Google wallet支付方式接入完成后,需要按照如下步骤设置,才可以进行 ...

  5. Scala包的使用

    package big.data.analyse.scala.classes /** * Created by zhen on 2018/9/15. */ object Packages { def ...

  6. React 组件 API

    React 组件 API 在本章节中我们将讨论 React 组件 API.我们将讲解以下7个方法: 设置状态:setState 替换状态:replaceState 设置属性:setProps 替换属性 ...

  7. cent7安装ffmpeg

    FFmpeg是一个领先的多媒体框架工具集,几乎能够对任何格式的音视频文件进行解码,编码,转码,复用,解复用,流式传输,过滤和播放. 不管这些音视频文件所采用的格式是由某些标准委员会,社区还是公司设计的 ...

  8. 使用动态跟踪技术SystemTap监控MySQL、Oracle性能

    [IT168 技术]本文根据吕海波2018年5月11日在[第九届中国数据库技术大会]上的演讲内容整理而成. 讲师介绍: 吕海波,美创科技研究员,ITPUB管理版版主.出版技术书籍<Oracle内 ...

  9. Java 设计模式笔记

    0. 说明 转载 & 参考大部分内容 JAVA设计模式总结之23种设计模式 1. 什么是设计模式 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设 ...

  10. PgSQL基础之 安装postgresql数据系统

    参考这位仁兄的文章,真的非常好:https://blog.csdn.net/jerry_sc/article/details/76408116#创建数据目录 后来我又自己写了一个shell脚本,来自动 ...