最近听了ECUG
大会上孙敬云老师的分享感受受益不浅,毕竟大学课本上只讲到瀑布模型
就没有下文了,工做之后一直贯彻的都是Scrum
路线,一直也没有时间好好的去学习整理这部分的知识,直到近几天听到了孙老师的分享,因此就在这里记录下孙老师的分享也总结我本身的思路。如下内容部分摘自于孙老师的分析PPTjava
貌似大学的那门软件工程只给咱们讲到了1980年,以后的须要咱们走出校门,在社会中进行学习。git
先来看下面这张图,是1980年至今的软件工程演化路线,像瀑布模型你们应该是耳熟能详。程序员
进入1990年,Scrum这种,近几年应该也是略有耳闻,但是像极限编程
这种可能就不多据说了吧。golang
再向后看,进入2000年,持续集成
也就是CI/CD
中的CI和敏捷开发
近几年炒的火热,互联网公司争先恐后,kanban
(今天公司产品说,我才知道kanban是日本人发明的)也有点大势已去,不过市场上应该还有很多公司在使用kanban。docker
走到了2010年,咱们所看到的应该就是几个随处可见的概念了,持续交付
,DevOps
,Scrumban
(咱们近几年说的真正意义上的Scrum)编程
在这里不详细叙述,只叙述几个痛点。segmentfault
敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种能应对快速变化需求的软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协做、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、可以很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发过程当中人的做用。安全
说人话,就是更注重沟通,快速产出新版本,而且更适应需求变动的的适合小团体开发的方法。架构
下图左方,是需求池的概念(好比jira中的backlog),好比7%的需求是现实中大量客户的需求,则咱们将这7%的需求做为优先级最高的需求。并发
下图右方,是迭代和反馈的概念。
敏捷开发中有敏捷宣言,能够更好地阐述敏捷开发的概念。
下图右上方是Scrum中的角色定义。
下图左方是用户故事
(user story
),其实就是咱们传统意义上的需求,只不过以一种需求方的更委婉拟人的语气来说述该用户人群的需求。
例如:我是一个买家,我但愿个人购物车能经过价格排序,这样我就能根据我卡中的钱进行合理的消费。
下图中部,则是Scrum的核心流程。有不少公司光注重了其中的流程(好比站会),却没有获得其中的精髓。Scrum中把一个迭代叫作一个冲刺
(Sprint
),这也是不少地方把计划会议叫作冲刺会的由来,通常一个Sprint为1~4周。核心流程包括4个会议,以下所示:
计划会议(Product Owener、Scrum Master、Scrum Team)
Sub Task
Story Point
(用以评估story的大小,有一种好玩的方式叫作Scrum Poker
)每日站会(Product Owener(可选)、Scrum Master、Scrum Team)
评审会议(Product Owener、Scrum Master、Scrum Team)
回顾会议(Scrum Master、Scrum Team)
极限编程
是敏捷开发中最具成效的几种方法之一,如同其余敏捷方法,它和传统方法的本质不一样在于它更强调可适应性能性以及面临的困难。
它的基础和价值观是:
它认为任何一个软件项目均可以从四个方面入手进行改善:增强交流;从简单作起;寻求反馈;敢于实事求是。
下图是极限编程的13个最佳实践。
问问本身下面的几个问题:
若是你对上述几个问题的回答时确定的,那么恭喜你,大家的团队是关注发展的敏捷团队,若是你对上述问题有部分或所有否认,那么你可能须要调整你的团队,大家只不过是在关注敏捷的形式,而没有精髓。
DevOps
是一种开发、测试和运维之间文化沟通,经过自动化的方式来进行软件交付和架构变动的流程,使构建、测试、发布软件能更快捷、频繁、可靠。它的出现是由于软件逐渐的认识到,开发、测试和运维的紧密合做能够更好的交付软件产品和服务。
下图是DevOps的标准化流程,经过创建一个完备的团队来创建一条IT服务供应链,经过自动化实现高效率交付,不固定需求管理、工具链等,只专一于持续的稳定的价值交付
这一步工做法是关于从开发到运再到客户的自左向右
的工做流
下图展现了自循环工做流的流程,其中前4项属于Dev范畴,后4项属于Ops范畴:
下图左方是咱们针对上面的工做流的一种实践,是一种工做日志的方式,这种工做方式一样适用于敏捷开发(jira中的工做日志),其实DevOps的本质就是敏捷开发。
经过上方工做日志所记录的数据,咱们能够对咱们的工做进行阶段性的分析,好比:
平均前置任务等待数
能够用来判断咱们的任务分配是否合理手工比例
能够用来提示咱们是否须要使用自动化来优化流程%C/A
能够用来判断一我的的工做质量是否须要优化xxx feature branch
xxx fix branch
这种方案是基于GitFLow
的标准来进行版本控制的。
该方案采用develop
、feature
、hotfix
、release
、prod
等分支进行实践,比较适合版本并存的团队
这种方式很灵活,代码隔离也很好,只是过于繁琐。
该方案是基于版本打tag的方式来进行版本控制的。
该方案采用master
、feature
、fix
等分支进行实践,比较适合小版本滚动升级团队
这种方式很简单,可是对多环境的支持不是很好。
咱们推荐使用GitFlow+Tag的方式来进行版本控制。以触发多环境下的pipeline自动化流程。
这里主要是咱们的CI/CD的流水线的结构,可已使用Jenkins
的pipeline也可使用Gitlab
的pipeline。
这里连接下以前写的Jenkinsfile教程(Jenkins Pipeline 教程)
自动:
手动:
看过了上面的部分,你必定嗤之以鼻,由于下面的图其实就是上面的Scrum图+Pipeline的图。其实下面你的这张图才能真正意义上的指导咱们如何在工做中实践Scrum+DevOps。我将下面的图分层了4块,让咱们一块儿看看下面的图吧
第一部分的需求池的这个概念咱们在上方的Scrum中已经看到了,在这里不作详细解释,若是记不太清了,能够回到上方#1.3.1 进行复习。
第二部分的Scrum流程须要咱们再来回顾一下,一个迭代中的4个会议还记得吗,不记得就回去看看吧,经过小迭代来进行可持续的速度小型发布,其中要落实XP的13个实践,包括集体全部权、简单设计、重构等等。
经过代码版本控制来触发咱们的的CI和CD的构建。
经过发布编码标准,测试驱动开发,代码riew等来提高咱们的代码质量以进行优质的代码持续集成。
在持续集成以后,迎面而来的是构建、测试、部署,这几个步骤的才是真真正的表现咱们的团队的持续交付的质量。
在3和4两个步骤,咱们会看到下方有包含对号和错号的表格,这个咱们会在接下来的地方讲到,这个是个CI/CD反馈表,用来表示咱们某个阶段的CI/CD的缩略状况,能够经过这个反馈来进行相关的分析。
下方的图是CI/CD的持续反馈图,可能作过Jenkins的Pipeline的小伙伴已经能看出它了。
顶部的“表头”其实就是咱们的Pipeline的流程,而每一行是咱们的历史构建记录,经过这张图咱们能够清洗的看到咱们在某一阶段的pipeline的执行状况,就能够看到咱们在哪个节点发生错误的状况比较高。
在这个流程中最重要的就是测试部分,若是咱们的团队对包括单元测试在内的测试环节若是不是很重视,那这个反馈将对咱们的团队毫无心义。
在DevOps中,咱们推崇测试驱动开发,经过先写单元测试,集成测试等用例来驱动咱们的开发进行编码。
这里的制品的含义就是咱们所构建的,好比java的jar,golang的native,docker的docker image等。
经过DevOps的反馈,咱们能够查看制品所在的story的目前阶段
让咱们再来看下面这张图,对比上面的那种图,在咱们的编码、测试、部署三个阶段多了个小锤子的标志。
这里的编码、测试、部署,分别表明着开发、测试、运维,三个岗位须要不断的尝试、配合和重复学习来让这条IT服务供应链更快速更稳定更自动化,让信息反馈更精准、更全面的覆盖到整个服务生命周期。
首先画一个由x轴支持评价和y轴业务技术导向组成的四象限,咱们将咱们DevOps中的全部种类的测试流程放入其中,来将每个测试落实在一个二维区间内,再在每一种测试上标识一个工做投入程度,组成下面的图。
咱们以前提过,在XP极限开发中,咱们推崇测试驱动开发,由于测试驱动开发可让咱们在开发以前更加深刻的理解业务,而且基于接口定义程序,更好的组织咱们的软件架构。
因此下图是咱们的测试流程应在咱们的工做中所占有的工做比例,若是全部的工做经历为100%的话,那么6颗星则为60%,每颗星占据10%。
良好的开发习惯,和标准的测试流程可让咱们的代码质量更上一层楼。
上面咱们说了测试的四象限,这里咱们说说运维的四象限,咱们以紧急性为x轴,重要性为y轴,这个四象限实际上是不少工种的人都会使用到的,会将咱们天天的任务放到里面,用来肯定任务的优先级,咱们知道基于这种四象限,咱们的优先级会有下方四种:
咱们将运维的工做放在上面,若是大部分的工做都落实在紧急且重要的第一象限上的话,那么说明咱们的DevOps流程是有问题的,好比咱们的运维的大部分精力都在天天的线上紧急修复之类的任务,就说明咱们的开发和测试的质量是有问题的。
运维的工做不该该重点在右方,而应该重心左移,偏向于重要不紧急,多作一些规划性的工做,好比从传统部署方式转向k8s容器编排等工做。
在上面咱们将上面说讲述的知识合并起来,组成咱们真正在工做中实践所要用到的东西。Scrum+XP+DevOps
小团队内部要作到:
公司级别:
定义每种语言的标准的目录结构,好比下方的目录结构就是Node.js的标准目录结构,我将一些语言级通用的结构用红框画了出来。
下图使用的是基于Tag的版本控制,我这里看推荐使用GitFLow+Tag的方式来进行基于Tag多多环境的版本控制的方式进行构建使用。
下图中的快速失败的概念是指当pipeline中某一节点未达到经过的要求,则再也不运行以后得节点,以当前节点的失败为整个pipeline的失败。
像jenkins原生就兼容快速失败。下图是jenkins最新的Blue Ocean界面,很友好的。
在第二工做法中,咱们学习到了反馈工做流,若是使用jenkins构建pipeline的时候,咱们就能够经过jenkins原生支持的可视化结果来了解到咱们近期的CI/CD状况。
在咱们的产品设计中,有一个MVP
的概念,它的意思是最小可行产品
,这个概念来自于《精益创业:新创企业的成长思惟》这本书中,书中提倡首先定义一个面向市场的最小可用的极简原型产品,而后再不断的试验和学习中,以最小的成本和最有效的方式来验证产品是否符合用户需求,灵活调整方向,以达到“快速失败,廉价失败”的方式来验证产品是否符合市场需求。这是一种不断学习,挖掘用户需求,迭代优化产品的方式。
咱们对待咱们的团队,其实也要像对待咱们的产品同样,不停地学习,不停地尝试,不停地优化,这样让咱们的团队快速成长,要容许咱们的团队犯错(可是不能重复掉进相同或类似的坑中)。
经过良好的测试+自动化流水线来提升咱们的代码的质量
在部署前:
部署后测试:
经过配置中心来区别应用在各个环境中的配置,以防止出现踩到带着开发测试的配置上线的这种老旧坑。
制品库推荐也一样隔离开,预发和生产使用同一个制品库,开发和测试使用同一个制品库,在两个制品库之间,须要人为来审核和同步。
这里的流程控制主要指的是CI/CD的流程控制。由于咱们都知道jenkins单节点在同一时间自由一个pipeline能构建,也就是说单节点jenkins不能多条pipeline并发构建。因此咱们须要搭建分布式的jenkins集群,来对pipeline的构建进行调度。
另外一种更好的方式就是经过gitlab或其余支持并发pipeline构建的工具进行构建。
下方的pipeline中在测试环节分红了三个分支,这个特性咱们再使用jenkins的pipeline时是有完美支持的,名字叫并行流,是根据条件来判断三个分支是否进行的。
咱们的服务上线后,咱们须要使用两种方式来确保咱们线上使用的服务可以健康的提供服务。
经过采集咱们的线上的服务的日志,来对线上日志进行分析,达到实时监控服务健康状况的需求。这里推荐使用市场较为开放通用的开源方案ELK
咱们同时还要对咱们的中间件,流量,物理硬件等进行相关监控,以肯定基础环境的实时监控状况,这里我推荐使用Prometheus+Granfa进行监控。
当咱们的应用日益复杂且用户量逐渐提升后,咱们须要对咱们的服务进行容灾配置以及周期醒的混沌工程演练。咱们的服务应该像下图同样逐渐进阶为可用性更高的部署方式。
咱们永远都不能心安理得的拍着胸口说咱们的服务很是的问题,可用性能达到100%。由于100%是咱们的服务的可用性极限,就算咱们的服务可用性作到6个9,8个9,可是永远也达不到100%,永远只能无限的趋近于100%。由于咱们永远都没办法避免黑天鹅事件。可是咱们能作的是出现黑天鹅事件后,咱们要快速响应,将咱们的损失降到最低。下面就说说当出现线上故障的时候,咱们应该怎么作才能更好的减小咱们的损失。
事故发生前(凡事有预案):
事故发生时(先通报,后处理):
事故处理中(先止损,后查因):
事故处理后(反思,定级):
本文来自 纳兰小筑,本文不予回复,评论请追溯原文
查看原文