基于Jenkins+Gitlab的自动化部署实战

故事背景

  一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到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() {echoecho -e "   Usage : sh ./`basename $0` ipaddress"echo
}code_pull() {echo "[Info] --->>> 项目开始更新代码... <<<---"cd $CODE_PATHgit checkout $CODE_BRANCHgit pull -u origin master:master if [ $? -ne 0 ];thenecho "Git Pull Code Error"exit 1fiecho "[Succ] --->>> 项目代码更新完成... <<<---"echo 
}# Define build war
mvn_build() {cd $CODE_PATHecho "[Info] --->>> 项目开始编译... <<<---"mvn clean package -P $MVN_CONFif [ $? -ne 0 ];thenecho "[Error] Compile Error,Please Check Your Code."exit 1fiecho "[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.warssh $U_host "/bin/sh /app/scripts/stop_tomcat.sh"sleep 3ssh $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[@]};doif [[ "$U_host" == "$host" ]];thenreturn 0fidonereturn 1
}# Check user
check_user() {if [ `whoami` != 'java' ]; thenecho "---------------------------------------------------"echo "You must use the Java user to run this script !!!"echo "---------------------------------------------------"exit 3fi
}check_user#check args
if [ $# -ne 1 ];thenusage;exit 1
fi
if [ $1 == "-h" -o $1 == "--help" ];thenusage;exit 1
ficheck_host
if [ $? != 0 ];thenecho "Please check the server ip address to be updated !"exit 64
ficode_pull
mvn_build
push_remote    

  

 自此,以上可以实现在jenkins点击一下,服务一会自己就上好了,虽然说还有很多地方需要改进,但是一般中小型公司采用这种方式则是足够了,

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

  

转载于:https://www.cnblogs.com/topicjie/p/7107895.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧

用命令来操作MySQL是工作必备的&#xff0c;今天我就来分享一下cmd命令操作MySQL数据库的方法&#xff0c;希望有帮助。工具/材料电脑xampp操作方法01首先&#xff0c;启动MySQL服务才行哦。这里我是用xampp集成的数据库&#xff0c;方便&#xff0c;点击‘start’。02如图&…

Java顺序IO性能

许多应用程序将一系列事件记录到基于文件的存储中&#xff0c;以供以后使用。 从日志记录和审核&#xff0c;直到在事件源设计或其紧密相关的CQRS中保留事务重做日志&#xff0c;这都可以是任何东西。 Java具有多种方法&#xff0c;可以通过这些方法将文件顺序写入或重新读取。…

text段,data段,bss段,堆和栈

.bss段和.data段的区别 text段,data段,bss段,堆和栈转载于:https://www.cnblogs.com/jingzhishen/p/6203107.html

[BZOJ3529][Sdoi2014]数表

[BZOJ3529][Sdoi2014]数表 试题描述 有一张Nm的数表&#xff0c;其第i行第j列&#xff08;1 < i < n&#xff0c;1 < j < m&#xff09;的数值为能同时整除i和j的所有自然数之和。给定a&#xff0c;计算数表中不大于a的数之和。输入 输入包含多组数据。输入的第一行…

ZK的实际应用:MVVM –表单绑定

这是我们从头开始构建ZK应用程序的第二集。 上一篇文章涉及使用MVVM将数据加载和呈现到表中。 在本文中&#xff0c;我们将向您介绍ZK MVVM的表单绑定。 目的 我们将构建一个“添加”功能&#xff0c;使我们能够将新条目保存到清单中。 单击“添加”时出现表格 单击“保存”…

群晖按装mysql_如何连接群晖里的MYSQL数据库

匿名用户1级2018-08-27 回答一、连接远程数据库&#xff1a;1、显示密码如&#xff1a;MySQL 连接远程数据库(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用户名为“root”&#xff0c;密码“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隐藏密…

ZK的实际应用:MVVM –以编程方式更新视图

在前两篇文章中&#xff0c;我们使用ZK的MVVM功能来&#xff1a; 将数据加载到表中 使用表单绑定保存数据 我们已经看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;装饰方法时&#xff0c;在执行完成后&#xff0c;将向Binder通知VM属性的更改&#xff0c;以便B…

给你一个笑脸

今日冬至&#xff0c;愿你笑靥如初 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Document</title> </head> <body> <canvas id"mycanvas" width"800px&qu…

mysql安装与配置的截图_windows下MySQL5.6版本安装及配置过程附有截图和详细说明...

随着MYSQL版本的更新以及电脑系统的变化&#xff0c;我们给大家整理了各种电脑环境下安装MYSQL的图解过程&#xff0c;希望我们整理的内容能够帮助到大家&#xff1a;mysql安装图解总结https://www.jb51.net/article/142398.htm编辑者&#xff1a;Vocabulary下面详细介绍5.6版本…

mysql 更新日的数据类型_[每日更新-MySQL基础]5.常用的数据类型-整数和字符串

1. 数据类型在学习PHP的时候我们已经讲过数据类型了&#xff0c;所谓数据类型就是数据的格式。每一种数据类型在计算机中存储的方式会有差异&#xff0c;占用的存储容量也有区别&#xff0c;所以选择合适的数据类型可以节约我们的存储成本&#xff0c;也方便我们的程序运行和…

Hello World with Spring 3 MVC

在2005年&#xff0c;我对Martin Fowler的这篇文章对Spring进行了介绍。从那时起&#xff0c;我就修改了许多IoC框架&#xff0c;包括Guice &#xff0c; PicoContainer &#xff0c; NanoContainer等。虽然我很喜欢与IoC一起工作&#xff0c;但我必须说Spring在过去的5年中&am…

ansible 安装

1、简介 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的&#…

JS原型详解

参考的别人家的博客http://www.cnblogs.com/ljchow/archive/2010/06/08/1753526.html ###JS原型####JS原型&#xff0c;就是原型对象&#xff0c;简称原型。不仅构造函数有&#xff0c;普通函数也有* 普通函数&#xff1a;javascript function puTong(){ }; alert(puTong.proto…

c# mysql 插入 和 查询_C#对数据库的操作(增删改查)

1、【在web.config文件中配置】2、【连接字符串】private static readonly string StrCon ConfigurationManager.ConnectionStrings["sqlConnection"].ToString();3、【查询数据方法】/// /// 查询数据/// /// 查询语句/// 参数/// public static DataTable QueryDa…

利用docker在window7下安装TensorFlow

安装过程下碰了不少坑&#xff0c;记录一下安装过程&#xff0c;方便以后有需要时复用。 1、安装docker 下载最新版本的docker并且默认安装即可&#xff0c;安装后打开Docker Quickstart Terminal&#xff0c;初次进去需要一段时间。 下载网址&#xff1a;https://www.docker.c…

哈希长度扩展攻击

在这篇文章中&#xff0c;我将尽力避免夏季的低迷&#xff0c;而将重点放在比抱怨天气更有趣的事情上-哈希长度扩展攻击。 散列长度扩展攻击没什么复杂或复杂的&#xff0c;说实话&#xff0c;这只是关于如何使用散列函数。 正如我以前的一篇文章中所讨论的那样&#xff0c;哈希…

2017年07月03号课堂笔记

2017年07月03号 星期一 多云 空气质量&#xff1a;轻度污染~中度污染 内容&#xff1a;MySQL第四节课 in和not in&#xff1b;两个表的内连接&#xff1b;exists和not exsits的使用&#xff1b;all,any和some&#xff1b; 使用子查询的注意事项&#xff1b;sql优化&#xff08…

excel文件被写保护怎么解除_u盘被写保护怎么解除,看完你就知道了

在平常我们使用U盘存储资料过程中&#xff0c;有时会发现U盘出现无法正常读写的现象&#xff0c;具备表现为U盘被写保护&#xff0c;无法正常执行读写操作。对于小编给大家提供以下解决方法&#xff0c;希望对大家能有所帮助。对U盘执行重置操作01上网搜索并下载“USBOOT”程序…

新建MAVEN项目--pom.xml报错

使用集成了maven的Eclipse版本新建maven项目后&#xff0c;配置文件pom.xml会在project以及引用的xsd文件处出现错误&#xff08;第一、二行报错&#xff09; 其中一个报错例子&#xff1a; Multiple annotations found at this line:- Plugin execution not covered by lifecy…

OSGi案例研究:模块化vert.x

OSGi使Java代码可以清晰地划分为多个模块&#xff0c;这些模块称为捆绑软件 &#xff0c;可以访问由每个捆绑软件的类加载器控制的代码和资源。 OSGi 服务提供了一种附加的分离机制&#xff1a;接口的用户不需要依赖于实现类&#xff0c;工厂等。 以下案例研究旨在使OSGi捆绑包…