运维之maven版Git上线脚本
之前的文章曾写了Git怎么用和Git服务器怎么搭建,一个公司仅仅只有这些还是远远不够的,这些仅仅是对源码的管理,程序猿开发好的源码怎么编译、打包、部署上线呢?下面就需要运维来解决这个问题了,不过这一段时间公司老大让老夫负责公司的源码由SVN迁Git,有幸接触到一点这块的知识,今天记录一下,万一老夫哪天失业了转行去做运维了呢!
在开始正式文章之前,首先感谢一下我在小马金融的同事:张学军,此脚本原始版本是由学军提供的,然后加上老夫的优化,可以说没有学军的无私帮助,老夫不可能完成这个脚本的,所以,谢谢,学军!
#!/bin/bash export JAVA_HOME=/usr/local/jdk1.7.0_67 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH dir_path="/apps/project/project_name" work="project_name" DATE=`date +%Y%m%d%H%M` tomcat="apache-tomcat-6.0.41_project_name" cd $dir_path if [ ! -d wars ];then mkdir wars fi if [ -d ROOT ];then tar cfz ROOT-$DATE.tar.gz ROOT mv ROOT-$DATE.tar.gz wars/ fi git_update(){ tag_version=$1 cd $dir_path/$work git checkout master git pull echo $tag_version git_tag=`git tag|grep -x $tag_version` if [ "$git_tag" = "$tag_version" ];then git checkout -b `date +%Y%m%d%H%M` $git_tag else printf "tag number input error n" exit 1 fi git_id1=`git log -1 --format=%H` git_id2=`git show $git_tag |grep commit |awk '{print $2}' |head -1` if [ "$git_id1" != "$git_id2" ];then printf "The current git branch where inconsistent tag number is correct , please check the tag number n" exit 1 fi } tag_version=$1 if [ "$tag_version" = "" ];then printf "Please enter the version number n" exit 1 else git_update $1 echo $1 >> ${dir_path}/tag.txt fi build(){ dir_path=$1 work=$2 cd $dir_path/$work mvn package -DskipTests if [ -d $dir_path/$work/target ];then cd $dir_path/$work/target else echo "build $dir_path/$work failed" exit fi return 1 } build $dir_path $work type=$? if [ $type -eq 1 ];then cd $dir_path/$work/target work_name=`ls |grep $work |grep -v "war|jar|gz"` else echo "build failure" exit 1 fi if [ -d $dir_path/ROOT ];then rm -rf $dir_path/ROOT fi cd $dir_path/$work/target/ mv $work_name $dir_path/ROOT if [ -d $dir_path/ROOT ];then scp $dir_path/config.properties $dir_path/ROOT/WEB-INF/classes/ scp $dir_path/redis.properties $dir_path/ROOT/WEB-INF/classes/ scp $dir_path/jdbc.properties $dir_path/ROOT/WEB-INF/classes/ fi tomcat_status=`ps aux |grep $tomcat |grep -v "gerp">/dev/null;echo $?` if [ $tomcat_status -eq 0 ];then kill -9 `ps aux |grep $tomcat |grep -v "grep"|awk '{print $2}'`;rm -rf /usr/local/$tomcat/work/*;rm -rf /usr/local/$tomcat/temp/*;/usr/local/$tomcat/bin/startup.sh else rm -rf /usr/local/$tomcat/work/*;rm -rf /usr/local/$tomcat/temp/*;/usr/local/$tomcat/bin/startup.sh fi
注:里面的project_name是项目名,老夫隐藏了公司的实际项目名,就以project_name代替了,实际用的时候请根据实际情况修改
首先说这个脚本的语法,如果看不太明白的话,可以参考老夫的这篇文章,一定可以看明白的,但当你看明白之后,一定会有一些迷惑,这是毫无疑问的,因为在第一次执行这个脚本之前还有两项准备工作要做:
1. 在git_update方法里面一开始就是git checkout,并没有git clone,说明最起码第一次我们要手动先 git clone 一下,当然从第二次开始就不用了;
2. 我们可以猜到 dir_path 是一个很随意建的目录,但这个脚本里面并没有把编译、打包之后的代码拷贝或剪切到tomcat的webapps目录下并且重命名为ROOT,而是放在了 dir_path 下并且被重命名为了 ROOT ,这和tomcat并没有关系啊,嗯,是的,并没有什么关系,因为这里做了一个软连接,也就是 dir_path 写的 ROOT 和tomcat中webapps下的ROOT做了一个软连接,至于软连接的命令,老夫就不多说了,不知道的自己用Google百度去;
最后要在解释三个问题:
1. scp,这个大家肯定都看懂了,就是用运维自己的这几个配置文件覆盖源码中的配置文件,为什么要这么做呢?老夫刚工作的时候很不理解,现在终于想明白了这件事,实际上线上的数据库、缓存等等之类的并不能真正的对程序猿开放,这些东西知道的人越少越好,因为程序猿可能会盲目自信(这句话并没有黑程序猿的意思啊,因为老夫本身就是程序猿,仅仅是从安全性上考虑的),去改线上库里面的东西,所以,最多给他一个读的权限而已,线上写的权限,还是运维自己保留的好;
2. 此脚本是根据系统的tag号进行的上线,即每次上线必须打tag,然后根据此tag进行上线,这样做的好处,老夫在之前Git开发最佳实践中已经说过了,就不多赘述了,不知道的可以看这篇文章;
3. 别忘了给这个脚本加x权限;
综合以上,其实已经没有问题了,但老夫实际操作中还是出现了问题(汗,可能老夫人品有问题),报了一个:/bin/sh^M: bad interpreter: No such file or directory异常,那叫一个郁闷啊,最后查资料得知:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息,那么这个问题怎么解决呢?其实很简单,有以下两种方法:
1)在Windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具先将脚本编码转换,再放到Linux中执行。转换方式如下(UltraEdit):File–>Conversions–>DOS->UNIX即可。
2)也可在Linux中转换:
首先要确保文件有可执行权限
#chmod u+x filename
然后修改文件格式
#vim filename
利用如下命令查看文件格式
:set ff
或
:set fileformat
可以看到如下信息
fileformat=dos
或
fileformat=unix
利用如下命令修改文件格式
:set ff=unix
或
:set fileformat=unix
然后存盘退出
:wq
最后再执行文件
#./filename
好了,这就不会再报这个错了
参考资料:http://www.linuxidc.com/Linux/2011-09/42618.htm
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/210
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论