一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码、打包、部署到web服务器、将web服务器从负载均衡器删除、解压、复制配置文件、创建软连接、测试每一台web服务器、将web服务器添加至负载均衡、回滚到任意指定版本、一键回滚到上一版本等功能,脚本放在www用户家目录并使用www用户身份执行,每个web服务器也都使用www用户运行web服务,且UID相同web目录和权限都一致,更严格的标准化可以带来更安全的生产环境和更高的效率:
1.1:在jenkins项目配置中调用shell脚本与环境准备:
1.1.1:#jenkins-项目-配置:
1.1.2:www用户家目录中的脚本内容:
$ cat code_deploy.sh
#!/bin/bash
#Dir List 部署节点(即部署节点需要做的操作)
# mkdir -p /deploy/code/web-demo
# mkdir -p /deploy/config/web-demo/base
# mkdir -p /deploy/config/web-demo/other
# mkdir /deploy/tmp
# mkdir /deploy/tar
# chown -R /deploy
# chown -R /webroot
# chown -R /opt/webroot/
# chown -R /webroot
# 需要在客户端节点做的操作
# mkdir /opt/webroot
# mkdir /webroot
# chown -R /webroot
# chown -R /opt/webroot/
# chown -R /webroot
# [www@ ~]$ touch /webroot/web-dem
# Node List 服务器节点
PRE_LIST="192.168.3.12" # 预生产节点
GROUP1_LIST="192.168.3.12 192.168.3.13"
GROUP2_LIST="192.168.3.13"
ROLLBACK_LIST="192.168.3.12 192.168.3.13"
# 日志日期和时间变量
LOG_DATE='date "+%Y-%m-%d"' # 如果执行的话后面执行的时间,此时间是不固定的,这是记录日志使用的时间
LOG_TIME='date "+%H-%M-%S"'
# 代码打包时间变量
CDATE=$(date "+%Y-%m-%d") # 脚本一旦执行就会取一个固定时间赋值给变量,此时间是固定的
CTIME=$(date +"%H-%M-%S")
# shell env 脚本位置等变量
SHELL_NAME="deploy.sh" # 脚本名称
SHELL_DIR="/home/www/" # 脚本路径
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log" # 脚本执行日志文件路径
# code env 代码变量
PRO_NAME="web-demo" # 项目名称的函数
CODE_DIR="/deploy/code/web-demo" # 从版本管理系统更新的代码目录
CONFIG_DIR="/deploy/config/web-demo" # 保存不同项目的配置文件,一个目录里面就是一个项目的一个配置文件或多个配置文件
TMP_DIR="/deploy/tmp" # 临时目录
TAR_DIR="/deploy/tar" # 打包目录
LOCK_FILE="/tmp/deploy.lock" # 锁文件路径
usage(){ # 使用帮助函数
echo $"Usage: $0 [ deploy | rollback [ list | emergency | version ]"
}
writelog(){ # 写入日志的函数
LOGINFO=$1 # 将参数作为日志输入
echo "${CDATE} ${CTIME} : ${SEHLL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
}
# 锁函数
shell_lock(){
touch ${LOCK_FILE}
}
# 解锁函数
shell_unlock(){
rm -f ${LOCK_FILE}
}
# 获取代码的函数
code_get(){
echo "code_get"
writelog code_get
cd $CODE_DIR && git pull # 进入到代码目录更新代码,此处必须免密码更新,此目录仅用于代码更新不能放其他任何文件
cp -rf ${CODE_DIR} ${TMP_DIR}/ # 临时保存代码并重命名,包名为时间+版本号,准备复制到web服务器
API_VERL=$(git show | grep commit | cut -d ' ' -f2)
API_VER=$(echo ${API_VERL:0:8}) # 版本号
}
code_build(){ # 代码编译函数
echo code_build
}
code_config(){ # 配置文件函数
writelog "code_config"
/bin/cp -rf ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}" # 将配置文件放在本机保存配置文件的临时目录,用于暂时保存代码项目
PKG_NAME="${PRO_NAME}"_"$API_VER"_"${CDATE}-${CTIME}" # 定义代码目录名称
cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME} # 重命名代码文件为web-demo_123-20170629-11-19-10格式
}
code_tar(){ # 对代码打包函数
writelog code_tar
cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME} --exclude=".git" # 将目录打包成压缩文件,便于网络传输
writelog "${PKG_NAME}.tar.gz packaged success" # 记录打包成功的日志
}
code_scp(){ # 代码压缩包scp到客户端的函数
writelog "code_scp"
for node in $PRE_LIST;do # 循环服务器节点列表
scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/ # 将压缩后的代码包复制到web服务器的/opt/webroot
done