鄂破机看 发表于 2018-9-16 09:00:53

Jenkins与gitlib实现自动化部署2-myblog

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.zipwww@$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
  I love you!
  I love you!
  I love you!
  I love you!
  I love you!
  I love you!
  I love you!
  I love you!
  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的项目部署:

页: [1]
查看完整版本: Jenkins与gitlib实现自动化部署2-myblog