设为首页 收藏本站
查看: 1204|回复: 0

[经验分享] 基于Jenkins+Gitlab的自动化部署实战

[复制链接]

尚未签到

发表于 2018-1-7 10:14:52 | 显示全部楼层 |阅读模式
故事背景
  一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到2~3人,此时随着公司的发展,项目会逐渐增多。前期部署项目可能都是手动的,
  俗称“人肉部署”,这简直是无比的痛苦,不能忍受的。这样开发的时间也会耽误,运维的时间也会耽误,全都浪费在这些重复性的工作上面,毫无价值可言,
  这时候运维终于忍受不了,上了脚本。但是慢慢的发现项目依旧在增长,脚本每次还要更改给开发,效率低下,后来测试环境以及开发环境直接上了jeknins,
  每台开发机器是jeknins agent端,自此,开发环境运维终于解脱了出去。但是线上上线运维依旧、所以得定制一套线上上线的流程标准,然后上jenkins自动化。

前提标准
  想要实现自动化的前提是标准化,例如程序的日志目录、程序目录、程序目录命名、代码分支、代码命名规则、程序高可用. 针对以上内容我们给开发做了
  严格的标准并落地执行。
  在此我会以Java程序为例子,因为我见到的最多的就是java程序比较麻烦,而php或者python可能只需要在服务器上git pull更新一下代码就可以了。
  tomcat规则: 每台服务器放置一个tomcat,tomcat使用ROOT.war,并配置日志切割
  程序目录:统一使用tomcat进行管理,所有的项目统一打出war包,放置tomcat下面命名为ROOT.war
  程序日志:统一放置在规定的目录,例如: /apps/logs/$app.log
  代码分支:不同的环境使用不同的分支,开发 dev分支, 测试 test 分支, 预发布 pre分支, 生产线上 master分支。分支隔离,不同环境取不同环境的配置
  代码打包: 因为是java的代码,我们选择的是使用maven进行打包,开发只需要关心代码层即可
  高可用: 每个程序必须支持多节点部署,不可出现单点故障的情况,否则不予上线.

自动化部署系统
  因为中型公司不可能配置运维开发,而开发只管开发的,所以运维只能是通过使用开源工具的方式来搭建自动化部署系统,组件如下图:

  上图的Jenkins服务器即自己是自己的agent,gitlab服务器是代码仓库服务器,Jenkins服务器会调用脚本,脚本做一些响应的动作进行自动化上线。
  自动化上线流程:

  下面进行步骤的分解:
  1. 运维人员登录jeknins,在jenkins界面点击响应的job,每个job是更新一个主机,job以服务名+ip组成,点击后jeknins会调用Shell发布脚本,下面这些都是脚本完成
  2. 发布脚本所做的第一步就是获取此项目的最新的代码版本
  3. 发布脚本所做的第二部是使用maven进行打包,每个maven打包的参数都统一
  4. 将打包好的war包拷贝到目标服务器上面
  5. 将需要上线的主机在前端负载haproxy上面进行下线(针对核心业务,建议这么做,比较优雅,不太暴力)
  方法参考: http://www.cnblogs.com/topicjie/p/7106860.html
  6.重启目标主机的tomcat服务
  7.测试url访问,返回是否正常
  8.在haproxy上线该主机

脚本实例
  下面是一个线上使用的上线脚本,scp是通过ssh免密的方式,并且部署tomcat是java用户. tomcat路径是/usr/loca/tomcat,每台主机一个tomcat
  脚本必须指定要更新的主机,上线代码路径
  分支线上默认master ,mvn配置为product参数
  注意: 此脚本中不包含 5,7,8 步骤,如果需要,请自行补充。
  

#!/bin/bash  
##################################################################
  
#
  
# Date :  2016/07/15
  
# Email:  gengjie@outlook.com
  
# Proj :  xx java项目
  
#
  
# 主要功能是更新线上tomcat服务使用.
  
# 使用此脚本必须配置java用户免密码登录
  
# 第一次必须手动将代码clone到BASE_CODE_PATH目录
  
##################################################################
  
. /etc/profile
  

  
# 定义此项目所包含的主机,以空格隔开,必须严格遵守
  
inc_host=("192.168.24.50" "192.168.24.51")
  

  
##### *** 定义项目代码存放目录,必须定义正确 ***  ####
  
CODE_PATH="/app/code/xxxxxx"
  

  
# 定义tomcat实例目录
  
Tomcat_PATH="/usr/local/tomcat"
  

  
# 定义git分支,默认是master分支
  
CODE_BRANCH='master'
  

  
# 定义编译配置文件,生产环境默认应是product,此处是pom.xml文件中定义
  
MVN_CONF="product"
  

  
# 获取需要更新的主机IP
  
U_host="$1"
  

  
# Define help
  
usage() {
  echo
  echo -e "   Usage : sh ./`basename $0` ipaddress"
  echo
  
}
  

  
code_pull() {
  

  echo "[Info] --->>> 项目开始更新代码... <<<---"
  

  cd $CODE_PATH
  git checkout $CODE_BRANCH
  git pull -u origin master:master
  

  if [ $? -ne 0 ];then
  echo "Git Pull Code Error"
  exit 1
  fi
  

  echo "[Succ] --->>> 项目代码更新完成... <<<---"
  echo
  
}
  

  

  
# Define build war
  
mvn_build() {
  cd $CODE_PATH
  echo "[Info] --->>> 项目开始编译... <<<---"
  mvn clean package -P $MVN_CONF
  

  if [ $? -ne 0 ];then
  echo "[Error] Compile Error,Please Check Your Code."
  exit 1
  fi
  echo "[Succ] --->>> 项目编译完成... <<<---"
  echo
  
}
  

  
# Define publish
  
push_remote() {
  

  echo "[Info] --->>> 开始发布主机: $U_host  <<<---"
  

  ssh $U_host "/bin/rm -rf ${Tomcat_PATH}/webapps/ROOT*"
  scp ${CODE_PATH}/target/*.war $U_host:$Tomcat_PATH/webapps/ROOT.war
  ssh $U_host "/bin/sh /app/scripts/stop_tomcat.sh"
  sleep 3
  ssh $U_host "source /etc/profile;/bin/sh ${Tomcat_PATH}/bin/catalina.sh start"
  

  echo "[Succ] --->>> 主机: $U_host 发布完成. <<<---"
  echo
  

  
}
  

  
# check host
  
check_host() {
  

  for host in  ${inc_host[@]};
  do
  if [[ "$U_host" == "$host" ]];then
  return 0
  fi
  done
  return 1
  
}
  

  
# Check user
  
check_user() {
  if [ `whoami` != 'java' ]; then
  echo "---------------------------------------------------"
  echo "You must use the Java user to run this script !!!"
  echo "---------------------------------------------------"
  exit 3
  fi
  
}
  

  
check_user
  

  
#check args
  
if [ $# -ne 1 ];then
  usage;exit 1
  
fi
  
if [ $1 == "-h" -o $1 == "--help" ];then
  usage;exit 1
  
fi
  

  
check_host
  
if [ $? != 0 ];then
  echo "Please check the server ip address to be updated !"
  exit 64
  
fi
  

  
code_pull
  
mvn_build
  
push_remote
  

  

  自此,以上可以实现在jenkins点击一下,服务一会自己就上好了,虽然说还有很多地方需要改进,但是一般中小型公司采用这种方式则是足够了,
  只能持续的进行优化,当然,再厉害一点的公司可以自己开发运维平台。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-432497-1-1.html 上篇帖子: Cobertura + jenkins 单元测试代码覆盖率统计 下篇帖子: [原]Jenkins(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表