Главная/CI/CD/Обзор

Раздел 16. CI/CD

Раздел собирает весь курс в один автоматический процесс: от коммита до опубликованного и проверенного образа. Это не обзор возможностей CI-систем, а построение конкретного работающего pipeline с разбором каждого решения.

Pipeline выполняет двенадцать шагов: проверка форматирования, линтинг, проверка типов, unit-тесты, сборка образа с кэшем, integration-тесты на собранном образе, сканирование, генерация SBOM, тегирование по commit SHA, публикация в registry — и всё это без раскрытия секретов в логах.

Основной пример — GitHub Actions, полностью рабочий. Эквивалентная логика для GitLab CI даётся кратко, с акцентом на различия подходов.

Цели обучения

После раздела учащийся сможет:

  • спроектировать pipeline: определить этапы, их порядок и условия выполнения;
  • объяснить, какие проверки должны блокировать сборку, а какие — только предупреждать;
  • написать рабочий workflow для GitHub Actions, собирающий и публикующий образ;
  • настроить build cache в CI и объяснить, почему без него сборка занимает минуты;
  • запускать integration tests на собранном образе, а не на пересобранном коде;
  • встроить сканирование уязвимостей и осмысленно реагировать на результаты;
  • генерировать SBOM и provenance;
  • организовать tagging по commit SHA и ветке;
  • передавать credentials безопасно и не допускать их появления в логах;
  • воспроизвести ту же логику в GitLab CI.

Предварительные знания

Материалы

  1. Проектирование pipeline
    Этапы и их порядок. Быстрые проверки перед медленными. Что запускать на каждый коммит, что на pull request, что только на main. Блокирующие и информационные шаги. Параллельные задачи и зависимости между ними. Идемпотентность и повторный запуск. Целевое время прохождения.

  2. GitHub Actions
    Полный рабочий workflow с разбором каждого шага: checkout, кэширование зависимостей, ruff, mypy, pytest, сборка через docker/build-push-action, integration tests, сканирование, публикация. Secrets и GITHUB_TOKEN. Матрица версий. Условия выполнения по ветке и событию.

  3. Build cache в CI
    Почему сборка в CI не использует локальный кэш. Типы кэша: registry, GitHub Actions cache, inline. Настройка cache-from и cache-to. Многоступенчатый кэш для multi-stage builds. Измерение эффекта. Типичная ошибка: кэш, который не переиспользуется между ветками.

  4. Сканирование и SBOM
    Встраивание сканера в pipeline. Политика реагирования: какие уязвимости блокируют сборку, а какие фиксируются как задача. Ложные срабатывания и исключения. Генерация SBOM при сборке, форматы, хранение. Attestations и provenance. Что делать с найденной уязвимостью в базовом образе.

  5. GitLab CI
    Эквивалентный .gitlab-ci.yml. Различия моделей: stages и jobs, services, Docker-in-Docker против сокета runner, встроенный registry, кэш и артефакты. Переменные и protected secrets. Когда логика переносится один в один, а когда требует изменения подхода.

  6. Практические задания
    Лабораторные задания раздела с проверкой результата.

Рекомендуемый порядок чтения

Последовательный: 01 → 02 → 03 → 04 → 05 → exercises.

Урок 05 можно пропустить, если вы не работаете с GitLab. Урок 03 не пропускайте: без кэша pipeline становится настолько медленным, что им перестают пользоваться.

Рабочие примеры

ПримерКаталогУрок
Полный pipelineresources/examples/ci-pipeline/02, 03, 04, 05

Практические задания

ЗаданиеТип
1Написать workflow, запускающий линтер и тесты на каждый pushобяз.
2Добавить сборку образа и публикацию в registry по тегу с commit SHAобяз.
3Настроить build cache и измерить время сборки до и послеобяз.
4Запустить integration tests на собранном образе внутри pipelineобяз.
5Убедиться, что секреты не появляются в логах pipeline ни на одном шагеобяз.
6Добавить сканирование и настроить условие блокировки по уровню критичностидоп.
7Сгенерировать SBOM и сохранить его как артефакт сборкидоп.
8Настроить публикацию только для ветки main, оставив сборку для всех ветокдоп.
9Pipeline собирает образ 8 минут при неизменных зависимостях. Найти причинудиаг.
10Перенести тот же pipeline в GitLab CI и объяснить, что пришлось изменить

Полные формулировки — в exercises.md.

Критерии завершения раздела

Раздел пройден, когда учащийся может без подсказок:

  1. Перечислить этапы pipeline в правильном порядке и объяснить, почему именно такой.
  2. Написать работающий workflow, публикующий образ в registry.
  3. Настроить кэш так, чтобы повторная сборка при неизменных зависимостях занимала менее минуты.
  4. Объяснить, почему integration tests должны запускаться на собранном образе.
  5. Гарантировать, что токен registry не попадёт в логи.
  6. Объяснить, какой тег развёртывать в production и почему не latest.

Проверьте себя: Quiz 16 и Checkpoint 4. Затем выполните Проект 4. Production pipeline.

Что дальше

Практическая часть курса завершена. Оставшиеся три раздела углубляют понимание и формируют инженерное суждение: как Docker устроен изнутри, чем он отличается от Kubernetes и где его применять не следует.

Навигация

Диаграмма: конвейер доставки

← Предыдущий раздел: Testing
Вернуться к главному оглавлению
Следующий раздел: Docker internals →

Markdown на GitHub ↗