理想状况下,当构建失败时,咱们是不能容许软件继续发布到生产上。可是,持续集成的理念并未贯彻到每个敏捷团队。有些团队很是严肃地对待CI实践,有些只是为了敏捷而作,有些则彻底忽略CI流程,甚至有的连CI服务器都没有搭建。html
有不少种缘由致使团队忽视CI流程。工做有不一样的优先级,产品经理不理解代码质量,测试流程和完整构建的重要性。技术经理没法分配足够的时间实施CI或者修正出问题的CI。产品和技术管理层互相不理解各自的优先级以致于最后部署的是构建失败的产品。linux
这个方法短时间看没什么问题,但其实很是危险。可能会致使产品有严重的缺陷,从而影响业务运做。这种影响是不可预测的,多是金钱的损失,也多是企业声誉,最极端的可能致使整个业务彻底流失。
然而,即便产品经理和技术团队愿意投入时间和金钱来实施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服务器。bash
推荐解决方案服务器
仔细研究市场并经过实验权衡各类选项。Slant上已经对主流的各类CI产品(https://www.slant.co/topics/799/~continuous-integration-tools)有优劣评估。
关注特性,例如容器支持,平台支持,易用型,可用性等等。
不要为了试图省钱采用一款通用的适应全部平台的CI产品,每个平台都有不一样的技术需求和挑战。
和团队讨论并借鉴过去的经验。网络
2. 业余工程师架构
在敏捷团队的每一位工程师都有很强的编程能力。但仅仅是是写代码和测试代码是不够的,还须要搭建环境的能力,运行命令行和编写脚本的技能,还要具备对各类构建工具和软件包管理工具的扎实的知识。app
最近,不少公司都开始讲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