新建发布项目:实现构建时触发脚本执行分批次上线

vim /etc/sudoers    授权
    #Defaults   requiretty  不能开启tty端
    www     ALL=(ALL)       ALL
    jenkins ALL=(ALL)       NOPASSWD: /usr/bin/ssh
su - www        切换用户
ssh-copy-id www@192.168.62.63   设置web和jenkins的基于key的认证
ssh-copy-id www@192.168.62.62
cat .ssh/id_rsa.pub     查看www用户的公钥
cat /home/www/.ssh/id_rsa.pub
vim /home/www/.ssh/authorized_keys  基于key的认证,保证自己可以无密码连接特定
机器,防止有时脚本不在本机的情况;
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCUNGt15DFFW7fqbI7vn2z6G289GQE2TJhrgrZe4qQna4VQhRKoVsdc/vdbqcmSKn41cwcGFt0w14eiALD5OBH/NvP9zOvHj1KAhJ6Z8SySWWD26WONOSWmFLpCCwZy9WeET1teNKC+N6Gf4BtKQeR543Keh4TtCJF+ThumxJpSxn3NG9mzaMS8XeJcJX5ZvKdQgPxFRpx4OcPsfRXUTY+FhfxBkvjdUBGC+BSr/WhDhCEI86CBl9Rp0vCfyup8cPNGovKklyrpPVkVW6Bh6SBCr3gp8diSd6KRyfKmMdxbYaRdUVjCkzcDMITXKWd4jlpMln9tA37klE8BAip6vXuj www@jenkins-server
exit    回到root用户
cat /root/.ssh/id_rsa.pub       查看root公钥
vim /home/www/.ssh/authorized_keys
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFgBrdYH5bxp+WURV/gbLRkwbIzI5a1yj1Vuss5xf5noImDQ+aOll/9PIZIZYukIBhCM4le5aZK8cXI1fImMTx8OQv3vFaDwhgRkSZe4bDzhzmpg2MfXrnR4AfXP6eQGjWumqLI8MrgI4dUdiv2KMQp2eNwq6zMaEoInCfiMXuxYwWKI7KBcEIBG2H1ZvxDJ4VotYC7ZvLMzudmI7c7EXU3d5O7fDJVGksG14b4UINUlWImHETGEs/lC1v0CaoOxwrLkBBK1X7yJlbLBni6VYVfe0QY6eceozAnXrtKvY3mAR8uMW2wzPyVLh2GviQv+eYK2pVW55CvNOY83CgwJrP root@jenkins-server

