FunctionCase

通过function(定义函数) 和 case 配合,在执行脚本时,传入指定参数即可执行指定代码。 简单版 将以下代码写入to 文件

command=$1
case $command in 
	git)
		ssh [email protected]
		;;
	gitlab)
		ssh [email protected]
		;;
	log)
		ssh [email protected]
		;;
	*
		echo "未指定$1部分时输出提示信息"
esac

为该文件添加可执行权限,放入用户环境变量

pwd
/home/ituser
chmod +x to
mkdir bin
mv to bin/

将$HOME/bin加入当前用户的环境变量

cat << EOF >> .bashrc
	PATH=$PATH:$HOME/.local/bin:$HOME/bin
	export PATH
	EOF

使加入的配置生效

source .bashrc

通过以下命令来验证脚本是否生效

to git	# 会进入192.168.160.60服务器
to log	# 会进入192.168.160.242服务器

function 用来定义函数,在case中可以直接调用函数而不需要再输入命令 命令格式:

function 函数名 {
  content      #内容
}

或者

函数名() {
   content  #内容
}

例如:将如下内容写入go脚本

command=$1
function to_ser1() {
	ssh [email protected]
}
function to_ser2() {
	ssh [email protected]
}

case command in 
	ser1)
		to_ser1
		;;
	ser2)
		to_ser2
		;;
esac

执行脚本

go ser1		#即可调用ssh [email protected]命令

例如:将以下脚本保存为 service.sh 执行时分别传入release|restart|rollback会分别实现项目的发布、重启、回滚操作

service.sh release
service.sh restart
service.sh rollback

vi service.sh
#! /bin/bash
# 1、定义项目工作目录,项目ROOT目录,项目容器名称,war包名称,服务端口以及项目备份目录名称;
# 2、切换至项目工作目录,并判断该目录是否存在,如不存在,直接结束脚本,并提示检查设置的项目工作目录
# 3、检查项目ROOT目录是否存在,如不存在,则创建
# 4、删除旧容器,创建备份目录,移动正在运行的项目文件至备份目录
# 5、复制新的war包至ROOT目录并解压,解压完成后删除原war文件
# 6、启动容器
# 7、检查备份目录份数,如果小于或等于三份,则跳过;否则按时间顺序,保留最新的三个备份

# 请先依次设置 WORK_DIR、ROOT_DIR、CONTAINER_NAME、WAR_NAME、SERVICE_PORT变量的值
# 工作目录,项目存放位置
WORK_DIR=

# 项目的ROOT目录
ROOT_DIR=

# 配置Docker容器名称,该名称唯一不可同其它容器重复
CONTAINER_NAME=

# .war包名称,不包含.war后缀
WAR_NAME=

# 设置服务端口;设置端口号时请注意不要与其它服务冲突,否则会导致服务无法启动,linux检查指定端口(例如8080)是否被使用命令: ss -anpt | grep 8080
SERVICE_PORT=

# 备份目录
BACKUP_DIR=`date +%F-%H-%M-%S`

# 过滤出本机IP,适用于单物理网卡服务器,
ETH_NAME=`ls -l /etc/sysconfig/network-scripts/ | grep ifcfg-e | awk -F ' ' ' {print $NF}' | awk -F '-' '{print $NF}'`
IP_ADDR=`ip ad | grep $ETH_NAME$ | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}'`

#过滤出多物理网卡IP,只作参考
#ETH_NAME=`ls -l /etc/sysconfig/network-scripts/ | grep ifcfg-e | awk -F ' ' ' {print $NF}' | awk -F '-' '{print $NF}'`
#IP_ADDR=`ip ad | grep $ETH_NAME$ | grep '^ ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $1}'`

command=$1
# 发布新包
function release() {
	cd $WORK_DIR >/dev/null 2>&1
	if [ $? -eq 0 ];
	then
		ls $ROOT_DIR
		if [ $? -eq 0 ];
		then
			docker rm -f $CONTAINER_NAME >/dev/null 2>&1
			mkdir $BACKUP_DIR
			/usr/bin/mv $ROOT_DIR/* $BACKUP_DIR/
			cp -r $WORK_DIR/$WAR_NAME.war $ROOT_DIR/
			cd $ROOT_DIR/
			jar xf $WAR_NAME.war
			/usr/bin/rm -rf $WAR_NAME.war
			docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
		else
			mkdir -p $ROOT_DIR
			docker rm -f $CONTAINER_NAME >/dev/null 2>&1
			mkdir $BACKUP_DIR
			/usr/bin/mv $ROOT_DIR/* $BACKUP_DIR/
			cp -r $WORK_DIR/$WAR_NAME.war $ROOT_DIR/
			cd $ROOT_DIR/
			jar xf $WAR_NAME.war
			/usr/bin/rm -rf $WORK_DIR/$WAR_NAME.war
			docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
		fi

		cd $WORK_DIR
		if [ `ls -ltr | awk -F ' ' ' {print $NF}' | grep ^2019 | wc -l` -gt 3 ];
		then 
			ls -lt | awk -F ' ' ' {print $NF}' | grep ^2019 | tail -n +4 | xargs /usr/bin/rm -rf
		fi

		echo "项目已启动!"
		echo "请通过 http://$IP_ADDR:$SERVICE_PORT 来访问项目"
	else
		echo "请检查项目目录是否设置正确"
	fi
}

重新创建容器,不替换war包内容。例如直接修改了ROOT目录中的文件,不需要重新部署war包,直接重建容器、重新加载所有文件

function  restart() {
	docker rm -f $CONTAINER_NAME >/dev/null 2>&1 && docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
}

# 回滚至上一版。例如,发布最新版出现问题,需要回退到上一版
function rollback() {
	cd $WORK_DIR
	/usr/bin/rm -rf $ROOT_DIR/*
	cp -r $WORK_DIR/$BACKUP_DIR/* $ROOT_DIR/
	docker rm -f $CONTAINER_NAME >/dev/null 2>&1 && docker run -d -p $SERVICE_PORT:8080 -v $ROOT_DIR:/opt/tomcat/webapps/ROOT -v /etc/localtime:/etc/localtime:ro --name $CONTAINER_NAME tomcat8/jdk8:v9
}

case $command in 
	release)
		release
		;;
	restart)
		restart
		;;
	rollback)
		rollback
		;;
esac

最后更新于