热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DevOps落地实践点滴和踩坑记录(1)

记录初衷本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分

记录初衷

本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分享给和我一样的一线实践者。
我会通过一个个典型故事或场景来叙述,不谈理论,不谈技术, 只谈遇到的人和事,我和我的团队伙伴怎么解决实践中遇到的问题。

1)DevOps好像很火,我们也来做个搞吧

“DevOps好像大厂都在搞,听说能提高效能,我们的项目经常延期,要不我们也搞吧~”可能这是很多企业领导实施DevOps的初衷, 这个初衷本没有错,可是真的准备好了吗?想清楚做什么了吗?没关系,可以请外部专家讲下,听下来感觉就是一大堆工具的组合,不就是开发一个一体化平台吗?
如果只是看到了别人的成果,没有清楚中间付出的艰辛和改进,没有好的方法论指导,很容易照猫画虎,内部的改进“走形”!

2) 买了你们的平台,多久能有效果出来?

在企业DevOps实践初期,对于自研和外部采购还存在一些犹豫,一方面觉得如果自己投入资源研发,周期比较长,自己等不了,所以希望能够尽快通过成熟的外部工具快速达到自己的期望的目标。于此同时,外部的DevOps平台厂商或者咨询就会看到机会开始介入,对自己的产品和方案进行推广。对于外部的咨询和厂商 ,领导常问的问题就是“我买了你们的平台,多久能出效果?”,或 “你们过去的案例一般需要多久?”,“是不是我们买了你们的平台,团队可以马上用了”,诸如此类的问题往往令外部的咨询和销售无法回答,因为真正做过落地实践的人都清楚,不可能给出一个明确的答案。
其实,这种现象也反映了组织内领导没有真正清楚这个事情到底要怎么做,他们觉得工具能解决问题。这是对于DevOps的一个误区。

3)“DevOps”应该从管理层认可开始

DevOps出现之后,大家也许曾经提出或者听到过一个很关键却又普遍的问题——“DevOps转型应该从哪里开始?”
工作中,并非所有人都信任DevOps,通常遇到的第一个难题是得到管理层的认可与支持,因为DevOps的核心含义可能会掀起公司的大变革。
但是即使有管理层支持,如果管理层没有懂DevOps的带头人,往往也会出现“事倍功半”的情况,管理层基于得到结果,忽视了这是一次变革,不是某一个团队就可以进行的。

4)通过工具平台接入率来衡量改进效果?

在领导的支持下,企业开始打造自研效能平台,但是怎么推广呢?往往会陷入一个误区,就是开发了,大家接入使用就好了,接入使用效能自然就提高了。可是真的这么简单粗暴吗?
接入率能说明什么呢?接入好坏效果怎么评价?什么算接入?创建一条流水线,跑通了整个流程就算接入了,就能提高效能了?
企业为了推广自己的平台,让团队接入本来无可厚非,可是方法错了,如果为了团队的KPI, 团队自然会投入人力接入,可能团队自己没有认识到这个事情的价值,只是因为领导需要我们这么做。可以接入完了,团队继续按照自己过去的搞法玩,竹篮打水一场空。

5)找出问题比空喊口号更有用!-价值流分析

你觉得你们团队能给团队带来哪些效能提升?”有次和上层开会,领导的这个灵魂拷问让我记忆犹新,说实在的,作为深谙DevOps理论和实践的一线实践者竟然不知如何回答。下来请教了很多行业内大咖,“找出问题就基本成功一半了”,这是一个专家的回答。突然我意识到,这不是就刚开始来找团队做的“价值流分析”吗,找到问题所在,走着走着迷失了方向~
image.png
虽然各家企业DevOps落地方案各不相同,但是有一个基本的共识就是到底要解决什么问题,只有真的弄清楚问题,才能想办法解决。
在实施初期,我们一般会选择比较有代表性的项目,进行调研和分析。我们会从需求管理、开发、代码管理、构建、测试、部署、发布这几个方面进行调研和分析,判断项目是否适合迁移到DevOps平台,项目研发过程的某些环节是否需要进行改进和完善。

  • 需求管理:需求管理工具、用户故事、任务、迭代等
  • 开发:开发语言、开发工具、技术框架、运行环境、组件划分及依赖关系等
  • 代码管理:代码及文档管理工具、代码库分支及用途、分支策略、代码质量检测工具及质量指标等
  • 构建:构建工具、构建过程及构建策略、构建介质策略、中间介质及最终介质管理等
  • 测试:用例和Bug管理、自动化测试工具、验收标准等
  • 部署:环境规划、环境配置、部署方式、依赖的中间件和公共组件等
  • 发布:上线交付物、发布流程、应用及数据备份方式、回滚方式等