vim deploy1.sh  修改脚本
    #!/bin/bash
    #文件与目录变量
    MOBILE_FILE=SmaMobile.war.zip
    MOBILE_NAME=SmaMobile
    PC_FILE=CustomerApp.war.zip
    PC_NAME=CustomerApp
    S_DIRETORY=/data/ftpsite/xiaoguan
    D_DIRETORY=/apps/tomcat_appdir

    #日志日期和时间变量
    LOG_CDATE=`date "+%Y-%m-%d"` #如果执行的话后面执行的时间都一样,因此此时间是不固定的,这是用于记录日志生成的>时间
    LOG_CTIME=`date  "+%H-%M-%S"`

    #代码打包时间变量
    CDATE=$(date "+%Y-%m-%d")
    CTIME=$(date "+%H-%M-%S")
    echo ${CDATE}_${CTIME}

    #获取Jenkins传递的参数
    METHOD=$1   #方法是部署还是回滚
    GROUP_LIST=$2   #后端服务器列表
    VERSION=$3  #控制版本

    #通过jenkins传递参数定义PC端服务器列表
    if [[ ${GROUP_LIST} == "1" ]];then
            PC_LIST="172.18.62.62"
            echo "第一次上线,上线服务器为${PC_LIST},线上HA负载在线服务器为${PC_LIST}"
            sleep 2
    elif [[ ${GROUP_LIST} == "2" ]];then
            PC_LIST="172.18.62.63"
            echo "第二次上线,上线服务器为${PC_LIST},线上HA负载在线服务器为${PC_LIST}"
    elif [[ ${GROUP_LIST} == "3" ]];then
            PC_LIST="172.18.62.63 172.18.62.62"
            echo "第二次上线,上线服务器为${PC_LIST},线上HA负载在线服务器为${PC_LIST}"
            sleep 2
    else
            echo "参数 error"
            #exit 3
    fi

    copy_file(){
            if test -f /data/ftpsite/xiaoguan/CustomerApp.war.zip;then
                    PKG_NAME="${PC_NAME}"_"${CDATE}"_"${CTIME}"
                    echo "开始复制销管系统上线文件......"
                    mv ${S_DIRETORY}/${PC_FILE}  ${S_DIRETORY}/${PKG_NAME}.war.zip
                    for node in ${PC_LIST};do #循环服务器节点列表
                            scp ${S_DIRETORY}/${PKG_NAME}.war.zip  www@$node:/apps/tomcat_appdir  #将压缩后的代码包复制到web>服务器的/opt/webroot
                            ssh ${node} "cd /apps/tomcat_appdir && unzip  ${PKG_NAME}.war.zip -d /apps/tomcat_webdir/${PKG_NAME} && rm -rf  /apps/tomcat/webapps/CustomerApp && ln -sv /apps/tomcat_webdir/${PKG_NAME}  /apps/tomcat/webapps/CustomerApp"
                    if [ $? -eq 0 ];then
                            echo "销管项目移动端端服务器${node}上线文件复制完成"
                            echo "发送邮件中。。。"
                            echo "销管项目移动端端服务器${node}文件复制并发部署完成" |  mail -s "复制文件完成" 127540092@qq.com
                    else
                            echo "销管项目移动端端服务器${node} 部署失败" |  mail -s "部署失败" 127540092@qq.com
                    fi
                    done
            else
                    echo "上线文件CustomerApp.war.zip不存在"
                    exit 3
            fi
    }

    stop_service(){
            if [ ${METHOD} == "deploy" ];then #假如是上线部署
                    if test -f /data/ftpsite/xiaoguan/CustomerApp.war.zip;then #先判断上线文件是不是存在
                            for node in ${PC_LIST};do #循环服务器节点列表
                            ssh www@${node} "/etc/init.d/tomcat stop"
                            done
                    else
                         echo "CustomerApp.war.zip文件不存在"
                         exit 4
                    fi
            else
                    for node in ${PC_LIST};do #假如不是上线,即是回滚和任意版本的回滚,就先循环服务器节点列表停服务
                    ssh www@${node} "/etc/init.d/tomcat stop"
                    done
            fi
    }

    start_service(){
            for node in ${PC_LIST};do #循环服务器节点列表
            ssh www@${node} "/etc/init.d/tomcat start"
            done
    }

    #回滚到指定版本
    rollback_designated(){
            for node in ${PC_LIST};do
                    ssh www@${node} "rm -rf /apps/tomcat/webapps/CustomerApp  && ln -sv /apps/tomcat_webdir/${VERSION} /apps/tomcat/webapps/CustomerApp  && echo "${node} 回滚到指定版本成功!""
            done
    }

    #一键回滚到上一版本
    rollback_last_version(){
            for node in ${PC_LIST};do
                    NAME=`ssh www@${node}  ""/bin/ls -l  -rt /apps/tomcat_webdir | awk '{print $9}' | tail -n 2 | head -n1""`
                    ssh www@${node}  "rm -rf /apps/tomcat/webapps/CustomerApp && ln -sv /apps/tomcat_webdir/${NAME} /apps/tomcat/webapps/CustomerApp && echo "${node} 一键回滚到上一版本成功""
            done
    }

    main(){
            DEPLOY_METHOD=$1
            ROLLBACK_VER=$3
                    case ${DEPLOY_METHOD}  in
                    deploy)
                            stop_service;
                            copy_file;
                            start_service;
                            ;;
                    rollback_designated)
                            stop_service;
                            rollback_designated;
                            start_service;
                            ;;
                    rollback_lastversion)
                            stop_service;
                            rollback_last_version;
                            start_service;
                            ;;
                    *)
                            usage;
                    esac;
    }
    main $1 $2 $3

./deploy1.sh deploy 2   传参测试脚本的可用性
 yum install mailx -y   脚本中用到了mail命令发邮件,故而需要安装包,root用户才能安装
./deploy1.sh deploy 2   测试脚本
su  - www   切换www用户
mkdir /data/ftpsite/xiaoguan -pv    保证属组和属主为www
chown www.www ftpsite/ -R       如果不是www用户创建的此目录,就使用此命令保证权限
vim index.html
     <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
    <h1>I love you!</h1>
yum install zip 
zip CustomerAp.war.zip index.html   压缩为脚本指定格式的代码文件
./deploy1.sh deploy 1   测试
su - www        记得切换www用户
mkdir tomcat_webdir 在/apps下创建目录,web1和web2上,存放解压后的文件
mkdir tomcat_appdir 存放复制过来的压缩文件,注意属主和属组
yum install unzip -y        安装unzip包,web1和web2上,以将复制到达的压缩包解压
测试脚本没问题后,进行jenkins的项目部署:

Jenkinsfile SCM配置git分支_tomcat

可以在main函数中找$1方法
ll   /apps/tomcat_webdir        可以看到不同的版本

Jenkinsfile SCM配置git分支_tomcat_02

进行构建,实现调用脚本的项目分批次部署:

Jenkinsfile SCM配置git分支_服务器_03


转载于:https://blog.51cto.com/angwoyufengtian/2131931