// devops interview / ci-cd

Вопросы на собеседовании: CI/CD

Надёжные pipeline, воспроизводимые сборки, безопасные релизы и управляемый откат. Здесь — топ-12 по частоте на реальных собесах: у первых вопросов открыт полный разбор, у остальных — устный эталон. Весь банк темы (12 вопросов) с разборами — в приложении.

Открыть тему в приложении каждый день бесплатно: 3 эталона и 3 проверки арбитром

junior: база, с которой начинают

Из каких jobs и зависимостей ты соберёшь базовый CI/CD pipeline для сервиса и почему не стоит превращать его в одну длинную команду?

как ответить Я разделю проверку формата и типов, сборку, тесты, упаковку и deploy на jobs с явными зависимостями. Независимые проверки запущу параллельно, а выпуск разрешу только после обязательных gates. Такое разбиение быстрее даёт обратную связь и показывает, на каком шаге и с какими входами произошёл сбой.

разбор

Job должен иметь понятный вход, одну ответственность и проверяемый результат. Если lint, тесты, сборка образа и deploy спрятаны в одном shell-скрипте, CI видит только общий exit code: сложнее повторить отдельный шаг, распараллелить работу и ограничить права deployment-части.

Базовый граф обычно выглядит так:

  • быстрые статические проверки стартуют сразу;
  • сборка создаёт версионированный artifact;
  • unit и integration tests зависят только от действительно нужных результатов;
  • security-проверки становятся блокирующими в соответствии с политикой риска;
  • deploy получает artifact и credentials конкретного environment лишь после обязательных gates.

Stages дают простой последовательный барьер, а DAG-зависимости позволяют не ждать несвязанные jobs. Ускорять pipeline нужно после сохранения понятного графа: скрытая зависимость от рабочего каталога или состояния предыдущего runner делает результат случайным.

чтобы прозвучать сильнее Добавь fail-fast для дешёвых проверок и критический путь pipeline. Объясни, какие jobs можно отменять для устаревшего commit, а deploy в общий environment — нельзя просто запускать параллельно.

devops-ci-cd-001 · junior · high

Чем artifact отличается от cache в CI? Что здесь должно пережить cache miss, а что обязано передаваться как результат сборки?

cache:
  key:
    files:
      - pnpm-lock.yaml
  paths:
    - .pnpm-store/

build:
  script:
    - pnpm install --frozen-lockfile
    - pnpm build
  artifacts:
    paths:
      - dist/

как ответить Cache ускоряет повторное получение зависимостей или промежуточных файлов, но job обязан корректно работать и при промахе cache. Artifact — результат конкретной job: бинарник, пакет, отчёт или каталог сборки, который скачивает следующая job либо пользователь. В примере .pnpm-store/ — cache, а dist/ — artifact этого build.

разбор

У cache и artifact разный контракт. Cache может быть вытеснен, не найтись на другом runner или восстановиться по более общему ключу, поэтому на нём нельзя строить корректность pipeline. Ключ обычно включает платформу, версию инструмента и хеш lock-файла; иначе job рискует получить несовместимые зависимости. Восстановленный cache нужно считать недоверенным входом, особенно между ветками с разным уровнем доверия.

Artifact связан с конкретным запуском и передаёт его результат дальше по графу. Для него задают срок хранения, доступ и контроль целостности. Сборка должна один раз создать тот объект, который затем тестируют и продвигают, а не пересобирать похожий файл в каждой job.

Практическая проверка проста: удалить cache и повторить pipeline. Он может стать медленнее, но не должен изменить результат или упасть. Удаление обязательного artifact, напротив, должно явно остановить зависимую job.

чтобы прозвучать сильнее Расскажи про cache poisoning: почему workflow из недоверенной ветки не должен иметь возможность подготовить исполняемый cache для привилегированного deploy. Для artifact назови digest и provenance как более сильные гарантии, чем одно имя файла.

devops-ci-cd-002 · junior · high

Один и тот же commit собрали дважды и получили разные container images. Что проверишь, чтобы сборка стала воспроизводимой?

как ответить Сначала фиксирую все входы: commit, lock-файлы, toolchain, base image по digest, build arguments и архитектуру runner. Сборка должна идти в чистом окружении без неявного сетевого или локального состояния. Затем ищу источники недетерминизма — время, случайный порядок файлов, плавающие версии и генерируемые метаданные.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-003 · junior · high

Какие проверки должны блокировать merge и deploy, а какие можно запускать позже? Как не превратить test gate в формальность?

