CI 失败的原因与解决办法

导读 敏捷软件开发必须辅以有效的持续集成(CI)。CI就是持续进行分析、构建、测试和部署的流程。在发布到生产系统之前,CI会检查代码质量和测试产品的业务逻辑。

理想情况下,当构建失败时,我们是不能允许软件继续发布到生产上。但是,持续集成的理念并未贯彻到每一个敏捷团队。有些团队非常严肃地对待CI实践,有些只是为了敏捷而做,有些则完全忽略CI流程,甚至有的连CI服务器都没有搭建。

有很多种原因导致团队忽视CI流程。工作有不同的优先级,产品经理不理解代码质量,测试流程和完整构建的重要性。技术经理无法分配足够的时间实施CI或者修正出问题的CI。产品和技术管理层互相不理解各自的优先级以至于最后部署的是构建失败的产品。

这个方法短期看没什么问题,但其实非常危险。可能会导致产品有严重的缺陷,从而影响业务运作。这种影响是不可预测的,可能是金钱的损失,也可能是企业声誉,最极端的可能导致整个业务完全流失。
然而,即使产品经理和技术团队愿意投入时间和金钱来实施CI和修正CI问题。一些团队还是从未成功。我们在这里讨论一下CI失败的5大原因和克服这些困难的推荐解决方案。

1. 错误地选择CI服务器

