运维之maven版Git上线脚本

之前的文章曾写了Git怎么用和Git服务器怎么搭建,一个公司仅仅只有这些还是远远不够的,这些仅仅是对源码的管理,程序猿开发好的源码怎么编译、打包、部署上线呢?下面就需要运维来解决这个问题了,不过这一段时间公司老大让老夫负责公司的源码由SVN迁Git,有幸接触到一点这块的知识,今天记录一下,万一老夫哪天失业了转行去做运维了呢! 在开始正式文章之前,首先感谢一下我在小马金融的同事:张学军,此脚本原始版本是由学军提供的,然后加上老夫的优化,可以说没有学军的无私帮助,老夫不可能完成这个脚本的,所以,谢谢,学军! #!/bin/bash # 1. 环境变量配置 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 # 2. 基础路径与变量定义 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 # 备份旧的 ROOT 目录 if [ -d ROOT ]; then tar cfz "ROOT-$DATE.tar.gz" ROOT mv "ROOT-$DATE.tar.gz" wars/ fi # --- 函数定义 --- # Git 更新与版本切换函数 git_update() { tag_version=$1 cd "$dir_path/$work" git checkout master git pull echo "$tag_version" # 检查 tag 是否存在 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 # 校验当前分支 commit 是否与 tag 一致 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 } # Maven 构建函数 build() { local build_dir=$1 local build_work=$2 cd "$build_dir/$build_work" mvn package -DskipTests if [ -d "$build_dir/$build_work/target" ]; then cd "$build_dir/$build_work/target" return 0 else echo "build $build_dir/$build_work failed" exit 1 fi } # --- 主流程 --- # 1. 版本控制 tag_version=$1 if [ -z "$tag_version" ]; then printf "Please enter the version number\n" exit 1 else git_update "$1" echo "$1" >> "${dir_path}/tag.txt" fi # 2. 执行构建 build "$dir_path" "$work" type=$? if [ $type -eq 0 ]; then cd "$dir_path/$work/target" # 查找构建出的 war 包或 jar 包 (修正了原脚本 grep 的逻辑) # 假设生成的包名包含项目名且以 .war 或 .jar 结尾 work_name=$(ls | grep "$work" | grep -E "\.war$|\.jar$") else echo "build failure" exit 1 fi # 3. 清理旧部署 if [ -d "$dir_path/ROOT" ]; then rm -rf "$dir_path/ROOT" fi # 4. 部署新包 cd "$dir_path/$work/target/" # 将构建好的包重命名为 ROOT (模拟 Tomcat 默认部署) mv "$work_name" "$dir_path/ROOT" # 5. 覆盖配置文件 if [ -d "$dir_path/ROOT" ]; then # 使用 cp 替代 scp,因为是在本地操作 (原脚本使用 scp 可能是为了远程,若需远程请保留 scp 并补全路径) cp "$dir_path/config.properties" "$dir_path/ROOT/WEB-INF/classes/" cp "$dir_path/redis.properties" "$dir_path/ROOT/WEB-INF/classes/" cp "$dir_path/jdbc.properties" "$dir_path/ROOT/WEB-INF/classes/" fi # 6. 重启 Tomcat # 修正了原脚本中 grep 拼写错误 (gerp -> grep) 和逻辑连写问题 tomcat_status=$(ps aux | grep "$tomcat" | grep -v "grep" > /dev/null; echo $?) if [ $tomcat_status -eq 0 ]; then echo "Stopping Tomcat..." kill -9 $(ps aux | grep "$tomcat" | grep -v "grep" | awk '{print $2}') fi echo "Cleaning work and temp directories..." rm -rf "/usr/local/$tomcat/work/*" rm -rf "/usr/local/$tomcat/temp/*" echo "Starting Tomcat..." /usr/local/$tomcat/bin/startup.sh 注:里面的project_name是项目名,老夫隐藏了公司的实际项目名,就以project_name代替了,实际用的时候请根据实际情况修改 ...

October 24, 2015 · 3 分钟 · Bridge Li

Shell编程入门

一、Shell入门 我们先看一个小例子,永恒的经典:Hello World #!/bin/sh var="Hello World!" echo $var 保存,文件名为:hello 我们发现文件的第一行虽是一个注释,但是说明了文件的执行是由/bin/sh来执行,所以我们这么来执行这个文件: /bin/sh hello 就可以看到结果了,但我们知道在Linux下,一个文件是否可以执行是由文件属性来决定的,那么我们是否可以给他加上可执行权限,来执行这个文件呢? 先执行如下命令: chmod u+x hello 然后我们在直接敲命令:hello,看到什么现象? 所以一个文件被执行有这两个途径 二、Shell语法入门 输入/输出内部命令 ①. echo 输出命令 ②. read 输入命令 例如: #!/bin/sh echo Name: read NAME echo Phone: read PHONE echo SNAME,SPHONE > contact.txt if条件语句 在看if条件语句之前,我们先看一下:测试命令执行结果,在Linux下正确的命令执行结果为0,否则为其他值,我们可以用: echo $? 来看上一个命令的执行结果,懂了这些之后,我们在看那些常见语法 if 条件测试命令串 then 条件为真时执行的命令 else 条件为假时执行的命令 fi 注:if和then必须是两行,如果放一行,请在then前加“;” 例如: #!/bin/sh echo "Input file name:" read NAME if [ -d "$NAME" ]; then echo "Dir" else echo "Not Dir" fi case条件语句 case 条件测试命令串 in 表达式1) 分支1执行的命令 ;; 表达式2) 分支2执行的命令 ;; *) 其他命令 ;; esac 例如: ...

April 19, 2015 · 2 分钟 · Bridge Li