Какие этапы включает CI (Continuous Integration)?

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

Ответ

В моих проектах пайплайн Continuous Integration (CI) обычно состоит из следующих этапов, автоматически запускаемых при каждом push в репозиторий:

  1. Fetch & Checkout: Клонирование репозитория и переход в нужную ветку/коммит.
  2. Dependency Installation: Установка зависимостей проекта. Например, для Node.js это npm ci, для Python — pip install -r requirements.txt, для Java/Maven — загрузка артефактов из Nexus.
  3. Static Analysis (Linting/SAST): Проверка кода на соответствие стилю и поиск потенциальных уязвимостей. Я использую sonarqube-scanner, golangci-lint, hadolint для Dockerfile.
  4. Build/Compilation: Сборка артефакта приложения. Например, docker build -t app:$CI_COMMIT_SHA ., mvn clean package, go build -o bin/app.
  5. Unit Testing: Запуск модульных тестов с измерением покрытия. Я настраиваю сборку отчетов для инструментов вроде JaCoCo (Java) или pytest-cov (Python).
  6. Integration Testing: Запуск тестов, проверяющих взаимодействие с внешними сервисами (БД, очереди сообщений). Часто для этого разворачивается временное тестовое окружение с помощью Docker Compose или в Kubernetes (namespace ci-*).
  7. Artifact Publishing: Сохранение собранного артефакта (Docker-образа, JAR-файла) в реестр. Я пушил образы в GitLab Container Registry или Harbor, а бинарники — в Nexus или S3.
  8. Smoke Testing (Optional): Базовая проверка работоспособности только что собранного артефакта, например, запуск health-check эндпоинта.

Пример конфигурации в GitLab CI:

stages:
  - test
  - build
  - integration
  - publish

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

lint:
  stage: test
  script:
    - golangci-lint run ./...

unit-test:
  stage: test
  script:
    - go test -v -coverprofile=coverage.out ./...
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.out

build:
  stage: build
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - main
    - merge_requests