本阶段产出文档:调研问卷、提升建议和改进方案。
image.png

6) 寻找“反抗军”因为他们真的痛

项目试点是非常重要的环节,也是后续能否进行推广的重要评判依据。经过前期的项目改进,以及流程规范的普及推广,试点项目作出适当调整,试点项目的迁移是对之前所有工作的一个重要检验。
在试点阶段,一方面是要通过试点项目的规范化改造,打造同类项目的流程规范,形成可复制的流水线模式;另一方面看迁移前后给试点项目带来哪些好的效果,是否符合预期,是否还有需要改进的空间,平台能力是否需要提升等等。项目试点阶段产出的文档和手册是后续推广的重要资源。当试点项目的迁移达到预期效果,就可以进行DevOps平台的普及推广
但往往启动阶段,就会面临谁是第一个“吃螃蟹”的团队,这个时候寻找合适的“反抗军”是至关重要的,因为他们真的“很痛”,受研发效能底下困扰已久,他们迫切需要改变。这个初心比任何的行政命令更有效,这是发自他们内心的!
在和这些团队一起协作的时候,也需要主要投入产出比,上来不要找一些高大上的,不切实际的最佳实践。先让他们看到效果甜头,他们才愿意投入资源进行改造。当然,过程中必要的沟通技巧,和团队leader的个人关系也要搞好。

7) 平台建设思路

在DevOps实施过程中,工具链的打通必然涉及各种工具的整合。除了DevOps平台本身已经集成的Jira、Gitlab、Jenkins、Nexus、SonarQube等工具,比较常见的是对客户已有工具等集成,如客户自建的项目管理平台、CMDB平台、自动化测试平台等等。
对于用户自建工具的整合,首先需要去理清整合的真正目的是什么,能为用户带来哪些价值。比如,对项目管理平台的整合,DevOps平台可以对项目等迭代、需求、任务等信息进行收集和汇总,最终项目的进度、成本一目了然。再比如,对CMDB的集成,对于CD过程中使用的资源(主机、容器),直接从CMDB拉取数据即可,无需在DevOps平台中重新配置一遍。

这里建议,对已有工具的整合,整合的是数据,目的是让数据流转和汇总起来,而非做功能的整合。

规范化、统一化
项目迁移到DevOps平台,各个项目可以在一个统一的DevOps平台进行CICD,无需各自搭建持续集成平台。通过制定合理的规范,不同的项目遵守一致的规范,避免了代码库、CICD流程的管理混乱和不规范。制定度量指标和规范,对软件开发成果和开发过程的测量和分析,帮助对软件开发过程持续进行改进,有效提高软件交付质量和效率。

研发效能提升
可视化和可编排,无需编写pipeline脚本,一次配置,多次执行。提交或合并代码出发、定时触发或手动一键执行构建和部署,提高研发人员效率。有效减少系统变更部署上线的时间,快速响应业务变化。

报表展示、可度量
从效率、质量、进度三个维度展示任务、代码、构建、部署相关数据,结合项目看板、报表和度量指标,各环节干系人可以对进度、质量等进行判断和干预。
DevOps的建设是难以短期内完成的,需要进行总体规划,然后分阶段实施。无论是工具的整合,还是度量体系的实施,都需要按部就班、循序渐进,逐步完成建设,最终实现预期目标。

8) 以终为始,确立统一的目标,避免各自为政

上面一点提到了工具的整合,在企业组织内部,工具可能会分布在不同的部门里,主要涉及到项目管理,需求管理,代码管理,构建部署,测试等,DevOps效能平台的目标是拉通所有的工具,进行数据的整合。虽然说是工具的整合,其实不如说是工具背后部门间协作方式,和如何建立共同目标。
过去一段时间,笔者经历过各工具背后的部门间思想没有统一,大家名义上都在为一个目标服务,但是缺乏有效的统一目标和方案,说白了各自为政,这给后期的平台度量整合带来很大的麻烦,有可能系统要重新设计,各系统间的数据模型需要花大力气去适配和调整。
所以,其实在DevOps建设团队的内部也需要通过虚拟的组织和明确的领导模式来合作,避免资源浪费和冲突。一个明确的建设体系和组织,至关重要,自己都是松散的,怎么整合数据,怎么说服研发团队?

