CI 经常失败?可能是这 5 大原因…
本文翻译自文章 Top 5 Reasons for CI Failure,主要介绍了 CI 失败的五个原因,包括 CI 服务的错误选择、CI 工程师的不专业性、随意更改CI服务器配置、CI服务器性能差、缺乏管理等。由 flow.ci-Meng 编译整理。
_____
敏捷开发不可能完美,必须有 CI 实践的助力。CI 是持续进行分析、构建、测试和部署的自动化流程,在正式发布到生产环境之前,CI 会检查代码质量和测试产品的业务逻辑。
理想情况下,在构建失败时不能让项目或软件部署到生产环境。但是,持续集成的理念并不被每一个敏捷团队适用。一些敏捷团队非常重视 CI 实践,有的只是为了做敏捷而做,而有些团队完全忽视CI,更有甚者从未配置过 CI 服务器。
在团队中导致CI实践被忽视有各种原因。 我们都知道企业具有不同的优先级,产品经理可能并不理解内部质量、测试流程和完整构建的重要性。 技术经理不能分配时间来实施 CI 实践或修复出现问题的 CI 系统。 产品和技术经理无法了解彼此的优先级,导致部署了一个失败的产品交付给终端用户,并传递了一个非常糟糕的商业价值。
这种方法看似没有问题,但其实非常危险。可能不久的将来会导致严重的产品缺陷,从而严重影响业务运作。这种影响是不可预知的,一开始是金钱的损失,直至影响到企业声誉,最后可能直接导致整个业务完全失败。
然而,即使产品经理和技术团队同意投入更多的时间和金钱实施或修复 CI 问题,一些团队仍未成功。 这篇文章我们讨论了 CI 失败的五大原因,并提供一些潜在解决方案,希望能够帮助你。
1. CI 服务的错误选择
市场上有各种持续集成工具,CI 服务器解决方案可以是本地搭建也可以云端托管。这里列出了一堆的CI服务器解决方案。
Jenkins 是目前流行的 CI 服务器之一,大家都倾向于盲目使用它。为了使用 Jenkins 的服务,我们不得不调整项目。现在,市场上出现了一些不错的CI服务(国内如 flow.ci),选择适合自己适合需求的CI服务确实是一个挑战。
推荐解决方案:
仔细调研市场并通过实验权衡各种需求,Slant上已经对主流的各种CI产品进行了很详细的优劣评估,可参考一下;
关注特性,例如管道支持,容器支持,平台支持,易用型,可用性等等;
不要为了节省开支而选择一款通用的适应所有平台的CI产品,每个平台都有不同的技术需求和挑战;
和团队讨论并借鉴过去的经验。
2. 业余的 CI 工程师
敏捷团队的工程师应该具有出色的编码能力,但仅仅写代码和测试代码是不够的,还涉及搭建配置环境的能力,运行命令行和编写脚本的技能,还要有对自动化构建工具和依赖/包管理工具的知识储备。
最近,很多公司开始把基础设施转移到云端,所以还需要学习DevOps的技能,比如AWS,Azure 和 Heroku 等云服务。配置工具,如bash,Ansible和Chef;以及 Docker 和 Kubernetes 等容器服务。最重要的是掌握至少一种脚本语言,即Bash,Ruby或Python。
这并不意味着你应该学习世界上的所有东西,但你需要了解平台上的东西。假设一名 iOS 开发工程师,可能需要知道Cocoapods,Carthage 和 Swift 等依赖管理工具。
还有用于构建的自动化工具,如在 APPLE 命令行工具之上的Fastlane,Rake和Make,并关注最新技术发展。
每个工程师都会有擅长的东西,有的擅长编写基本编程代码(即Java,Objective-C和Swift),并对 DevOps 相关的构建自动化工具非常熟悉。有的工程师习惯于使用IDE环境开发(比如Eclipse、IntelliJ和Xcode),有些工程师擅长构建工具但写程序代码则弱一些。
这里说的CI业余工程师是那些无法脱离IDE,不会使用命令行和脚本工具的人。他们只喜欢GUI工具,拒绝使用命令行或脚本。但是,CI服务器并没有GUI界面,所有的流程必须通过脚本完成。
如果你的团队有这类人,那CI实践永远不会成功。 他们可能写出一些低质量的自动化脚本,大家的时间都浪费在改进构建自动化以及CI服务器之间的切换上,而不是真正构建对业务有用的功能。
推荐解决方案:
招聘具有CI和DevOps基础知识的工程师;
培养CI业余工程师,最好的办法是去外部培训或者请内部有经验的CI专家培训;
短期招聘一些CI专家来建立CI流程和分享经验。
3. 随意更改CI服务器配置
大多数的CI服务器允许用户通过 Web 界面更改构建的配置。 这种方法使工程师轻松创建和编辑 CI 工作流。 但是经常更改构建配置可能会产生很多问题,例如忽略的一些重要的构建步骤。 还有,每个人都有访问构建机器的权限,这可能会导致混乱, 搞不清楚谁在什么时间做了什么更改。当互相不知道更改配置的内容,可能需要花费很长时间才能定位到构建失败的原因。频繁更改 CI服务器可能会导致团队内的混乱。
推荐解决方案:
- 配置文件,bash脚本或其他相关的文件放在代码库中集中管理;
- 避免手动更改CI服务器上;
- 控制CI服务器的访问权限,并由专人负责管理;
- 不允许用户修改特定的构建步骤;
4. CI服务器性能差
在项目开发过程中,开发人员经常需要更新代码,这会触发CI服务器上的构建流程。 这意味着CI服务器需要持续运行大量任务,例如从远程服务器下载相关文件,备份数据库,运行Docker容器等,因此CI服务器必须快速可靠 ,并且稳定。 性能差的 CI 服务器不但浪费大家的构建时间,导致测试结果断断续续,也会影响让工程师们士气沮丧。
推荐解决方案:
- 选择更好更高配的服务器;
- 不要把CI服务器挂在Wifi上;
- 不要在CI服务器上安装不必要的软件;
- 科学调度CI服务器资源;
- 不要手动安装任何软件;
- 避免使用GUI访问机器,使用 SSH 访问即可。
5. 缺乏管理
项目管理在整个CI实施中起着关键作用,必须对整个构建流程设定严格的指引,同时对任何不遵守指引的行为零容忍。在任何情况下都不能发布CI流程中断的软件。任何构建中断都要被视为紧急事件并以最高优先级进行修复。很多技术经理可以做到这一点,但一些没有CI经验的管理人员可能会命令继续开发而不顾代码质量。在这样的管理下,CI实施不可能成功。
推荐解决方案:
- 建立团队的CI流程并严格执行;
- 培训项目经理并用于CI实施。
结语
在敏捷团队中实施CI是非常有挑战的,但遵循一些严格的规则并避免常见错误更有效地实施CI流程。你在CI实践中有什么样的经验?你觉得CI流程有效吗?欢迎分享你的观点!
flow.ci ,融入了 workflow 机制的持续集成(CI)服务,也可以理解为自动化流程平台,除了集成代码、编译、测试之外,还可以集成常用的工具、灵活自定义流程。本文由 flow.ci-Meng 翻译整理,想阅读更多技术文章,请访问 flow.ci 官方技术博客。
CI 经常失败?可能是这 5 大原因…的更多相关文章
- Java程序员面试失败的5大原因
下面是Java程序员面试失败最有可能的5大原因,当然也许这5点原因适用于所有的程序员,所以,如果你是程序员,请认真阅读以下内容. #1 说得太少 尤其是那些开放式的问题,如“请介绍下你自己”或“请讲一 ...
- Kubernetes 部署失败的 10 个最普遍原因
[原文].后面我们可能还会看到一个 OOMKilled 错误. 我们的应用正在挂掉?为什么? 首先我们查看应用日志.假定你发送应用日志到 stdout(事实上你也应该这么做),你可以使用 kubect ...
- 现在就使用HTML5的十大原因
你难道还没有考虑使用HTML5? 当然我猜想你可能有自己的原因: 它现在还没有被广泛的支持,在IE中不好使,或者你就是喜欢写比较严格的XHTML代码. HTML5是Web开发世界的一次重大的改变,事实 ...
- 使用HTML5的十大原因
你难道还没有考虑使用HTML5? 当然我猜想你可能有自己的原因:它现在还没有被广泛的支持,在IE中不好使,或者你就是喜欢写比较严格的XHTML代码.HTML5是web开发世界的一次重大的改变,事实上不 ...
- [转载] 使用HTML5的十大原因
转载自http://www.williamlong.info/archives/3024.html 你难道还没有考虑使用HTML5? 当然我猜想你可能有自己的原因:它现在还没有被广泛的支持,在IE中不 ...
- Xcode8之后,苹果列出了最新App被拒十大原因
开发者在开发应用程序之前,熟悉苹果审核应用的技术.内容以及设计准则是非常重要的,可以大大降低应用审核被拒的可能性. 最近,苹果通过一个专门的页面给出了截止2016年10月10日应用提交审核被拒的十大原 ...
- 【html5】使用 html5 的十大原因
你难道还没有考虑使用 html5? 当然我猜想你可能有自己的原因:它现在还没有被广泛的支持,在 ie 中不好使,或者你就是喜欢写比较严格的 xhtml 代码.html5 是 web 开发世界的一次重大 ...
- App上架流程 & 上架被拒10大原因
上架前预热 先登陆自己的开发者账号(自己提前注册好 iOS 开发者账号,这里假设你已经拥有了一个 iOS 开发者账号),进入这个页面:https://developer.apple.com/accou ...
- 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
随机推荐
- Linux环境下的IDE,极大提升编程效率
"一个真正的程序员是不用IDE(译者注:集成开发环境)的,他们都是用带着某某插件的文本编辑器来写代码."我们总能在某些地方听到此类观点.然 而,尽管越来越多的人同意这样的观点,但是 ...
- CSS核心属性
学习目标 1.css浮动属性详解 2.Css文本属性 3.Css列表属性 4.Css背景属性 5.Css边框属性 一.Css浮动属性详解 无论多么复杂的布局,其基本出发点均是:"如何在一行显 ...
- 手机自动化测试:appium源码分析之bootstrap八
手机自动化测试:appium源码分析之bootstrap八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣, ...
- js随机模块颜色
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- Python多线程Selenium跨浏览器测试
前言 在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏 ...
- 整合第二次(SSM第一次)------------>spring+struts2+mybatis
今天我们来讲解一下SSM整合,感觉整合这个比上一篇整合更费时,原因在于自己不太熟悉MyBatis了,下午的时候恶补了一下,看了一下相关的文档和PDF电子书,知识真的是你不用就会忘记的,以后还是不能懈怠 ...
- Nodejs express 获取url参数,post参数的三种方式
express获取参数有三种方法:官网实例: Checks route params (req.params), ex: /user/:id Checks query string params (r ...
- windows系统System32中各种实用的工具
工具类 这些工具可以直接打开运行 输入名字就可以调出来了 我还会上传一个java程序,运行后会显示一个界面,直接调用这些工具 1.SnippingTool.exe 截图 2.calc.exe ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- TaintDroid简介
1.Information-Flow tracking,Realtime Privacy Monitoring.信息流动追踪,实时动态监控. 2.TaintDroid是一个全系统动态污点跟踪和分析系统 ...