Какой опыт работы с gitlab CI

Опыт работы с GitLab CI охватывает полную настройку и использование системы непрерывной интеграции и доставки в рамках проектов различного масштаба — от небольших микросервисов до крупных монолитных приложений, требующих сложного CI/CD-конвейера. В работе активно использовались возможности .gitlab-ci.yml, runner'ы (как shared, так и self-hosted), артефакты, переменные среды, кэширование, условные этапы и интеграция с Kubernetes/Docker.

📄 Написание и сопровождение .gitlab-ci.yml

Один из ключевых элементов работы заключался в проектировании конфигурационных файлов .gitlab-ci.yml. Примерно выполнялись следующие задачи:

  • Создание пайплайнов с этапами:

    • build: сборка артефактов, контейнеров.

    • test: запуск unit, integration, UI-тестов.

    • lint: проверка стиля и форматирования.

    • deploy: автоматический или полуавтоматический деплой на dev/stage/prod.

  • Использование only, except, rules, when, needs, dependencies для управления логикой выполнения.

  • Управление конфигурацией через include (модуляризация пайплайнов).

  • Использование extends для переиспользования шаблонов.

Пример типового .gitlab-ci.yml:

stages:
\- build
\- test
\- deploy
build-job:
stage: build
script:
\- npm install
\- npm run build
artifacts:
paths:
\- dist/
expire_in: 1 hour
test-job:
stage: test
script:
\- npm run test
deploy-job:
stage: deploy
only:
\- main
script:
\- bash deploy.sh

⚙️ Работа с GitLab Runner

  • Настройка и обслуживание собственных runner'ов с Docker executor'ами.

  • Разграничение runner'ов по тегам для отдельных задач (например, для тестов, для Docker-сборок).

  • Оптимизация использования runner'ов за счёт кэширования, использования pre/post-скриптов, правильной установки зависимостей.

  • Безопасная передача переменных (CI/CD Variables) и секретов (интеграция с Vault, .env, Base64-переменные и т.п.).

🧪 Тестирование и покрытие кода

  • Интеграция с инструментами покрытия (например, coverage.py, jacoco, jest --coverage).

  • Передача отчётов о покрытии в GitLab UI.

  • Разграничение тестов по типам: быстрые (юнит) и долгие (интеграционные, UI).

  • Запуск E2E-тестов на selenium-grid или cypress с использованием Docker.

🐳 Docker и GitLab CI

  • Сборка Docker-образов в пайплайне:

    • Кеширование слоёв с использованием docker build --cache-from.

    • Push образов в GitLab Container Registry или Docker Hub.

  • Использование services в пайплайне (например, postgres, mysql, redis) для тестов.

  • Обработка .dockerignore, .env, и секретов во время сборки.

🚀 Автоматический деплой (CD)

  • Настройка CD на разные среды:

    • dev — каждый коммит.

    • stage — вручную или по тегу.

    • prod — после merge request или вручную.

  • Использование:

    • environment — для отслеживания развернутых версий.

    • manual и when: manual для деплоя по кнопке.

    • Rollback через previous deployments.

🔐 Безопасность и контроль доступа

  • Работа с секретами: CI/CD Variables с ограничением по окружениям и защищённости.

  • Настройка разрешений для protected branches и protected tags.

  • Использование scoped runner'ов для разных проектов.

📊 Мониторинг и отчёты

  • Настройка JUnit/TestNG/pytest-отчётов с визуализацией в GitLab UI.

  • Использование GitLab Pages для публикации артефактов или документации (mkdocs, sphinx).

  • Включение code quality и static analysis (например, eslint, flake8, SonarQube).

📚 Примеры дополнительных техник

  • Использование matrix builds через anchor'ы и переменные.

  • Статическая генерация документации на каждый мерж.

  • Создание отдельных пайплайнов для merge request и push.

  • Оптимизация времени сборки за счёт cache:key и artifacts:dependencies.

  • Использование trigger для запуска дочерних пайплайнов.

  • Настройка многоуровневых пайплайнов (parent-child pipelines).