市场上有很多种持续集成工具。CI服务器可以在云端也可以在本地。这里可以推荐一堆CI服务器(https://www.slant.co/topics/799/~continuous-integration-tools)。
Jenkins是其中之一,但过去人们都盲目地使用它。为了适应Jenkins,我们时常不得不更改项目妥协。现在,情况有所改变,市场上出现了多种不错的CI服务器。面对如此众多的产品,选择适合自己所需的的确是一项挑战。

搭建CI服务器需要耗费大量的时间和金钱。如果没有提前研究就贸然决定,那么前期的投入都付之东流。管理层经常犯的一个错误就是选择一款通用型CI服务器或者适用于所有平台的服务。设想一下,你的应用包含Web网站、IOS app、Android app,用一个通用CI并不是一个很好的办法。我们必须非常小心来选择CI服务器。

推荐解决方案

仔细研究市场并通过实验权衡各种选项。Slant上已经对主流的各种CI产品(https://www.slant.co/topics/799/~continuous-integration-tools)有优劣评估。
关注特性,例如容器支持,平台支持,易用型,可用性等等。
不要为了试图省钱采用一款通用的适应所有平台的CI产品,每一个平台都有不同的技术需求和挑战。
和团队讨论并借鉴过去的经验。

2. 业余工程师

在敏捷团队的每一位工程师都有很强的编程能力。但仅仅是是写代码和测试代码是不够的,还需要搭建环境的能力,运行命令行和编写脚本的技能,还要具有对各种构建工具和软件包管理工具的扎实的知识。

最近,很多公司都开始讲IT架构迁移上云,所以还需要 Devops 技能。例如,AWS、AZure、Heroku,各种配置工具例如:bash、Ansible和 Chef,还有容器Docker and Kubernetes。最重要的是要具备至少一种脚本编程能力,比如Bash、Ruby或者Python。

这当然并不意味者你需要学所有的东西,但你需要了解平台上的所有东西。假设一位从事IOS开发的工程师,他就需要了解各种相关的工具例如:Cocoapods、Carthage和Swift Package Manager。

还有用于构建的工具,例如在APPLE 命令行工具之上的Fastlane、Rake和Make。

术业有专攻,有些工程师擅长基本编程语言,比如 Java、Objective-C和Swift,并且对DevOps相关的各种工具相当熟悉。 有些工程师则习惯于使用IDE环境开发(比如Eclipse、IntelliJ和Xcode),他们不太熟悉使用终端敲入命令。还有些工程师擅长构建工具但写程序代码则弱一些。

所谓业余工程师是指那些只会在IDE环境下编程,不会使用命令行和脚本工具的人,他们只喜欢使用GUI去做事而抗拒使用命令行或脚本。但是,CI服务器并没有GUI,所有的事情都只能用脚本来完成。

如果你的团队有这类人,那CI就永远不可能成功,他们可能会开发一些质量低劣的自动化脚本,然后大家的时间都花在差错,该机和CI服务器切换上,而不是真正构建对业务有意义的功能。

推荐解决方案

招聘具有CI和DevOps基础知识的工程师。
培训工程师,最好的办法是送他们去外面培训或者请内部有经验的CI专家培训。
短期招聘一些CI专家来建立CI流程和分享经验。

3. 随意更改CI服务器配置

许多CI服务器允许用户通过Web界面去更改CI服务器配置。这个方法对工程师而言的确比较方便。但是经常更改CI配置也会产生很多问题,比如把一些很重要的步骤错误地忽略掉。而且,如果每个人都有权限在上面更改的话,最后就搞不清楚谁,什么时间做了什么更改。当查错的时候,都需要花费大量的时间。经常性地更改CI服务器会导致很多问题。

推荐解决方案

把配置文件,脚本和其他相关文件都放到代码库集中管理。
避免手工更改CI 服务器的配置。
控制访问CI 服务器的权限。
不允许用户更改一些特定的构建步骤。

4. CI服务器性能差

在开发过程中,程序员需要经常更新代码,这会不停地在CI服务器上触发重构流程。这意味着CI服务器需要不断地运行大量作业。例如从远端服务器下载,备份数据库,运行Docker容器等等,所以CI服务器必须快速,可靠,网络稳定。低配的CI服务器会影响整个构建流程,导致时间延长,测试时断时续,从而浪费大量的时间。

推荐解决方案

采用高配服务器。
不要在CI服务器上安装不必要的软件。
不要把CI服务器挂在Wifi上。
科学地调度在CI服务器上跑的作业。
不要手工安装软件。
避免使用GUI连接 CI 服务器,使用SSH足够了。

5. 缺乏管理

项目管理在整个CI实施中起到关键作用。必须对整个构建流程设定严格的指引,同时对任何不遵守指引的行为零容忍。在任何情况下都不能发布CI流程中断的软件。任何构建中断都要被视为紧急事件并以最高优先级进行修复。很多技术经理可以做到这一点,但一些没有CI经验的管理人员可能会命令继续开发而不顾代码质量。如果这样管理,CI实施则不可能成功。

推荐解决方案

建立CI流程并严格执行。
培训项目经理并用于CI实施。

总结

在敏捷团队中实施CI是非常有挑战的,但是遵循严格的规则并避免一些常见错误可以有效地实施CI流程。

原文地址:http://www.linuxprobe.com/ci-fail.html

时间: 2024-10-11 05:50:24

CI 失败的原因与解决办法的相关文章

用adb pull命令从android系统中读取文件失败的原因及解决办法

问题:使用adb pull命令从android系统中读取文件失败.显示:Permission denied 原因:是由于文件权限原因引起. 使用ls -l命令查看android系统中的文件权限为: -rw-rw---- app_51   app_51 也就是说,该文件只有app_51用户以及app_51群组拥有读写权限,而adb shell的用户为shell,既不是app_51用户,也不在app_51群组中,所以没有权限读取这个文件.所以就出现了 Permission denied. 解决方法:

asp.net批量删除XML节点失败的原因及解决办法

今天操作XML的时候,用到了批量循环删除节点.出现了问题,即循环未结束,程序就跳出循环.搞了好久才弄明白. 解决前的代码: XmlNodeList items = xn.ChildNodes; //获取节点列表 //删除所有节点 for (int i = 0; i < items.Count; i++) { XmlElement page = (XmlElement)items[0]; xn.RemoveChild(page); } 因为每次循环,删除节点后,item.Count的值都会-1.

数据库连接失败的原因及解决方法

各种业务系统在使用过程中都会遇到一些问题,因数据库连接失败,不能登录管理软件就是其中之一,这个很令人头疼而且常见的问题 一般的业务系统均采用的是SQL数据库,我们这里总结了SQL数据库连接失败的原因和解决方法: 原因一:登录账号.密码.服务器名称.数据库名称登录错误导致不能连接,这个比较常见,仔细检查好所填信息是否正确,填写正确一般就可以解决. 解决方法:当正在使用的软件出现数据库不能连接时,一般就是服务器名出现问题,更改服务器名称一般可以解决问题.数据库如果是安装在本机,服务器名可以用".&q

zblog上传安装主题插件不成功的原因和解决办法

最近有不少zblog用户反映在后台上传安装主题或者插件的时候出现了问题.本文就来尝试说明下这类问题的原因和解决办法. 首先来说说zblog主题或者插件的安装方法,一共有三种方式: 第一种是直接在网站后台--应用中心里面打开应用页面在线安装: 第二种是获得zblog专用应用格式".zba"文件在后台上传安装: 第三种是获得源文件文件,直接将文件通过ftp上传到zblog对应的文件夹内(详细方法:https://www.txcstx.cn/post/624.html): 出现问题一般是第二

HttpClient的CircularRedirectException异常原因及解决办法

HttpClient的CircularRedirectException异常原因及解决办法 这两天在使用我自己爬虫抓取网页的时候总是出现 org.apache.http.client.ClientProtocolException at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909) at org.apache.http.impl.client.AbstractHttpClie

Android intent 传值不更新的原因和解决办法

当 Activity 的启动模式是 singleTask 或者 singleInstance 的时候.如果使用了 intent 传值,则可能出现 intent 的值无法更新的问题.也就是说每次 intent 接收到的值都是第一次接到的值.因为 intent 没有被更新.想要更新需要做两件事情. 1. 发送方 Activity,加上一句话 ? 1 PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,Pen

[转]&quot;error while loading shared libraries: xxx.so.x&quot; 错误的原因和解决办法

[转]"error while loading shared libraries: xxx.so.x" 错误的原因和解决办法 http://blog.csdn.net/sahusoft/article/details/7388617 一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared obje

js报TypeError $(...) is null错误,jquery失效的原因及解决办法

最近在工作中发现个问题,原本好好的网页,写了一些自己的jquery代 码之后,竟然总是不起作用,无论写的多么简单,都不起作用,似乎jquery失效了一般,在火狐下调试看了下,页面报TypeError $(...) is null这种错误,找了半天原因最后发现竟是页面中加载的一个插件给捣的鬼,是它将jquery的$方法给覆盖了.对于这个问题,现在分享两种解决方法. (1)删冲突插件,jquery作为基础库,当然是没有理由被删了.这个方法最直接了. (2)将jquery的$方法改名,具体改名方法如下

html页面顶部出现一段空白,检查控制台发现body 下出现&amp;#65279字符,原因及解决办法

html页面顶部出现一段空白,检查控制台发现body 下出现&#65279字符,原因及解决办法 分析: 原来是页面编码时增加了BOM,此页面后端数据主要是PHP语言,对PHP来讲PHP在设计时没有考虑BOM问题,,不会忽略UTF-8编码的文件开头BOM的那三个字符,会把BOM作为该文件开头正文的一部分.由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码.由于在html一开头有这3个字符的存