Linux下Maven+SVN自动打包脚本详解程序员

    公司的开发环境每次部署项目都很麻烦,需要手动打包并上传上去。这个太麻烦了,所以就准备搞个自动打包的脚本。脚本自动从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命令的执行结果
  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/6555.html

(0)
上一篇 2021年7月16日 23:32
下一篇 2021年7月16日 23:32

相关推荐

发表回复

登录后才能评论