故事背景

  一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到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

基于Jenkins+Gitlab的自动化部署实战相关推荐

  1. jenkins+gitlab实现自动化部署平台

    文章目录 jenkins+gitlab实现自动化部署平台 git gitlab gitlab介绍 安装 jenkins jenkins介绍 CI/CD介绍 Jenkins安装 gitlab+jenki ...

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

    Jenkins+Gitlab+Ansible自动化部署(2021-08-11) 一.Jenkins Linux Shell 集成 登录Jenkins web管理页,点击新建任务 添加描述信息 添加构建 ...

  3. gitlab ci 自动化部署_前端gitLab加jenkins自动化构建和部署,以及服务器常用的linux命令行操作,免密登录...

    常用的linux命令行操作 将项目部署到服务器后,需要查看文件是否已经部署成功,已经对文件进行增删改查操作,就需要用到命令行操作,常用操作如下: ll 罗列出当前文件或目录的详细信息,含有时间.读写权 ...

  4. 企业自动化jenkins及其他套件部署实战-蔡超-专题视频课程

    企业自动化jenkins及其他套件部署实战-207人已学习 课程介绍         本课程主要讲解了在企业中使用jenkins开源平台套件构建代码编译发布方案,内容包括持续集成.自动化代码部署.代码 ...

  5. docker 启动容器的时候没-p 后面怎么加-p_基于Docker搭建基础自动化部署

           阅读本文约需要7分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot如何实现全链路调用 ...

  6. jenkins+gitee 实现自动化部署项目到centos上

    目录 一 原理说明 1 流程说明 2 流程图 二 环境部署说明 三 Jenkins基本配置 1 Configure System (系统设置) 2 Configure  Global Security ...

  7. Gitlab+jenkins持续集成+自动化部署(三)

    搭建gitlab+Jenkins自动化部署 在jenkins上安装插件 Build Authorization Token Root Plugin. Build Authorization Token ...

  8. jenkins新版本+gitlab配置自动化部署报错Hook executed successfully but returned HTTP 403,没有CSRF选项

    问题: 配置jenkins+gitlab自动化部署报错: 错误内容: Hook executed successfully but returned HTTP 403 <html> < ...

  9. centos+jenkins+nginx+gitlab前端自动化部署全记录

    0. 前言 我们在开发一个新的项目时,总是需要将前端部署到测试服务器上,给测试或者产品访问.简单的来说,如果想部署前端到服务器,服务器需要提供一个服务来访问前端.如果我们在开发中没有涉及Node.js ...

最新文章

  1. mysql ef sql语句_EF to MySQL 的 Database.ExecuteSqlCommand 和 SqlQuery
  2. 谷歌NIPS论文Transformer模型解读:只要Attention就够了
  3. Python - 列表与字符串的互相转换
  4. Spring定时任务注解@Scheduled+@EnableAsync用法详解(简单说明+应用场景+demo源代码+执行过程分析)
  5. 30个基于jQuery的日期时间选择插件
  6. java future用法_你必须掌握的 21 个 Java 核心技术
  7. C++ 返回当前类名
  8. Tomcat-Server.xml配置图片路径
  9. Linux下通过WebShell反弹Shell的技巧
  10. 【Mac新资讯】搭载Apple M2 晶片的Mac要来啦!是否值得期待
  11. React+Webpack+Webstorm开发环境搭建
  12. web前端 html+css+javascript网页设计实例 家乡网站制作
  13. 中小企业财务管理的重要性
  14. 相似度计算(2)——皮尔逊相关系数
  15. ORACLE DATABASE LICENSES 计算方法和收费
  16. 大数据可视化坐标轴的定制与绘制3D图表及统计地图
  17. 赵小楼《天道》《遥远的救世主》深度解析(134)做了你该做的,就要受你该受的
  18. TEB算法1-teb原理详解
  19. win10系统potplay播放器关闭自动更新方法
  20. Rust之Some()与OK()

热门文章

  1. [BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集
  2. 九章算法强化班 - 课程大纲
  3. 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度
  4. 【Android Developers Training】 81. 解析XML数据
  5. win10怎么放计算机在桌面,win10我的电脑怎么放在桌面
  6. 低压抽屉柜常见故障处理方法_低压配电设备常见故障分析,处理办法介绍
  7. mysql的配置实现远程访问_MySQL 远程连接配置的正确实现 | 学步园
  8. Python应用实战-用Highcharts实现可视化分析
  9. 干货:B端产品经理,快速成长的密码
  10. html往下滑变成水平,HTML - 水平滑块CSS最佳方法_html_开发99编程知识库