本文主要介绍通过shell脚本完成在线发布,版本标签自动发布,在线功能轻松回滚。结合Jenkins参数化构建,可以实现自动发布。##分支名称tag_name='dev'IN_TAG=$tag_name##git地址GIT_DIR='git@github.com:****/paas-service-web.git'##项目名称GIT_PROJ_NAME=$(echo$GIT_DIR|awk-F/'$0=$NF'|awk-F\.'$0=$1')##工作目录WORKSPACE='/home/darren/data'##发布用户BUILD_USER='xiaozq'##行上服务器地址HOST='192.144.172.239'##服务器部署目录DEPLOY_DIR='/data/xiaoyaospace'这些参数需要改成自己对应的参数,需要配置ssh免密登录执行方式sh-xpaas_jenkins.sh分支名称依赖环境mavengitjdk流程图源码paas_jenkins.sh(接收jenkins传过来的参数,可以改成指定参数,直接运行)#!/bin/bashexportLANG="en_US.UTF-8"#exportPS4='[+]$(date+%H:%M:%S)info(@$LINENO):'##分支名称#tag_name=$1IN_TAG=$tag_name##git地址GIT_DIR=$git##项目名称GIT_PROJ_NAME=$(echo$GIT_DIR|awk-F/'$0=$NF'|awk-F\.'$0=$1')##工作目录#WORKSPACE='/home/darren/data'##releaseBUILD_USER=$BUILD_USER_ID##在线服务器地址HOST=$server_list##服务器部署目录DEPLOY_DIR=$deploy_dir##使用端口号SERVER_PORT=$server_port##检查项目起始地址HEALTH_CHECK_FILE=$health_check_fileecho"接收参数--"build_type:$build_type;tag_name:$tag_name;git:$git;server_list:$server_list;deploy_dir:$deploy_目录;服务器端口:$服务器端口;健康检查文件:$健康检查文件;BUILD_USER_ID:$BUILD_USER_ID"#切换到工作目录cd$WORKSPACEtest!-d"$WORKSPACE/$GIT_PROJ_NAME"&&echo"gitclone$GIT_DIR"&&gitclone$GIT_DIR#进入项目目录pushd$GIT_PROJ_NAME>/dev/nullecho$IN_TAG|egrep-q'^d-|^b-|^r-'if[$?-ne0];thengitfetchoriginif[$?-ne0];thenecho“无法连接到gitlab!"exit1;figitrev-listorigin/$IN_TAG>/dev/nullif[$?-ne0];thenecho"$tag_name分支不存在!"exit1;fiecho'检查代码是否合并...'diff=$(gitlogorigin/master^origin/$IN_TAG|wc-l)if[$diff-ne0];thenecho"请合并masterfirstCodetobranch$IN_TAG!"exit1;fiecho'代码已合并!'gitpullgitfetch--tagsgitcheckout$IN_TAGif[$?-ne0];thenexit1;figitpullgitcheckoutmasterif[$?-ne0];thenexit1;figitreset--hardo起源/主人如果[$?-ne0];然后退出1;fi##gitstatusgitmerge$IN_TAGif[$?-ne0];然后回显“无法合并到master!”退出1fi#gitstatustimestamp=$(date+%y%m%d%H%M)IN_TAG=r-$timestamp-$BUILD_USERgitfetch--tagsnum=$(gittag-l$IN_TAG|wc-l)if[$num-eq1];thenecho"标记冲突,一分钟后重新标记"sleep60timestamp=$(date+%y%m%d%H%M)IN_TAG=r-$timestamp-$BUILD_USERfigittag-a-m"$tag_name"$IN_TAGmastergitpushoriginmasterif[$?-ne0];然后回显“无法将代码推送到原点”exit1figitpushorigin--tagsif[$?-ne0];然后回显“无法将rtag推送到原点”exit1fifigitfetch--tagsgitreset--hard$IN_TAGif[$?-ne0];然后回显“$IN_TAG分支不存在!”退出1fimerge_count=$(find.-regex'.*\.js\|.*\.html\|.*\.htm\|.*\.css\|.*\.xml\|.*\.jsp\|.*\.properties'|xargsgrep"<<<<<<
/dev/null|wc-l)if[$merge_count-ne0];然后找到。-regex'.*\.js\|.*\.html\|.*\.htm\|.*\.css\|.*\.xml\|.*\.jsp\|.*\.properties'|xargsgrep"<<<<<</dev/nullecho"请在发布前解决代码冲突!"exit1fiecho"mvncleanpackage-DskipTests=true"mvncleanpackage-DskipTests=trueif[$?-ne0];然后退出1fipopdJAR_NAME=$(ls-al"$WORKSPACE/$GIT_PROJ_NAME/target"|grep"jar$"|awk'{print$9}')echo"$JAR_NAME"sshroot@$HOST"test-d$DEPLOY_DIR/$GIT_PROJ_NAME||mkdir-p$DEPLOY_DIR/$GIT_PROJ_NAME"if[$?-ne0];然后回显“远程执行命令失败!”exit1#continuefiecho"scp-p\"$WORKSPACE/$GIT_PROJ_NAME/target/$JAR_NAME\"root@$HOST:/tmp/"scp-p"$WORKSPACE/$GIT_PROJ_NAME/target/$JAR_NAME"root@$主机:/tmp/如果[$?-ne0];然后echo“文件同步失败!”exit1#continuefiecho"sshroot@$HOST\"rm-f$DEPLOY_DIR/$GIT_PROJ_NAME/$JAR_NAME&&cp-rf/tmp/$JAR_NAME$DEPLOY_DIR/$GIT_PROJ_NAME/\""sshroot@$HOST"rm-f$DEPLOY_DIR/$GIT_PROJ_NAME/$JAR_NAME&&cp-rf/tmp/$JAR_NAME$DEPLOY_DIR/$GIT_PROJ_NAME/"echo"sshroot@$HOST\"sh$DEPLOY_DIR/$GIT_PROJ_NAME/start.sh$JAR_NAME$SERVER_PORT$HEALTH_CHECK_FILE$DEPLOY_DIR\"||exit1"sshroot@$HOST"sh$DEPLOY_DIR/$GIT_PROJ_NAME/start.sh$JAR_NAME$SERVER_PORT$HEALTH_CHECK_FILE$DEPLOY_DIR"||exit1echo"sshroot@$HOST\"echo$IN_TAG>$DEPLOY_DIR/$GIT_PROJ_NAME/git_version\""sshroot@$HOST"echo$IN_TAG>$DEPLOY_DIR/$GIT_PROJ_NAME/git_version"echo"[DESC]IN=$tag_nameOUT=$IN_TAG"start.sh(放在部属的服务器上,远程调用)#!/bin/shecho"接收到的参数$#"PROJ_NAME=$1SERVER_PORT=$2HEALTH_CHECK_FILE=$3DEPLOY_DIR=$4HEALTCHECKURL="http://127.0.0.1:$SERVER_PORT/$HEALTH_CHECK_FILE"#ps-ef|grep"$PROJ_NAME"|grep-vgrepps-ef|grep"$PROJ_NAME"|grep-vgrep|grep-v'start.sh'|awk'NR==1{print$2}'|xargskill-9>/dev/null2>&1java-server-Xmx256m-jar-Dspring.profiles.active=prod"$DEPLOY_DIR/$PROJ_NAME">/tmp/paas.log&flag=0foriin$(seq30);dosleep1httpcode=$(curl-o/dev/null-s-m1--connect-timeout1-w%{http_code}"$HEALTCHECKURL")echo"Http检查$HEALTCHECKURLhttpcode是$httpcode"if["X$httpcode"=="X200"];然后echo-e"\nStart$PROJ_NAMEOK.\n"flag=1breakfidoneif[$flag-eq0];thenecho-e"\nStart$PROJ_NAMEisFAIL.\n"exit1fi