范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

自动化运维从0到1CICD自动化部署落地分享

  目录
  一、CICD简介
  二、CICD实践过程
  三、含泪踩坑
  四、历史文章指路
  一、CICD简介
  1、CICD定义 Continuous Integration (CI) 持续集成 Continuous Delivery (CD) 持续交付 Continuous Deployment (CD) 持续部署
  2、DevOps定义
  DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
  DevOps的基础核心是CICD。
  CICD的基础核心是自动化。
  二、CICD实践过程
  1、起因
  在我之前的团队,因为要切换全新业务线,需要为新业务搭建一套全新的环境,所有东西从0开始。
  原先只是用于部署测试环境,后面决定一起部署生产环境,这个过程中我还造成了一个严重生产环境问题,好在当时的生产环境还未正式使用,未造成严重影响。
  在当时挺害怕也挺有压力的,但是后面项目完整落地,平稳运行,我还是挺有成就感的,接下来我将整个项目过程完整的分享出来。
  2、技术栈选型
  首先进行技术栈选型,我们选择的是Jenkins,Jenkins当属业内持续集成老大哥,有着非常丰富的插件,也可以选择gitlab集成的CICD,因为我们还有其它的测试脚本需要集成,所以Jenkins对于我们来说是最优的选择;
  Ansible是批量运维工具,通过编写yaml脚本,可以方便实现批量管理多台机器,并且Ansible是比较轻量级应用,很容易上手;
  shell脚本可以用于执行一系列命令。
  其它的就结合团队项目情况进行搭建。 Jenkins--持续集成 Ansible--下发文件 Shell--Linux脚本 Git--版本管理 GitLab--代码托管 Node.js--前端编译 Maven--后端编译 JDK--Java运行环境 Nginx--请求代理 Dubbo--RPC框架 Disconf--配置中心 Redis--缓存数据库(购买阿里云服务) Zookeeper--中间件(购买阿里云服务) RDS(MySQL)--数据库(购买阿里云服务)
  3、Jenkins应用部署实现流程
  首先来梳理下整个项目的实现流程,主要分为Jenkins主节点和应用服务器,是一对多的关系。
  Jenkins主节点的主要负责项目部署前的工作,主要包含拉取代码,前端打包,后端打包,快照版检测,将压缩包和部署脚本发送到目标机器(即应用服务器),远程调用目标机器上的部署脚本进行代码替换。
  应用服务器部署脚本执行过程有:解压压缩包,停止服务,覆盖代码,拉取disconf,应用目录分组赋权,重启服务,检查服务是否有进程,查看启动日志,删除/tmp目录下旧压缩包。
  Jenkins应用部署流程图
  4、任务计划
  4.1、搭建环境
  Jenkins
  指路【Jenkins系列】如何搭建Jenkins环境。
  Ansible 1、安装Ansible yum install ansible -y   2、查看版本信息 ansible -version
  Git 1、安装Git yum install git -y   2、查看版本信息 git --version
  GitLab
  因为这个我没有实践成功的教程,所以在这里就不贴啦~
  Node.js 1、解压node安装包,注:参数不用z tar xvf node-v6.16.0-linux-x64.tar -C /data   2、安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org   3、在/usr/bin目录下设置软连接 ln -s  /data/node-v6.16.0-linux-x64/bin/cnpm  /usr/bin/cnpm   4、查看版本信息 cnpm -v
  Maven 1、下载Maven 方式一:官网下载:http://maven.apache.org/download.cgi 方式二:wget Maven下载地址 wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz(清华大学开源软件镜像服务) wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz(北京理工大学开源软件镜像服务)   2、解压tar包到/usr/local/ tar -zxvf apache-maven-3.3.9-bin.tar.gz  -C /usr/local/   3、配置环境变量,编辑/etc/profile文件,在/etc/profile文件末尾增加以下配置:vim /etc/profile export MAVEN_HOME=/usr/local/apache-maven-3.3.9 export PATH=$MAVEN_HOME/bin:$PATH   4、使用source命令立即生效,刷新环境变量 source /etc/profile   5、查看版本信息 mvn -version
  JDK 1、下载JDK:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html   2、解压tar包到/usr/local/目录下 tar zxvf jdk1.8.0_201.tar.gz -C /usr/local/   3、配置环境变量,编辑/etc/profile文件,在/etc/profile文件末尾增加以下配置:vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_201 export PATH=${JAVA_HOME}/bin:$PATH export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar   4、使用source命令立即生效,刷新环境变量 source /etc/profile   5、检验JDK是否安装成功,注:-version,不是--version java -version 或者 javac   6、踩坑 如果出现这-bash: /usr/local/java/jdk1.8.0_171/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file问题 运行这个命令解决:sudo yum install glibc.i686
  Nginx 0、前提 安装依赖包 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel   1、下载nginx 方式一:官网下载:http://nginx.org/en/download.html 方式二:wget http://nginx.org/download/nginx-1.13.7.tar.gz   2、解压tar包到/usr/local/nginx/目录下 tar -zxvf nginx-1.13.7.tar.gz -C /usr/local/ngnix/   3、安装nginx cd /usr/local/nginx/nginx-1.13.7 执行配置 ./configure 编译安装 make && make install   4、配置nginx.conf,将端口号改成8089,因为可能apeache占用80端口,apeache端口尽量不要修改,选择修改nginx端口 vim /usr/local/nginx/nginx-1.13.7/conf/nginx.con   5、启动nginx cd /usr/local/nginx/sbin/nginx/nginx-1.13.7 ./nginx 启动 ./nginx -s stop 关闭 ./nginx -s reload 重启   6、查看nginx进程是否启动 ps -ef | grep nginx   7、验证nginx是否配置成功 nginx -t   8、查询nginx的安装路径 whereis nginx
  2、编写前置脚本 #!/bin/bash   #app_build.sh   app_name=${1}                   #项目名称,例:Learn-Java group_name=${2}                 #分组名称,例:best env_name=${3}                   #环境名称,例:test1 time=`date +%Y-%m-%d_%H:%M:%S`  #时间   #检测前端编译是否成功 shell_check(){     if [ $? -eq 0 ];then         echo -e "33[32m${time} ===前端编译成功,继续===33[0m"     else         echo -e "33[31m${time} ===前端编译失败,请排查问题再发布===33[0m"         exit 1     fi }   if [[ ${env_name} = "请选择" ]] ; then     echo -e "33[31m${time} 请选择正确环境!33[0m"     exit 1 elif [[ ${env_name} = "test1" || ${env_name} = "test2" ]] ; then     echo -e "33[32m${time} ${group_name} ${app_name} ${env_name}  前端编译 cnpm install33[0m"     cd /jenkins_workspace/${group_name}_${app_name}/${app_name}-view/     cnpm install     echo -e "33[32m${time} ${group_name} ${app_name} ${env_name}33[0m"     npm run build:test1     shell_check     echo -e "33[32m${time} cp /jenkins_workspace/deploy.sh to /jenkins_workspace/${group_name}_${app_name}33[0m"     cp /jenkins_workspace/deploy.sh  /jenkins_workspace/${group_name}_${app_name} else     echo -e "33[31m${time} 请输入正确参数!33[0m" fi
  3、编写应用部署脚本 #!/bin/bash   #deploy.sh   app_name=${1}                   #项目名称,例:Learn-Java env_name=${3}                   #环境名称,例:test1 time=`date +%Y-%m-%d_%H:%M:%S`  #时间   #检查上一条命令是否执行成功 shell_check(){     if [ $? -eq 0 ];then         echo -e "33[32m${time} 2|8、上一条命令执行成功, 继续33[0m"     else echo -e "33[31m${time} 2|8、上一条命令执行失败, 退出33[0m"         exit 1     fi }   #部署应用服务 deploy_app(){     echo -e "33[32m${time} 1、解压${app_name}.tar.gz33[0m"     cd /tmp/${app_name}/target/ && tar -xzvf ${app_name}.tar.gz       shell_check       echo -e "33[32m${time} 3、停止${app_name}服务33[0m"     var=`cd /app/${app_name}/bin/ && su ${app_name} stop.sh`     if [[ $var = *alive* ]];then         echo -e "33[31m${time} $var 无法正常停止应用进程,请前往服务器进行排查33[0m"         exit 1     else         echo -e "33[32m${time} $var ,继续33[0m"     fi       echo -e "33[32m${time} 4、覆盖代码33[0m"     rsync -r  /tmp/${app_name}/target/conf/ /app/${app_name}/config     rsync -r --delete /tmp/${app_name}/target/lib/ /app/${app_name}/lib       echo -e "33[32m${time} 5、拉取disconf33[0m"     cd /app/${app_name}/config && wget -O configs.tar.gz http://disconf.demo.com/api/config/downConfigs?app=${app_name}"&"env_name=${env_name}"&"version=1.0.0 && tar -xvf configs.tar.gz && rm -rf configs.tar.gz       echo -e "33[32m${time} 6、分组赋权33[0m"     cd /app && chown -R ${app_name}:coreapp ${app_name}       echo -e "33[32m${time} 7、重启服务33[0m"     cd /app/${app_name}/bin/ && su ${app_name} start.sh       shell_check       pid=`ps aux | grep ${app_name} | grep -v grep | awk "{print $2}"`     if [ "${pid}" ]; then         echo -e "33[32m${time} 9、${app_name} core ${pid} 启动成功33[0m"     else         echo -e "33[31m${time} 9、${app_name} core ${pid} 启动失败33[0m"         exit 1     fi       echo -e "33[32m${time} 10、查看日志33[0m"     cd /app/${app_name}/log/ && tail -n 200 stdout.log       echo -e "33[32m${time} 11、删除/tmp目录下旧压缩包,避免再次部署代码重复33[0m"     cd /tmp && rm -rf ${app_name} }   deploy_app
  4、Jenkins配置
  指路【Jenkins系列】如何构建Jenkins Job。
  新增Job,主要用于拉取代码,执行Maven编译,执行app_build.sh,将压缩包通过ssh发送到目标机器,远程调用目标机器的deploy.sh。
  三、含泪踩坑
  踩坑1
  问题描述:在错误的路径拉取配置,原因是未成功解压压缩包。
  解决方案:校验压缩包是否解压成功解压成功,并且在cd到正确的路径后添加&&(&&表示上一条命令执行成功再执行下一条命令)才进行拉取配置。
  踩坑2
  问题描述:项目没有正常停止,导致无法重新启动。
  解决方案:虽然执行kill -9,但是未找到根本原因,因此加了一个检测机制,如果检测没有正常停止服务,则退出程序。
  踩坑3
  问题描述:生产部署脚本拉取了开发环境的的jdbc配置,原因是生产部署脚本写错了开发环境disconf的域名,当时我同时在搞开发生产环境的脚本,开发和生产是两套不同的脚本,一时混乱写错了,吓得一批,好在当时生产环境还没投产使用。
  解决方案:为了避免后续这种情况的发生,而且是必须避免的,我们通过环境名称来判断走开发还是生产域名,这样就能保证脚本一致性了。
  在这个项目实际遇到的问题远不止上面这几个,在这个实践过程中,我对整个应用部署流程有了更深的理解,平时方方面面的学习终于集中化起来进行实践了。
  我习惯将学到的知识和遇到的问题记录起来,在写这篇文章的过程回过头来看,五味杂陈,原来我都经历了这些哈哈哈......
  踩过的坑终究使我更加强大,带你见证呱呱本呱成长为参天大呱~
  关注【嘎嘎软件测试】
  搞测试,不迷路
  呱呱大王本呱带你飞!
  嘎嘎软件测试 将分享个人成长、团队管理、软件测试技能知识等内容,更新频率一周两篇,做到有思想、有观点、有深度,欢迎订阅。

