新建发布项目:实现构建时触发脚本执行分批次上线
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的项目部署:
可以在main函数中找$1方法
ll /apps/tomcat_webdir 可以看到不同的版本
进行构建,实现调用脚本的项目分批次部署:
转载于:https://blog.51cto.com/angwoyufengtian/2131931