#!/bin/bash ################################################################ #@Authro Lijian #@Date 2007-06-08 #@param1 -h target host #@param2 -p ssh port for target host #@param3 -v git pull version or commit #@param4 -c if true, only change autoconfig, don't update source code #@param5 -g git group, not null #@param6 -b app branch for git #@param7 -a app name #@param8 -e Deploy or Rollback or other #@param9 -s servers aws qcloud dev test #@param10 -r rollback file #@param11 -t tag #/bin/sh deploy.sh -gyoho30 -p22 -bdev -ayoho-message -eDeploy -sdev ################################################################ BASE_BIN_DIR=`dirname $0` #. $BASE_BIN_DIR/scripts/iptable/qcloud_gray/app-iptable.sh #. $BASE_BIN_DIR/scripts/iptable/aws/app-iptable.sh #. $BASE_BIN_DIR/scripts/iptable/qcloud/app-iptable.sh #. $BASE_BIN_DIR/scripts/iptable/test/app-iptable.sh #. $BASE_BIN_DIR/scripts/iptable/dev/app-iptable.sh #. $BASE_BIN_DIR/scripts/iptable/test_nj_1/app-iptable.sh #. $BASE_BIN_DIR/scripts/iptable/test_nj_2/app-iptable.sh . $BASE_BIN_DIR/scripts/env.sh ################### Input parameter for user ################################### SSH_HOST="" SSH_PORT=22 CODE_VERSION="" NOT_UPDATE="false" GIT_GROUP=$DEFAULT_GIT_GROUP APP_BRANCH="" APP_NAME="" EXE_COMMOND="" SERVERS="" ROLLBACK_FILE="" TAG_NAME="" param(){ if [ $1 ]; then prefix=`expr substr $1 1 2` if [ $prefix = "-h" ]; then SSH_HOST=`echo $1|awk '{print substr($0, 3)}'` fi if [ $prefix = "-p" ]; then SSH_PORT=`echo $1|awk '{print substr($0, 3)}'` fi if [ $prefix = "-v" ]; then CODE_VERSION=`echo $1|awk '{print substr($0,3)}'` fi if [ $prefix = "-c" ]; then NOT_UPDATE="true" fi if [ $prefix = "-g" ]; then GIT_GROUP=`echo $1|awk '{print substr($0,3)}'` fi if [ $prefix = "-b" ]; then APP_BRANCH=`echo $1|awk '{print substr($0,3)}'` fi if [ $prefix = "-a" ]; then APP_NAME=`echo $1|awk '{print substr($0,3)}'` fi if [ $prefix = "-e" ]; then EXE_COMMOND=`echo $1|awk '{print substr($0,3)}'` fi if [ $prefix = "-s" ]; then SERVERS=`echo $1|awk '{print substr($0,3)}'` fi if [ $prefix = "-r" ]; then ROLLBACK_FILE=`echo $1|awk '{print substr($0,3)}'` fi if [ $prefix = "-t" ]; then TAG_NAME=`echo $1|awk '{print substr($0,3)}'` fi fi } #parse parameter param $1 param $2 param $3 param $4 param $5 param $6 param $7 param $8 param $9 param ${10} param ${11} if [ -z $GIT_GROUP ]; then echo "**************************************************************************" echo "*Error: git group is null [$GIT_BASE_URL GIT_GROUP/$APP_NAME.git]*********" echo "*Please add -g args. For example: sh deploy -gyoho30, yoho30 is git group*" echo "**************************************************************************" exit 1 fi echo -e "\033[33m[INFO] GIT_BASE_URL=$GIT_BASE_URL$GIT_GROUP" echo -e "\033[33m[INFO] APP_BRANCH=$APP_BRANCH" echo -e "\033[33m[INFO] SSH_HOST=$SSH_HOST" echo -e "\033[33m[INFO] SSH_PORT=$SSH_PORT" echo -e "\033[33m[INFO] CODE_VERSION=$CODE_VERSION" echo -e "\033[33m[INFO] NOT_UPDATE=$NOT_UPDATE" echo -e "\033[33m[INFO] APP_NAME=$APP_NAME" echo -e "\033[33m[INFO] EXE_COMMOND=$EXE_COMMOND" echo -e "\033[33m[INFO] SERVERS=$SERVERS" echo -e "\033[33m[INFO] ROLLBACK_FILE=$ROLLBACK_FILE" echo -e "\033[33m[INFO] TAG_NAME=$TAG_NAME" echo -ne "\033[0m" ################################################################################ ################################ Init path for app ############################# BASE_HOME=$HOME #OPPS_HOME=$BASE_HOME/opps OPPS_HOME=$BASE_HOME/auto_deploy echo "OPPS_HOME=$OPPS_HOME" OPPS_DEPLOY_HOME=$OPPS_HOME/deploy IDENTITY_FILE="/home/dev/auto_deploy/apps/yoho-cobar/dev/master/server/target/cobar-server.zip" echo "OPPS_DEPLOY_HOME=$OPPS_DEPLOY_HOME" APPS_BASE_HOME=$OPPS_HOME/apps echo "APPS_BASE_HOME=$APPS_BASE_HOME" BACKUP_BASE_HOME=$OPPS_HOME/backup echo "BACKUP_BASE_HOME=$BACKUP_BASE_HOME" init(){ REMOTE_BASE_HOME=/home/$USER_LOGIN echo "REMOTE_BASE_HOME=$REMOTE_BASE_HOME" PROJECT_TARGET=$APP_NAME.zip echo "PROJECT_TARGET=$PROJECT_TARGET" PROJECT_SOURCE_BASE_DIR=$APPS_BASE_HOME/$APP_NAME echo "PROJECT_SOURCE_BASE_DIR=$PROJECT_SOURCE_BASE_DIR" PROJECT_SOURCE_DIR=$PROJECT_SOURCE_BASE_DIR/$SERVERS echo "PROJECT_SOURCE_DIR=$PROJECT_SOURCE_DIR" ROJECT_SOURCE_BRANCH_DIR=$PROJECT_SOURCE_DIR/$APP_BRANCH echo "ROJECT_SOURCE_BRANCH_DIR=$ROJECT_SOURCE_BRANCH_DIR" WEB_APP_BACKUP_DIR_PARENT=$BACKUP_BASE_HOME/$APP_NAME echo "WEB_APP_BACKUP_DIR_PARENT=$WEB_APP_BACKUP_DIR_PARENT" WEB_APP_BACKUP_DIR=$WEB_APP_BACKUP_DIR_PARENT/$SERVERS echo "WEB_APP_BACKUP_DIR=$WEB_APP_BACKUP_DIR" WEB_APP_ROOT=$REMOTE_BASE_HOME/$APP_NAME echo "WEB_APP_ROOT=$WEB_APP_ROOT" #WEB_APP_HOME=$WEB_APP_ROOT/deploy AUTOCONFIG_HOME=$OPPS_DEPLOY_HOME/autoconfig/$SERVERS echo "AUTOCONFIG_HOME=$AUTOCONFIG_HOME" IPATBLE_HOME=$OPPS_DEPLOY_HOME/scripts/iptable/$SERVERS echo "IPATBLE_HOME=$IPATBLE_HOME" AUTOCONFIG_HOME_BASE=$OPPS_DEPLOY_HOME/autoconfig echo "AUTOCONFIG_HOME_BASE=$AUTOCONFIG_HOME_BASE" IPATBLE_HOME_BASE=$OPPS_DEPLOY_HOME/scripts/iptable echo "IPATBLE_HOME_BASE=$IPATBLE_HOME_BASE" } ################################# main ###################################### main(){ if [ $EXE_COMMOND = "Deploy" ]; then deploy elif [ $EXE_COMMOND = "Rollback" ]; then rollback elif [ $EXE_COMMOND = "Back" ]; then break else echo "EXE_COMMOND error!" fi } ################################Update source code & package#################### package(){ echo "package beging" ####update autoconfig # if [ -d "$AUTOCONFIG_HOME" ]; then # echo "[INFO] start to update config..." # cd $AUTOCONFIG_HOME_BASE # echo `pwd` # git pull origin master # fi ####update ipyables if [ -d "$IPATBLE_HOME" ]; then echo "[INFO] start to update ips..." cd $IPATBLE_HOME_BASE echo `pwd` git pull origin master fi ## always remove old code echo " start to remove existed src folder: $ROJECT_SOURCE_BRANCH_DIR " rm -rf $ROJECT_SOURCE_BRANCH_DIR ###update source code if [ ! -d "$PROJECT_SOURCE_DIR" ]; then echo "[INFO] git clone -b $APP_BRANCH $GIT_BASE_URL$GIT_GROUP/$APP_NAME.git $APP_BRANCH" if [ ! -d "$APPS_BASE_HOME" ]; then echo "[INFO] make APPS_BASE_HOME :" $APPS_BASE_HOME mkdir $APPS_BASE_HOME fi if [ ! -d "$PROJECT_SOURCE_BASE_DIR" ]; then echo "[INFO] make PROJECT_SOURCE_BASE_DIR :" $PROJECT_SOURCE_BASE_DIR mkdir $PROJECT_SOURCE_BASE_DIR fi if [ ! -d "$PROJECT_SOURCE_DIR" ]; then echo "[INFO] make PROJECT_SOURCE_DIR :" $PROJECT_SOURCE_DIR mkdir $PROJECT_SOURCE_DIR fi fi cd $PROJECT_SOURCE_DIR git clone -b $APP_BRANCH $GIT_BASE_URL$GIT_GROUP/$APP_NAME.git $APP_BRANCH ## finaly, checkout to tags if [ "$TAG_NAME" != "" ]; then echo "start to checkout out to : $TAG_NAME" cd $ROJECT_SOURCE_BRANCH_DIR git tag -l git checkout tags/$TAG_NAME -b branch-$TAG_NAME fi cd $ROJECT_SOURCE_BRANCH_DIR/server ###package app echo "[INFO] start to package application..." # if [ ! -d $AUTOCONFIG_HOME ]; then # mkdir -p $AUTOCONFIG_HOME # fi #sh $ROJECT_SOURCE_BRANCH_DIR/bin/mvn-package.sh $AUTOCONFIG_HOME/${APP_NAME}-autoconfig.properties $AUTOCONFIG_HOME/global-autoconfig.properties /usr/local/maven/bin/mvn package -P $SERVERS -Dmaven.test.skip=true echo "[INFO] package application finish." } ####################################Backup app######################################## backup(){ echo "backup beging" if [ -d $BACKUP_BASE_HOME ]; then echo "[INFO] BACKUP_BASE_HOME dir exist." else mkdir $BACKUP_BASE_HOME fi if [ -d $WEB_APP_BACKUP_DIR_PARENT ]; then echo "[INFO] WEB_APP_BACKUP_DIR_PARENT dir exist." else mkdir $WEB_APP_BACKUP_DIR_PARENT fi if [ -d $WEB_APP_BACKUP_DIR ]; then echo "[INFO] backup dir exist." else mkdir $WEB_APP_BACKUP_DIR fi echo "[INFO] backup dir is [$WEB_APP_BACKUP_DIR]" if [ -f $IDENTITY_FILE ]; then echo "[INFO] cp -f $IDENTITY_FILE $WEB_APP_BACKUP_DIR/$PROJECT_TARGET.$TIMESTAMP" cp -f $IDENTITY_FILE $WEB_APP_BACKUP_DIR/$PROJECT_TARGET.$TIMESTAMP fi } ######################################synch app######################################## synch(){ echo "[INFO] synch " $1 if [ $1 = "localhost" ]; then echo "[INFO] mkdir $OPPS_DEPLOY_HOME/$APP_NAME" mkdir $OPPS_DEPLOY_HOME/$APP_NAME echo "[INFO] cp -r $OPPS_DEPLOY_HOME/$APP_NAME $BASE_HOME" cp -r $OPPS_DEPLOY_HOME/$APP_NAME $BASE_HOME echo "[INFO] rm -rf $OPPS_DEPLOY_HOME/$APP_NAME" rm -rf $OPPS_DEPLOY_HOME/$APP_NAME echo "[INFO] cp $IDENTITY_FILE $BASE_HOME/$APP_NAME" cp $IDENTITY_FILE $BASE_HOME/$APP_NAME else if [ -z $USER_HOME ]; then USER_LOGIN=`awk -v item=$1 'BEGIN{ split (item, host, "@"); print host[1]}'` init fi echo "[INFO]synch scp -p $IDENTITY_FILE $1:$WEB_APP_ROOT" scp -p $IDENTITY_FILE $1:$WEB_APP_ROOT fi echo "synch end" } ################################################################################# ##################################deploy app######################################## deploy(){ init package backup #后加载ips . $IPATBLE_HOME/app-iptable.sh app_ips=${APP_NAME//-/_}_${SERVERS}_ips if [ -z $SSH_HOST ]; then if [ -z `eval echo \\${$app_ips[@]}` ]; then app_ips=DEV_DEFAULT_SERVER fi echo "[INFO] app_ips = ${app_ips[*]}" for var in `eval echo \\${$app_ips[@]}`; do synch $var if [ $var = "localhost" ]; then sh $BASE_HOME/$APP_NAME/deploy/bin/function.sh $BASE_HOME $APP_NAME else ssh -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server" echo "ssh -p $SSH_PORT $var unzip $REMOTE_BASE_HOME/$APP_NAME/cobar-server.zip" ssh -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/cobar-server.zip -d $REMOTE_BASE_HOME/$APP_NAME/" echo "ssh -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh " fi done else echo "[INFO] SSH_HOST = $SSH_HOST" arr=(${SSH_HOST//,/ }) for var in ${arr[@]}; do synch $var ssh -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server" ssh -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/cobar-server.zip -d $REMOTE_BASE_HOME/$APP_NAME/" echo "ssh -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh " done fi } #################################rollback app######################################## rollback(){ init #后加载ips . $IPATBLE_HOME/app-iptable.sh echo "[INFO] App start to rollback[$WEB_APP_BACKUP_DIR]......." echo -e "\033[33mPlease choose a version to rollback..." echo -ne "\033[0m" echo "[INFO] ROLLBACK_FILE=$ROLLBACK_FILE" app_ips=${APP_NAME//-/_}_${SERVERS}_ips if [ -z $SSH_HOST ]; then if [ -z `eval echo \\${$app_ips[@]}` ]; then app_ips=DEV_DEFAULT_SERVER fi echo "[INFO] app_ips = ${app_ips[*]}" for var in `eval echo \\${$app_ips[@]}`; do synch $var if [ $var = "localhost" ]; then echo "cp $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $BASE_HOME/$APP_NAME/$PROJECT_TARGET" cp $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $BASE_HOME/$APP_NAME/$PROJECT_TARGET # echo "cp $OPPS_DEPLOY_HOME/scripts/function.sh $BASE_HOME/$APP_NAME" # cp $OPPS_DEPLOY_HOME/scripts/function.sh $BASE_HOME/$APP_NAME echo "sh $BASE_HOME/$APP_NAME/function.sh $BASE_HOME $APP_NAME" sh $BASE_HOME/$APP_NAME/deploy/bin/function.sh $BASE_HOME $APP_NAME else if [ -z $USER_HOME ]; then USER_LOGIN=`awk -v item=$var 'BEGIN{ split (item, host, "@"); print host[1]}'` init fi echo "scp -p $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT" scp -p $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT ssh -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server" ssh -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/$ROLLBACK_FILE -d $REMOTE_BASE_HOME/$APP_NAME/" echo "ssh -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh " fi done else echo "[INFO] SSH_HOST = $SSH_HOST" arr=(${SSH_HOST//,/ }) for var in ${arr[@]}; do if [ -z $USER_HOME ]; then USER_LOGIN=`awk -v item=$var 'BEGIN{ split (item, host, "@"); print host[1]}'` init fi echo "scp -p $IDENTITY_FILE -P $SSH_PORT $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT" scp -p $WEB_APP_BACKUP_DIR/$ROLLBACK_FILE $var:$WEB_APP_ROOT ssh -p $SSH_PORT $var "rm -rf $REMOTE_BASE_HOME/$APP_NAME/cobar-server" ssh -p $SSH_PORT $var "unzip $REMOTE_BASE_HOME/$APP_NAME/$ROLLBACK_FILE -d $REMOTE_BASE_HOME/$APP_NAME/" echo "ssh -p $SSH_PORT $var sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/shutdown.sh " ssh -p $SSH_PORT $var "sh $REMOTE_BASE_HOME/$APP_NAME/cobar-server/bin/startup.sh " done fi } main