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

Ответ

Система непрерывной интеграции (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

Ответ 18+ 🔞

Да ты посмотри, какая штука интересная — Continuous Integration, или CI, если по-пацански. Это ж, блядь, как на конвейере: все разработчики пихают свой код в общую кучу по несколько раз на дню, а система его тут же ловит и начинает мучать — собирает, тестирует, нюхает, как сволочь. Главная фишка — чтобы ошибки вылезали сразу, а не как обычно, в пятницу вечером, когда уже все мозги набекрень.

Как я, как тестировщик, с этим живу:

  1. Программист накодил своё и создаёт Pull Request — типа, «зацените, че я наваял».
  2. И тут начинается ёперный театр! Автоматом запускается CI-пайплайн, который делает три вещи:
    • Сборка: Всё компилирует, зависимости ставит, артефакт лепит — в общем, пытается из этого набора букв что-то работающее собрать. Если не собралось — всем сразу понятно, что чувак где-то хуйню написал.
    • Статический анализ: Запускает линтеры, которые орут: «Ты чё, сука, тут пробелы табами заменил?» или «Этот метод — просто пиздопроебина, перепиши!». SonarQube особенно любит позлить народ.
    • Запуск автотестов: А вот это моя любимая часть, ебать мои старые костыли. Пайплайн гоняет:
      • Юнит-тесты: Быстрые, как укол. Должны всегда проходить.
      • Интеграционные тесты: Проверяют, как разные модули друг друга терпят.
      • E2E-тесты: Иногда и их тут запускают, но это уже посильнее.
  3. Итог пайплайна — зелёная галочка или красный крест — торчит прямо в PR. Я, прежде чем вообще смотреть на эту фичу руками, первым делом туда тыкаю. Если там всё красное и тесты посыпались — я даже не начинаю. Пусть сначала свою лажу чинят. Доверия к такому коду — ноль ебать.

Чем это мне, как QA, выгодно:

  • Баги всплывают сразу. Не надо ждать конца спринта, когда уже всё сломано в хлам. Раннее обнаружение — наше всё.
  • Качество кода не падает ниже плинтуса. Ветка main всегда в более-менее адекватном состоянии, а не как помойка.
  • Меньше рутины. Мне не надо самому каждый раз разворачивать каждую ветку и вручную тесты гонять — за меня всё делает железный раб.
  • Всё на виду. Вся команда видит, у кого сборка прошла, а у кого нет. Прозрачность, блядь, полная.

Вот, смотри, как примерно выглядит кусок конфига для GitLab CI, где тесты запускаются:

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

Короче, CI — это такая хитрая жопа, которая заставляет всех быть в тонусе. Не даёт расслабиться и наговнокодить. А если и наговнокодил — то узнаешь об этом через пять минут, а не через две недели. Вещь, блядь, полезная.