持续集成之Jenkins结合脚本实现代码自动化部署及

一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码、打包、部署到web服务器、将web服务器从负载均衡器删除、解压、复制配置文件、创建软连接、测试每一台web服务器、将web服务器添加至负载均衡、回滚到任意指定版本、一键回滚到上一版本等功能,脚本放在www用户家目录并使用www用户身份执行,每个web服务器也都使用www用户运行web服务,且UID相同web目录和权限都一致,更严格的标准化可以带来更安全的生产环境和更高的效率:
1.1:在jenkins项目配置中调用shell脚本与环境准备:
1.1.1:#jenkins-项目-配置:

持续集成之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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e78aaa5ef7a343e1e6f63bdaa2b471e6.html