解决流水线瓶颈、提升编码效率的五个方法(下篇)
在《CI/CD | 解决流水线瓶颈、提升编码效率的五个方法(上篇)》中,CloudBees 公司产品营销经理 Samantha Frost 介绍了能够优化软件开发团队流水线的两个解决方案。本篇文章将为大家带来余下三个挑战的解决方案。在文章的结尾处,还将介绍她选择的解决方案。
我们所面临的挑战是相当普遍的,我们选择的解决方案解决了这些问题,并且取得了可衡量的成功,让每个人都很开心。希望你也能在其中得到启发,为自己面临的挑战找出适合的解决方案。
挑战 3:排查流水线执行问题(又名:无穷无尽地筛查日志...)
即使对流水线配置进行了全面的测试和验证,它们也始终有可能无法按预期运行。当出现问题时(例如无法完成构建,或耗时比预期长得多),解决问题的责任就落到了开发人员身上。
在传统的 CI 环境中对流水线执行问题进行故障排查并不是很高效的方式。通常需要开发人员检查构建日志或 CI 控制台界面,以追溯构建问题的根源。这意味着需要进行上下文切换,会对编码工作造成很大的干扰。
我们的解决方案是利用源代码管理(SCM)报告功能,自动将构建问题的信息推送到 GitHub 或BitBucket中。我们还使用了 Slack 插件,将定向消息直接发送给提交与 CI 作业关联代码的开发人员。因此,只有那些需要了解构建问题的开发人员才会收到通知,不会分散其他开发人员的注意力。其他的好处是,Slack 插件还可以将构建信息推送到 Slack。
结果如何呢?我的开发人员可以在不离开他们主要编码环境的情况下,跟踪构建状态并发现问题。我们减少了开发人员看到的通知,降低了对他们的干扰,这意外地节省了很多时间!
挑战 4:管理流水线依赖关系(又名:使用事件驱动流水线进行跨团队协调)
CI 流水线并不是孤立存在的。在许多情况下,一个流水线可能需要等待另一个流水线完成才能运行。传统 CI 环境中,流水线依赖关系的挑战在于开发人员必须手动跟踪多个流水线的状态,并根据状态手动触发新的作业。手动监控流水线不仅乏味,还会让开发人员分心,因为他们更愿意专注于编码工作。
为此,我们考虑了一个工具,可以从我们的 CI 流程中消除这种手动环节,无论他们在哪个团队。我们使用了跨团队协作(Cross Team Collaboration)功能,该功能可以通过在一个流水线中生成通知事件,然后将通知与其他流水线共享,从而实现了流水线之间的协调。
例如,我们有一个生成 JAR 文件的流水线。这个 JAR 文件被另一个流水线用于完成一个独立的任务。通过使用跨团队协作(Cross Team Collaboration),我们在第一个流水线中配置了一个基于代码的事件通知,然后在第二个流水线中配置了一个基于事件通知的触发器。这就是一个完全自动化的解决方案,将这两个这两个流水线连接了起来。当 JAR 文件准备就绪时,不需要依赖管理第一个流水线的团队来通知,每个流水线都可以保持同步并自动执行。我不知道你是否经历过这种情况,但我们经常因为更新名称,而需要更新路径。由于这个简单的更改,我们遇到了许多“路径未找到”的错误,这是非常令人抓狂的。基于事件的触发器让流水线可以相互监听,对我们来说是一个完美的解决方案。
挑战 5:构建基础设施的低效利用(又名:妈妈说得对,离开房间要关灯!)
在理想的情况下,企业中的每个 CI 实例只在必要时处于活动状态。当没有构建任务需要运行时,它会自动关闭或休眠,从而将基础设施资源提供给其他流水线使用。
在现实中,控制资源消耗是很困难的。开发人员通常会让 CI 实例保持活动状态,即使在不需要时也是如此,而底层的基础设施平台(如 Kubernetes)没有自动的方法来知道何时应该关闭实例。结果是,真正需要资源的工作得不到资源(也就是,产生了大量关于缺乏容量的抱怨)。此外,我们还得为不需要的基础设施买单。你会为此与签署预算的副总裁进行“有趣”的对话,然后转身将这种“有趣”的对话带回你的团队。这是不应该发生的,尤其是在如今自动化 CI 的时代。
我们的解决方案是使用休眠功能,自动在一段预定义的不活跃期后关闭或休眠 CI 实例。为了设置该功能,我们在 Kubernetes 集群(用于配置托管控制器)的 Helm 图表中启用了它。我们配置了自动休眠,并通过界面跟踪休眠的托管控制器的状态。通过自动关闭不活跃的托管控制器,开发人员将这些控制器占用的资源释放出来,以供实际处于活动状态的控制器使用。结果是构建更快了,因为每个构建都有更多的内存和 CPU 资源。
此外,当不活跃的托管控制器关闭或休眠时,Kubernetes 可以自动缩减其总节点数。这降低了企业的基础架构成本。并减少了与支付账单的人不愉快对话的次数。
将这一切做成完整的解决方案
CI 软件应该帮助开发人员更快,更高效地工作。但是,当开发人员不得不花费大量时间手动设置、修改和排查 CI 流水线时,这些工具可能会变成更加麻烦的存在,成了分散开发人员注意力、引发开发人员挫败感的根源,而他们更愿意投入时间编写代码。
为了解决我们面临的五个挑战,我们利用了CloudBees CI功能,如流水线模板、流水线模板目录、配置即代码、上下文反馈、跨团队协作和休眠托管控制器。
我们整体解决方案的经验是,它将我们的 CI 软件从一种负担变成了开发人员生产力的引擎。最终的结果是在更短的时间内向客户交付更多的价值,开发人员满意度也更高了,因为高效的 CI 意味着开发人员可以专注于他们喜欢和擅长的事情——写代码。
作者:萨曼莎·弗罗斯特(Samantha Frost),CloudBees 公司产品营销经理。
文章来源:https://www.cloudbees.com/blog/lets-get-back-to-coding-5-approaches-to-solving-pipeline-bottlenecks
评论