как ответить Merge блокируют быстрые и надёжные проверки, без которых commit заведомо нельзя считать пригодным: сборка, типы, lint и критичные тесты. Перед deploy добавляют проверки, зависящие от готового artifact и environment, например integration, security policy и smoke tests. Нестабильный тест нельзя просто пометить необязательным: его чинят или временно изолируют с владельцем и сроком возврата.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-004 · junior · high

Как передавать секреты в CI/CD и почему маскирование значения в логах не считается границей безопасности?

как ответить Секрет храню в secret store CI или внешнем менеджере и выдаю только job, которой он нужен, с минимальными правами и областью environment. Маскирование защищает от случайного вывода известной строки, но привилегированный или скомпрометированный шаг может преобразовать и отправить секрет наружу. Поэтому недоверенный код не запускают на runner с production credentials.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-005 · junior · medium

middle: где отделяют уверенных

Релиз сломал прод. Что должен заранее подготовить pipeline для быстрого rollback и почему нельзя просто пересобрать старый commit?

как ответить Pipeline должен хранить неизменяемый artifact каждого релиза, его digest, конфигурацию и историю deployment. Rollback повторно продвигает уже проверенный предыдущий artifact, а не пересобирает commit с потенциально новыми зависимостями и base images. Перед откатом проверяю совместимость со схемой данных, конфигурацией и внешними контрактами.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-006 · middle · medium

Как выпустить несовместимое изменение схемы базы без простоя, если во время rollout одновременно работают старая и новая версии приложения?

как ответить Использую expand-and-contract: сначала добавляю совместимую схему, затем выпускаю код, который умеет работать в переходном состоянии, переношу данные и только после этого удаляю старое поле отдельным релизом. Миграция запускается один раз из сериализованной job и наблюдается отдельно. Откат кода остаётся возможным, пока contract-шаг не убрал старый контракт.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-007 · middle · medium

Чем canary deployment отличается от blue-green и по каким сигналам ты будешь продвигать или останавливать новую версию?

как ответить Canary постепенно отдаёт новой версии ограниченную долю реального трафика и уменьшает blast radius, но требует корректного разделения трафика и сравнения метрик. Blue-green держит два полноценных окружения и переключает трафик между ними, поэтому cutover и возврат быстрые, но цена по ресурсам выше. Продвижение привязываю к заранее заданным SLO, техническим и бизнес-метрикам, а не только к тому, что процесс запустился.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-008 · middle · medium

Как устроить production gate так, чтобы одобрение действительно ограничивало риск, а не было кнопкой «пропустить дальше»?

как ответить Production оформляю как защищённый environment: разрешённые ветки и субъекты, обязательные проверки, при необходимости независимый reviewer и отдельные secrets. Одобряется конкретный commit и artifact после просмотра diff, test evidence и плана изменения. Инициатор не должен автоматически одобрять собственный опасный deploy, если процесс требует разделения обязанностей.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-009 · middle · medium

Два pipeline почти одновременно деплоят разные commit в один production environment. Какие гонки возможны и как их убрать?

как ответить Старый pipeline может закончить позже нового и затереть production более ранней версией; параллельные миграции и изменения конфигурации могут конфликтовать ещё опаснее. Для общего environment сериализую deployment через concurrency group или resource lock и запрещаю устаревшему commit продвигаться поверх нового. Сам deploy делаю идемпотентным и сверяю ожидаемую текущую версию.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-010 · middle · medium

senior: глубина и продакшн

Полный CI монорепозитория идёт полтора часа. Как безопасно запускать только affected-проекты и не пропустить поломку зависимого сервиса?

как ответить Changed files сопоставляю с проектами, затем по dependency graph добавляю все обратные зависимости, чьи build или tests могут измениться. Диапазон diff считаю от корректной базы до проверяемого head, а root lock-файл, общие конфиги и генераторы могут расширить набор вплоть до всего репозитория. Cache остаётся только оптимизацией, а merge queue и периодический full pipeline страхуют ошибки модели affected.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-011 · senior · low

Почему OIDC для cloud deploy безопаснее постоянного ключа и какие границы доверия всё равно нужно настроить в CI?

permissions:
  contents: read
  id-token: write

как ответить OIDC позволяет job обменять подписанное утверждение о своей identity на короткоживущий cloud token, поэтому постоянный cloud key не хранится в CI. id-token: write только разрешает запрос OIDC-токена и само по себе не выдаёт доступ к облаку. Cloud trust policy обязана проверить issuer, audience и claims, ограничивающие repository, ref, workflow или защищённый environment.

полный разбор и проверка ответа арбитром — в приложении devops-ci-cd-012 · senior · low

Соседние темы того же собеса