9)规范在哪里?避免停留在“纸面上”的规范

代码库规范:包括分支和标签命名规范、分支管理规范(管理流程、hotfix流程、分支策略)、代码提交规范。
以分支开发、主干发布为例,管理流程规范中会涉及代码库准备、开发集成、验收测试、发布环节,每个分支的用途,每个环节中涉及的角色,角色的操作流程都有详细规范。

CICD流程规范:命名规范:组件、介质仓库、构建定义、构建产物别名、发布定义。流水线规范:开发流水线、用户验收测试流水线及回滚流水线、发布流水线及回滚流水线、hotfix流水线。
通过制定流水线的规范,形成不同类型项目的CICD流程模版,可以作为组织级规范进行审计。

除了以上规范外,还包括项目管理规范,敏捷开发规范,测试管理规范,安全规范,发布规范,版本号规范等等。有的组织可能之前有了类似的规范,但是大多都停留在“纸面上”,实际落地很难,除非在研发过程有严格的卡点审核,否则团队很难落地执行。另一方面,规范先行很有必要,否则自研平台的开发就会形成无水之源,无本之木。
规范的建立,需要结合企业实际情况,需要流程制定部门和研发团队共同制定,并且基于可以落地的方式,而不是空口理论和举措,离开工具的标准,规范简直就是“白纸一张”!

10) 基于现状进行自研平台的开发,避免脱离团队实际

对于流水线的定义和设计,需要考虑客户的环境规划和网络策略。一般情况下,会设计和定义开发测试流水线、用户验收测试流水线、发布流水线这些常规流水线,对应开发测试环境、用户验收环境、生产环境。开发测试流水线经过多次执行,业务系统形成稳定版本,交付到用户验收测试流水线,通过用户验收测试之后,再转到发布流水线进行发布上线;这个过程也设计到代码分支和标签的维护。

有的客户,阶段交付物是某个版本的工件介质,并且介质库可以多环境共享或者同步,这种情况下需要在开发测试流水线中设计构建环节和部署环节,在用户验收流水线和发布流水线不需要构建环节,因为交付介质像下一个环境同步即可。流水线设计如下:

有的客户阶段交付物是代码,且各个环境有网络策略限制。这种类型的流水线,不同环境需要根据对应的代码分支或标签将介质构建出来,然后再进行部署。

这里想强调的是,自研平台的开发不能离开业务研发团队的实际场景,必须和他们进行沟通交流,如果单靠借鉴业界的通用流程,很可能最后会发现,团队需要的根本不是这样的。即不要离开业务场景去开发平台,需要和业务团队进行紧密的沟通和面谈,了解他们的需求,这也需要投入人力去梳理形成方案。如图所示,通过团队沟通形成交付流水线流程图,可以清晰的让双方达成共识。
image.png

11) 工具并不能解决问题, 必须依靠完整的DevOps体系

  • 立项:务必获取高层领导的支持与推动;
  • 目标:分阶段建设,明确年度目标,不宜贪大求全;
  • 组织:结合建设目标和现状,明确牵头部门,关注跨部门协同的难点;
  • 落地:规则约束,可先研讨、线下验证,再线上约束、逐步调整,且不宜初期就设置过于细致的规约;
  • 文化:切勿重系统、轻文化,一定要关注人文关怀,重视组织文化建设,保障一个相对温和的实践环境。
  • 完整的 DevOps 体系建设,不仅仅是新工具、新规则,更是新文化,而且在文化变革打头阵的情况下,很可能取得更好、更持久的成果,让组织具备自我纠偏的能力。

企业的DevOps实践绝对不是自研一套平台或者买一套商用平台,缺乏规范指引,团队赋能和培训,指标引导等要素会寸步难行,这真的不是夸张,而是来自一线的真实感受。这也是为什么DevOps落地如此之难的原因!
image.png
工具拉通,以平台为抓手,规范为指导,度量为方向,推进落地
image.png

12) 建立虚拟的工程效能改进组织

如图所示,左边需要建立虚拟的研发效能组织,包括项目管理,平台研发,运营推广,规范审计,敏捷教练,工程教练等诸多部门和角色,右侧对接业务开发团队,需要建立定期沟通机制,了解团队平台需求,同时提供最佳实践的培训和赋能。于此同时,度量指标结合规范一起制定,帮助团队持续改进。
image.png

