Работали ли вы с кэшированием в GitLab CI/CD?

«Работали ли вы с кэшированием в GitLab CI/CD?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я активно использовал механизм кэширования в GitLab CI для значительного ускорения выполнения пайплайнов, особенно в проектах с большими зависимостями (Node.js, Python, Java).

Мой подход и примеры:

  • Стратегия ключей: Использование разных ключей для кэша в зависимости от ветки или файла зависимостей, чтобы изменения в package.json или requirements.txt инвалидировали старый кэш.

    cache:
      key: "$CI_COMMIT_REF_SLUG-$CI_PROJECT_ID"  # Кэш на ветку
      # ИЛИ
      key:
        files:
          - package-lock.json  # Кэш обновится при изменении lock-файла
        prefix: "$CI_COMMIT_REF_SLUG"
      paths:
        - node_modules/
        - .npm/
      policy: pull-push  # Явно указываем политику
  • Разделение кэшей: Для мульти-проектных монорепозиториев или разных этапов (lint, test, build) создавал отдельные кэши, чтобы избежать их нецелевого использования.

    cache:
      - key: "npm-cache-$CI_COMMIT_REF_SLUG"
        paths: [node_modules/]
        policy: pull-push
      - key: "pip-cache-$CI_COMMIT_REF_SLUG"
        paths: [.cache/pip/]
        policy: pull-push
  • Кэширование Docker-образов: Для Docker-сборок использовал docker-драйвер кэша, что сокращало время сборки с нескольких минут до секунд.

    variables:
      DOCKER_DRIVER: overlay2
    build:
      stage: build
      script:
        - docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
      cache:
        key: "docker-cache"
        paths: [docker-cache/]
        policy: pull-push

Важные выводы: Кэш в GitLab — это оптимизация, а не гарантия хранения данных. Для критически важных артефактов (финальные билды) всегда использовал artifacts. Также важно мониторить размер кэша и очищать его через API GitLab при необходимости.