首页 > Linux > 运维之maven版Git上线脚本

运维之maven版Git上线脚本

2015年10月24日 发表评论 阅读评论

之前的文章曾写了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,http://www.bridgeli.cn/
原文链接:https://www.bridgeli.cn/archives/210
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Linux 标签: , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.