Pipeline 效率
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
CI/CD Pipelines 是 GitLab CI/CD 的基础构建块。 让 pipeline 更高效可以帮助你节省开发者时间,这能够:
- 加速你的 DevOps 流程
- 降低成本
- 缩短开发反馈周期
新团队或项目通常从缓慢且低效的 pipeline 开始,通过反复试验逐步改进配置。更好的做法是使用能够立即提高效率的 pipeline 功能,从而更早获得更快的软件开发生命周期。
首先确保你熟悉 GitLab CI/CD 基础知识 并理解 快速入门指南。
识别瓶颈和常见故障
检查低效 pipeline 最容易的指标是作业、阶段的运行时间,以及 pipeline 本身的总运行时间。总 pipeline 时长受以下因素严重影响:
需要注意的其他点与 GitLab Runners 相关:
- runners 的可用性及其配置的资源。
- 构建依赖项、安装时间和存储空间要求。
- 容器镜像大小。
- 网络延迟和慢速连接。
不必要的 pipeline 频繁失败也会导致开发周期变慢。你应该寻找有问题的失败作业模式:
- 随机失败的不可靠单元测试,或产生不可靠的测试结果。
- 测试覆盖率下降和相关的代码质量问题。
- 可以安全忽略但会停止 pipeline 的失败。
- 在长 pipeline 末尾失败的测试,但可以放在更早的阶段,导致反馈延迟。
Pipeline 分析
分析你的 pipeline 性能以找到提高效率的方法。分析可以帮助识别 CI/CD 基础设施中的潜在障碍。这包括分析:
- 作业工作负载。
- 执行时间中的瓶颈。
- 整体 pipeline 架构。
理解和记录 pipeline 工作流程,讨论可能的操作和变更非常重要。重构 pipeline 可能需要 DevSecOps 生命周期中团队之间的密切协作。
Pipeline 分析可以帮助识别成本效率问题。例如,使用付费云服务托管的 runners 可能被配置为:
- 为 CI/CD pipeline 分配了过多的资源,造成浪费。
- 资源不足,导致运行缓慢和时间浪费。
Pipeline 洞察
Pipeline 成功和持续时间图表 提供了 pipeline 运行时间和失败作业数量的信息。
像 单元测试、集成测试、端到端测试、代码质量 测试等测试确保 CI/CD pipeline 能够自动发现问题。可能涉及很多 pipeline 阶段,导致运行时间很长。
你可以通过在同一阶段并行运行测试不同内容的作业来改进运行时间,从而减少总运行时间。缺点是需要更多的 runners 同时运行来支持并行作业。
needs 依赖可视化
在 完整 pipeline 图 中查看 needs 依赖关系可以帮助分析 pipeline 中的关键路径并理解可能的障碍。
Pipeline 监控
全局 pipeline 健康状况是监控的关键指标,与作业和 pipeline 持续时间一起。CI/CD 分析 提供了 pipeline 健康状况的可视化表示。
实例管理员可以访问额外的 性能指标和自监控。
你可以从 API 获取特定的 pipeline 健康指标。外部监控工具可以轮询 API 并验证 pipeline 健康状况或收集长期 SLA 分析的指标。
例如,用于 Prometheus 的 GitLab CI Pipelines Exporter 从 API 和 pipeline 事件中获取指标。它可以自动检查项目中的分支并获取 pipeline 状态和持续时间。结合 Grafana 仪表板,这有助于为你的运维团队构建可操作的视图。指标图也可以嵌入到事件中,使问题解决更容易。此外,它还可以导出作业和环境的相关指标。
如果你使用 GitLab CI Pipelines Exporter,应该从示例配置开始。
或者,你可以使用能够执行脚本的监控工具,例如 check_gitlab。
Runner 监控
你也可以在主机系统或 Kubernetes 等集群中监控 CI runners。这包括检查:
- 磁盘和磁盘 IO
- CPU 使用率
- 内存
- Runner 进程资源
Prometheus Node Exporter 可以监控 Linux 主机上的 runners,kube-state-metrics 在 Kubernetes 集群中运行。
你还可以使用云提供商测试 GitLab Runner 自动扩展,并定义离线时间以降低成本。
仪表板和事件管理
使用现有的监控工具和仪表板来集成 CI/CD pipeline 监控,或从头开始构建。确保运行时间数据在团队中具有可操作性和实用性,并且运维/SRE 能够及早识别问题。事件管理 也可以帮助解决这个问题,它包含嵌入的指标图表和分析问题的所有重要细节。
存储使用
检查以下内容的存储使用情况,以帮助分析成本和效率:
Pipeline 配置
配置 pipeline 时要谨慎选择,以加速 pipeline 并减少资源使用。这包括利用 GitLab CI/CD 的内置功能,使 pipeline 运行更快、更高效。
减少作业运行频率
尝试找出哪些作业不需要在所有情况下运行,并使用 pipeline 配置来阻止它们运行:
- 使用
interruptible关键字在较新的 pipeline 取代较旧的 pipeline 时停止旧 pipeline。 - 使用
rules跳过不必要的测试。例如,只更改前端代码时跳过后端测试。 - 减少定时 pipeline 的运行频率。
- 将
cron计划 均匀分布在时间中。
快速失败
确保在 CI/CD pipeline 早期检测到错误。一个需要很长时间完成的作业会使 pipeline 在作业完成前无法返回失败状态。
设计 pipeline,使能够快速失败 的作业尽早运行。例如,添加一个早期阶段并将语法、样式检查、Git 提交消息验证等类似作业移入其中。
确定是否让长时间运行的作业在更快作业的快速反馈之前运行很重要。初始失败可能清楚地表明其余的 pipeline 不应该运行,从而节省 pipeline 资源。
needs 关键字
在基本配置中,作业总是等待之前阶段的所有其他作业完成后才运行。这是最简单的配置,但在大多数情况下也是最慢的。使用 needs 关键字的 pipeline 和父子 pipeline 更灵活且可能更高效,但也可能使 pipeline 更难理解和分析。
缓存
另一种优化方法是缓存依赖项。如果你的依赖项很少变化,比如 NodeJS /node_modules,缓存可以大大加快 pipeline 执行速度。
你可以使用 cache:when 在作业失败时仍然缓存下载的依赖项。
Docker 镜像
下载和初始化 Docker 镜像可能是作业整体运行时间的重要组成部分。
如果 Docker 镜像减慢了作业执行速度,请分析基础镜像大小和到注册表的连接。如果 GitLab 在云中运行,请寻找供应商提供的云容器注册表。此外,你可以使用 GitLab 容器注册表,它比其他注册表能更快地被 GitLab 实例访问。
优化 Docker 镜像
构建优化的 Docker 镜像,因为大型 Docker 镜像占用大量空间,并且在连接速度较慢时需要很长时间下载。如果可能,避免为所有作业使用一个大型镜像。使用多个较小的专用镜像,每个镜像用于特定任务,下载和运行速度更快。
尝试使用预装软件的自定义 Docker 镜像。下载一个较大的预配置镜像通常比使用通用镜像并每次安装软件要快得多。Docker 编写 Dockerfile 的最佳实践文章 有更多关于构建高效 Docker 镜像的信息。
减少 Docker 镜像大小的方法:
- 使用小的基础镜像,例如
debian-slim。 - 如果不是严格需要,不要安装便利工具如 vim 或 curl。
- 创建专用的开发镜像。
- 禁用包安装的手册页和文档以节省空间。
- 减少
RUN层并合并软件安装步骤。 - 使用多阶段构建 将使用构建器模式的多个 Dockerfile 合并到一个 Dockerfile 中,这可以减少镜像大小。
- 如果使用
apt,添加--no-install-recommends以避免不必要的包。 - 在结束时清理不再需要的缓存和文件。例如 Debian 和 Ubuntu 的
rm -rf /var/lib/apt/lists/*,或 RHEL 和 CentOS 的yum clean all。 - 使用 dive 或 DockerSlim 等工具来分析和缩小镜像。
为了简化 Docker 镜像管理,你可以创建一个专用组来管理 Docker 镜像,并通过 CI/CD pipeline 测试、构建和发布它们。
测试、文档和学习
改进 pipeline 是一个迭代过程。进行小改动,监控效果,然后再次迭代。许多小改进可以累积成 pipeline 效率的大幅提升。
记录 pipeline 设计和架构会有帮助。你可以直接在 GitLab 仓库中使用 Markdown 中的 Mermaid 图表 来实现这一点。
在问题中记录 CI/CD pipeline 问题和事件,包括已完成的研究和找到的解决方案。这有助于新团队成员入职,也有助于识别 CI pipeline 效率的重复性问题。
相关主题
- CI 监控网络研讨会幻灯片
- GitLab.com 监控手册
- 构建运维可见性仪表板