13) 度量-效能提升永远绕不开的痛

度量,这是研发效能永恒的话题。抛开度量的业务和技术本身,探讨度量的所见所闻和所思。
企业管理者之所以关注效能提升,目标就是希望能看到度量数据,这是他们的刚需,其实并不是研发团队的刚需。如果真的把度量数据曝露在领导面前,研发团队的一举一动就摆在明面上了,一切以数据说话。这就是度量的两面性的根源。

那么在做自研效能平台时候,如何考虑度量的建设呢?我把之前提问专家的回复贴出来。

  • “如果做DevOps自研平台,什么时候引入度量合适?”
    无论是用devops工具平台自动收集度量数据,还是通过手工收集,合理的度量越早引入越好。因为度量数据的收集,需要经历一个较长的过程,才能看到供改进参考的数据。

  • “可不可以边做,边设计指标收单点局部指标数据?”
    可以,而且DevOps自研平台,也应该是小步迭代地实现度量数据的收集。不要一上来就设计和实现大批量的度量数据。因为大批量交付度量指标,会让这批度量指标很晚才能交付,不利于尽早度量。

  • “如果问题很明显了,有必要做度量,去暴露问题吗?感觉既然很明显了,就先改进解决问题”
    问题很明显了,也有必要做度量。一方面能通过度量数据,让领导和团队看到现状。另一方面,在改进问题期间,收集度量数据所形成的变化趋势,能让大家看到改进举措是否能有所成效。

目前,真正进行内部度量体系的建设,快被搞崩溃了。前期的基础数据准备相当重要,业务之复杂远超工程领域,后面再单独写文章聊。
image.png

未完待续

先写这些,后面遇到更多的坑,再分享出来。


推荐阅读
  • 开发笔记:DevOps Gitlab环境部署
    本文由编程笔记#小编为大家整理,主要介绍了DevOpsGitlab环境部署相关的知识,希望对你有一定的参考价值。DevOps介绍 ... [详细]
  • 执行jenkins最简单的方法就是通过内置的Jetty的servlet容器。您可以执行jenkins是这样的:$java-jarjenkins.war当然,你可能想jenkins的 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • |NO.Z.00394|——————————|CloudNative|——|KuberNetes&CI/CD.V32|——|Jenkins.v12|自动构建NodeJs应用.v06|
    一、NodeJS自动发版###---Jenkins执行NodeJS自动发版#~~~Jenkins——Dashboard——Deploy:true——Build——END二、 ... [详细]
  • 处理docker容器时间和宿主机时间不一致问题的方法
    本文介绍了处理docker容器时间和宿主机时间不一致问题的方法,包括复制主机的localtime到容器、处理报错情况以及重启容器的步骤。通过这些方法,可以解决docker容器时间和宿主机时间不一致的问题。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • DSP中cmd文件的命令文件组成及其作用
    本文介绍了DSP中cmd文件的命令文件的组成和作用,包括链接器配置文件的存放链接器配置信息、命令文件的组成、MEMORY和SECTIONS两个伪指令的使用、CMD分配ROM和RAM空间的目的以及MEMORY指定芯片的ROM和RAM大小和划分区间的方法。同时强调了根据不同芯片进行修改的必要性,以适应不同芯片的存储用户程序的需求。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • VSCode快速查看函数定义和代码追踪方法详解
    本文详细介绍了在VSCode中快速查看函数定义和代码追踪的方法,包括跳转到定义位置的三种方式和返回跳转前的位置的快捷键。同时,还介绍了代码追踪插件的使用以及对符号跳转的不足之处。文章指出,直接跳转到定义和实现的位置对于程序员来说非常重要,但需要语言本身的支持。以TypeScript为例,按下F12即可跳转到函数的定义处。 ... [详细]
  • docker+k8s+git+jenkins
    docker+k8s+git+jenkins,Go语言社区,Golang程序员人脉社 ... [详细]
  • Jenkins配置项目构建后的钉钉通知
    首先在任意一个钉钉群里创建自定义的钉钉机器人,然后能够看到钉钉开放的webhook复制webhookJenkins中安装钉钉插件,然后在项目的配置当中,构建后操作里添加钉钉报警ur ... [详细]
author-avatar
我只是狼却有幅羊的心肠_152
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有