面向对象(1)简述一下什么是面向对象1面向对象是一种编程思想,把一切东西看成一个个对象。把这些类拥有的属性变量和操作这些属性变量的函数打包成一个类。2面向过程和面向对象区别面向过程根据业务逻辑从Go语言自学系列高效golang开发视频来源B站golang入门到项目实战2021最新Go语言教程,没有废话,纯干货!持续更新中一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!附上汇总贴G扎克伯格坐拥千亿,上厕所都带好几个保镖,一件上衣价值上万元曾几何时扎克伯格在中国网友心中好感度还是非常不错的,不过随着FACEBOOK在美国陷入官司,扎克伯格在中国的人设也崩塌了。扎克伯格的团队一直在帮他设立一个亲近中国的形象,不过这背后科技感十足,Canoo为NASA设计月球新载具电动车越来越夯,虽然新创车厂很少能真正撑下来,最近,美国的Canoo电动车厂就接到了美国太空总署NASA的大订单,收获满满!Canoo以旗下LifestyleVehicle廂型车为支撑美国霸权的科技实力正逐渐下降我们知道美国霸权有四大基石,分别是科技霸权金融霸权军事霸权和文化霸权。这里最重要的是科技霸权,因为有了科技霸权,依靠暴利的高科技产品形成了强大的经济实力,从而使美元成为世界流通货币2022越来越多的人购买高端手机,基于这4个原因,这8部手机最抢手智能手机有不同的价位。从预算型手机到旗舰手机,每个人都能找到适合自己的机型。然而,尽管预算型手机在过去几年变得如此强大,但据调查报告显示,今天有更多人愿意购买高端手机。那么购买高端Countif函数只用来计数?那就真的Out了,这3个技巧才是高能用法函数Countif的功能是单条件计数,计算指定区域中符合条件的单元格数语法结构为Countif(条件范围,条件)大部分的亲并不陌生,但如果你用Countif函数只是单条件计数,那就朋友坐滴滴丢手机找回的经历周六和朋友打滴滴,朋友打的车。下车后在便利店买了瓶水,这时朋友突然发现,手机不在了。马上打他的电话,通的,无人接听。联系滴滴客服,滴滴app做得不错,我客服我丢了东西,马上就可以联4月SUV销量冠军,比亚迪宋已经预定了,但关键的问题依旧没解决4月份还有不到一周的时间就要结束了,各家车企也都进入了订单收割的重要阶段,毕竟很多新能源车型的涨价时间节点是5月1日零点!既然说到新能源汽车,那么比亚迪就是一个绕不开的话题,在3月一个身价赶超二马的男人曾毓群和他的宁德时代这是一个身家超过二马却又低调到连网上都搜不到太多故事的超级富豪,他甚至被称为马斯克背后的中国男人,比肩任正非的优秀企业家,他就是宁德时代创始人曾毓群。截止2021年11月11日他的MoffettNathanson将推特(TWTR。US)目标价从46美元上调至54。20美元MoffettNathanson将推特(TWTR。US)目标价从46美元上调至54。20美元。Twitter(TWTR。US)公司简介Twitter,Inc。是一个用于实时公开表达
去年回家过年机票退改多次,年中开间咖啡馆,今年还能回家过年吗2020年,对于我对于家对于国都是艰难的一年。1月,回沈阳过年看父母,原计划2月3日初九回西安,突如其来的疫情,机票经过多次退改后于1月30日辗转回到西安。中间转机时,找了个人少的古人用诗画赞美,我们用照片记录,江南水乡六大古镇最爱南浔张帆出东郭,沽酒问南浔。古人也要去南浔寻一壶美酒,而今天的游客同样可以在南浔喝一壶美味浔酒。古人通过诗词书画来描绘赞美喜欢的地方和物品,优美的诗句留存后世。现代人又多了一个表现手段对比一个月前回民街游客明显增多但恢复往日人气还需时日天气渐暖,春季本是出门旅游的好时机,因为今年疫情的影响,各大旅游城市旅游景点的游客数量与以往相比减少很多。回民街是西安有名的美食地标,很多游客来西安旅游必来这里打卡。随着复工复产,西安浐灞国家湿地公园一家人享受美好大自然的好去处春暖花开,垂柳依依,在如此美好的时节,想必大家都有一颗蠢蠢欲动的心,想要出游踏青。现在防疫时期不宜远游,市郊公园就是我们外出赏花郊游的首选了。西安浐灞国家湿地公园就是一个再好不过的兴庆公园的牡丹郁金香盛开喜欢赏花的西安人不要错过我们的生活在2020年的春天与往年有些不同,可春日的美景如约而至,西安兴庆公园的芍药牡丹郁金香等鲜花应季盛开,最近正是赏花游园的好时候!在当前这个特殊时期,我们要减少不必要的出行,10年手机拍照功能飞速发展我的手机替代了卡片机紧逼单反相机2009年,作为一个摄影爱好者,手里的佳能40D是1010万像素,当年三星发布了这款800万像素M8800手机,背面看就是一个卡片机的造型,很喜欢期望也挺高便买了这部手机,希望它能早上一碗双交面,午后百间楼三道茶,晚上浔酒配浔蹄真是绝配清晨,水乡古镇在祥和的睡梦中渐渐苏醒,古运河边炊烟袅袅,一碗热气腾腾的双交面即将上桌。来到浙江南浔古镇,大家都推荐这碗双交面,一种南浔特色面食,酥肉与爆鱼是比较传统的双交面,再搭配水乡最忆南浔百间楼故事中寻找100名婢女现实中的烟火人间江南,顾名思义为长江以南,一般多指长江下游南岸区域。我们从众多文章诗词中认识到的江南是一个人杰地灵山清水秀富饶繁荣的地方,带着对水乡江南的美好憧憬,我开始了寻访水乡之旅。我们印象中西安的寺院在中国佛教史上地位举足轻重佛教祖庭大多在此相信有很多来过或想来陕西旅游的朋友们都知道这里的皇陵极多,兵马俑乾陵等皇陵是必去参观的地方。但其实在西安市区及周边还有很多寺庙非常值得一去,这些寺庙在我国佛教史上有着非常重要的地位南浔不难寻,真爱最难寻,我们的爱情在八次南浔之旅中生根初识在上海,因为出差的机会夜游了浙江南浔古镇,我觉得很美,你拿到驾照我们第一次自驾游就选择了南浔古镇。我们第一次游览了南浔首富刘镛的私家园林小莲庄,在一棵女贞和一棵槐树相拥而立的连陕西帝陵数量全国之最参观秦汉唐三陵感受曾经的盛世南方的才子北方的将,陕西的黄土埋皇上这句俗语很多人都听说过。在漫漫历史长河中,有周秦汉唐等14个政权在陕西建都,为陕西留下了数量巨大的帝王陵墓,是全国现存帝王陵之最。这其中有些古墓