基于Jenkins+Gitlab的自动化部署实战
2017-07-02 23:33
337 查看
故事背景
一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到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点击一下,服务一会自己就上好了,虽然说还有很多地方需要改进,但是一般中小型公司采用这种方式则是足够了,
只能持续的进行优化,当然,再厉害一点的公司可以自己开发运维平台。
相关文章推荐
- [原]Linux环境-Jenkins实战-分布式构建-自动化持续集成-自动化部署-gitlab-svn-shell启动tomcat
- 自动化工具Ansible:基于Jenkins+Ansible+GitLab的部署实践
- 基于.NET平台的Windows编程实战(九)— 安装与部署
- ControlTier,基于命令的自动化部署工具
- 使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署
- 基于Hadoop的大数据分析实战-Hadoop部署与实践视频课程
- Windows 10企业批量部署实战之自动化rules设置
- 基于 STAF 和 XML 配置文件的跨平台自动化测试部署
- Linux基于PXE实现系统自动化部署
- 运维自动化之中级进阶—Cobbler实战,实现批量多版本os自动部署。
- 《Selenium2自动化测试实战--基于Python语言》 --即将面市
- ezdpl Linux自动化部署实战
- 基于引擎开发HTML5游戏实战(五)---游戏部署
- 基于jenkins的自动化部署几种方式
- 基于jenkins的自动化部署实现
- [转]基于AWS的自动化部署实践
- 基于.NET平台的Windows编程实战(九)— 安装与部署
- 实战 MDT 2012(六)---基于MAC地址的部署
- 实战 MDT 2012(六)---基于MAC地址的部署
- 版本控制之gitlab实战部署