故事背景

  一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到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点击一下,服务一会自己就上好了,虽然说还有很多地方需要改进,但是一般中小型公司采用这种方式则是足够了,

只能持续的进行优化,当然,再厉害一点的公司可以自己开发运维平台。

  

基于Jenkins+Gitlab的自动化部署实战的更多相关文章

  1. Jenkins+Gitlab+Ansible自动化部署(五)

    Freestyle Job实现静态网站部署交付(接Jenkins+Gitlab+Ansible自动化部署(四)https://www.cnblogs.com/zd520pyx1314/p/102445 ...

  2. Jenkins+Gitlab+Ansible自动化部署(六)

    Pipeline Job实现Nginix+MySQL+PHP+Wordpress实现自动化部署交付(Jenkins+Gitlab+Ansible自动化部署(五)https://www.cnblogs. ...

  3. Jenkins+Gitlab+Ansible自动化部署(二)

    接Jenkins+Gitlab+Ansbile自动化部署(一):https://www.cnblogs.com/zd520pyx1314/p/10210727.html Ansible的配置与部署 工 ...

  4. Jenkins+Gitlab+Ansible自动化部署(三)

    接Jenkins+Gitlab+Ansible自动化部署(一)https://www.cnblogs.com/zd520pyx1314/p/10210727.html 和(二)https://www. ...

  5. Jenkins+Gitlab+Ansible自动化部署(一)

    首先准备实验环境 虚拟机 主机名 IP地址 服务 系统版本 内核版本 Vmware Workstation 14 gitlab.example.com 192.168.244.130 gitlab  ...

  6. Jenkins+Gitlab+Ansible自动化部署(四)

    接Jenkins+Gitlab+Ansible自动化部署(三)https://www.cnblogs.com/zd520pyx1314/p/10235394.html Jenkins应用 Jenkin ...

  7. 【开发工具】Jenkins+Gitlab实现自动化部署

    我在尝试在容器中安装Jenkins时,初衷是希望使用docker in docker 的模式来实现Jenkins slave容器按需创建.在实现的时候需要在Jenkins 中安装Kubernetes插 ...

  8. jenkins +gitlab +docker 自动化部署tomcat 项目

    实验环境 实验设备 三台服务器 centos 7.X 以上 内存 2-3G左右 192.168.1.195 (jenkins最新+ git 2.8+maven 3.5 +tomcat 8+java1. ...

  9. Linux-GitLab+Jenkins持续集成+自动化部署

    GitLab+Jenkins持续集成+自动化部署 什么是持续集成? (1)Continuous integration (CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个 ...

随机推荐

  1. QlikView显示所选时间前一年的数据

    客户常常提出这种需求,当用户选择某一时间时.图表中显示所选时间之前一年的数据.以下是我的方法.如有不当,请多不吝赐教: 数据准备例如以下所看到的: SalesData: LOAD Num(ID) as ...

  2. VMware安装黑群暉5.2

      选择典型就可以了,点击下一步. 选择 稍后安装操作系统,点击下一步. 客户机操作系统选择Linux,版本选择其他Linux2.6.x内核64位, 填写虚拟机名称和虚拟机文件保存位置的.填写好后点击 ...

  3. Web性能测试工具:Siege安装&使用简介

    在Web性能测试工具中,siege是比较热门和常见的,它有安装简单,使用简单,测试报告详细的特点. 并且可以在文本中预定义一系列待测试url模拟,并可设定一定并发量下持续指定时间or测试进行测试. 比 ...

  4. 在与SQL Server 建立 连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器

  5. IOS开发之Iphone和Ipad应用程序图标和启动动画

    本文转载至 http://blog.csdn.net/yesjava/article/details/8782060 当我们用xcode开发iphone和ipad应用程序的时候,我们可以用一下表中所显 ...

  6. (转) 实现wince datagrid 上下滑屏数据浏览

    开发 基于wince 手持设备数据库应用时 由于是触摸屏 当datagrid 数据过多 往往用户烦于去控制又窄又细的上下滚动条 尤其是高分辨率的屏上 (如魅族M8系统 720×480) 而且datag ...

  7. EasyDarwin开源流媒体社区视频教程

    EasyDarwin开源社区出视频教程了,经过几个深夜的努力,终于将第一次课程的5个课时的视频教程录好<EasyDarwin开源流媒体服务器:编译.配置.部署>,EasyDarwin后面会 ...

  8. EasyDarwin开源团队招募开发组成员

    EasyDarwin开源流媒体服务器项目招募开发组成员,共同更新和维护EasyDarwin流媒体服务器,决策EasyDarwin后续开发方向: 加入要求: 1.对开源流媒体项目有浓厚兴趣: 2.有一定 ...

  9. Winform拖拽改变无边框窗体大小

    大家在进行Winform开发过程中,很容易就可以完成一个窗口的布局工作,但现在的软件界面美化效果一个比一个好,很多软件都是无边框的,于是乎,你是不是也感叹:winform的带边框的窗体如此丑陋,我一定 ...

  10. webapp 打包

    输入您的WAP网址,技术员马上帮您封装APP! APP人工打包-智睿软件_app打包_苹果app发布_app 上架_ios 上架_封装app_网站转app_安卓发布 http://app.niuhu1 ...