Что такое система непрерывной интеграции (CI)?

«Что такое система непрерывной интеграции (CI)?» — вопрос из категории CI/CD и DevOps, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Система непрерывной интеграции (CI) — это практика и набор инструментов для автоматического слияния изменений кода от всех разработчиков в общую ветку (чаще всего main или master) по несколько раз в день. Каждое такое слияние запускает автоматизированный процесс сборки и тестирования, чтобы как можно раньше выявить возможные ошибки и конфликты.

Как это выглядит в моей работе QA/инженера по тестированию:

  1. Разработчик создает Pull/Merge Request (PR/MR) со своими изменениями.
  2. CI-пайплайн запускается автоматически. В его задачи входит:
    • Сборка (Build): Компиляция кода, установка зависимостей, создание артефакта (jar, docker-образ и т.д.).
    • Статический анализ кода: Запуск линтеров (например, SonarQube, ESLint) для проверки стиля и выявления "запахов кода".
    • Запуск автоматических тестов: Это ключевая часть для QA.
      • Юнит-тесты: Выполняются всегда и быстро.
      • Интеграционные тесты: Проверяют взаимодействие модулей.
      • E2E-тесты (часть CD): Могут запускаться на этом этапе или позже.
  3. Результат пайплайна (успех/провал) отображается прямо в PR. Я, как тестировщик, смотрю на этот статус перед тем, как приступать к ручному регрессионному тестированию фичи. Если пайплайн "красный" (упали тесты), PR не мержится до исправления.

Преимущества с точки зрения QA:

  • Раннее обнаружение дефектов: Ошибки выявляются на этапе коммита, а не в конце спринта.
  • Повышение качества кода: Стабильность основной ветки поддерживается автоматически.
  • Автоматизация рутины: Не нужно вручную выкатывать каждую ветку и запускать тесты.
  • Прозрачность: Вся команда видит статус сборки.

Пример этапа запуска тестов в GitLab CI (gitlab-ci.yml):

test:
  stage: test
  script:
    - echo "Запуск юнит-тестов..."
    - mvn test
    - echo "Запуск интеграционных тестов..."
    - mvn verify -P integration-tests
  artifacts:
    when: always
    reports:
      junit:
        - target/surefire-reports/TEST-*.xml
        - target/failsafe-reports/TEST-*.xml