Был ли опыт работы с CI/CD в GitLab?

«Был ли опыт работы с CI/CD в GitLab?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, у меня есть опыт настройки и поддержки CI/CD пайплайнов в GitLab для проектов, включая ML-сервисы и бэкенд-приложения. Основная цель — автоматизация сборки, тестирования, анализа кода и развертывания.

Ключевые задачи, которые решал:

  • Автоматизация тестирования: Запуск юнит- и интеграционных тестов при каждом пуше в merge request (MR).
  • Статический анализ кода: Интеграция с pylint, black, mypy для Python-проектов.
  • Сборка и публикация Docker-образов: Автоматическая сборка образа при мерже в основную ветку и его отправка в GitLab Container Registry или сторонний реестр.
  • Развертывание: Настройка деплоя в staging/production среды (вручную через manual jobs или автоматически).
  • Кеширование зависимостей: Использование кеша для pip/poetry и Docker-слоев для ускорения сборки.

Пример .gitlab-ci.yml для Python/ML проекта:

stages:
  - lint
  - test
  - build
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

# 1. Проверка кода
lint:
  stage: lint
  image: python:3.10-slim
  script:
    - pip install black pylint mypy
    - black --check --diff .
    - pylint --fail-under=7.0 src/
    - mypy src/
  only:
    - merge_requests

# 2. Запуск тестов
test:
  stage: test
  image: python:3.10-slim
  script:
    - pip install -r requirements.txt
    - pytest tests/ --cov=src --cov-report=xml
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml
  only:
    - merge_requests
    - main

# 3. Сборка Docker-образа
build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - main

# 4. Деплой (ручной запуск)
deploy_staging:
  stage: deploy
  image: alpine:latest
  script:
    - echo "Deploying $DOCKER_IMAGE to staging..."
    # Здесь команды для деплоя (kubectl, ansible, ssh)
    - kubectl set image deployment/ml-service app=$DOCKER_IMAGE -n staging
  when: manual
  only:
    - main

Использованные возможности GitLab CI: артефакты, кеши, environments, manual jobs для контроля деплоя, правила (only/except), секретные переменные (CI/CD Variables).