← КурсСамостоятельный просмотрПульт

Пара 17 / декабрь

CI: автоматические проверки изменения

Создать проверяемый pipeline с тестами и сборкой и объяснить границу доверия CI.

Контекст

Каждое изменение проходит одинаковые необходимые проверки.

Создать проверяемый pipeline с тестами и сборкой и объяснить границу доверия CI.

CI — общий проверяемый маршрут

Каждое изменение проходит одинаковые необходимые проверки.

01Commit / PR
02Тесты
03Сборка
04Отчёт для SHA

Аналогия: единый контроль качества партии перед передачей дальше.

Тестирует поведение, а не уверенность автора

Проверяем контракт и случаи отказа.

01Контракт
02Позитивный случай
03Границы / ошибки
04Провал → исправление

Аналогия: проверка торможения автомобиля полезнее подписи «тормоза предусмотрены».

Runner и секреты

Чужой код в CI не должен получать производственные полномочия.

01Недоверенный PR
02Runner для проверки
03Минимальные права
04Без deploy-секретов

Аналогия: приёмная для посетителей не должна выдавать ключи от серверной.

Команды и наблюдения

Ubuntu / Bash, lab

bash ci/check.sh
python3 -m unittest discover -s tests -v
docker build -t studypulse:ci .
git diff -- .github/workflows/ci.yml
# Change a tested behavior in a disposable copy, rerun, then restore it

Разбор результата

Тесты проходят на исходном проекте; намеренный дефект даёт красный результат; сборка проверяется отдельно.

Локальный CI не требует GitHub-аккаунта. Публикация репозитория внешнему сервису — необязательное упражнение студента.

На macOS

Локальные тесты и сборка доступны. CI на ubuntu-24.04 остаётся Linux-средой, даже если разработчик работает на Mac. Различия регистра файлов и ARM/AMD64 нужно учитывать до выпуска.

python3 -m unittest discover -s tests -v
bash ci/check.sh

Красный → зелёный

  1. Запустите предоставленный ci/check.sh.
  2. В отдельной ветке измените обработку hours=-1 так, чтобы она стала ошибочной.
  3. Найдите тест, который обнаружил дефект; объясните его смысл.
  4. Исправьте код, повторите тесты и сборку; оформите fix: commit.

Что должно получиться

Вывод упавшей и успешной проверки для конкретного commit.

Тест ловит реальный дефект контракта; в workflow нет production-секретов.

Ошибка для диагностики

Сборку объявляют доказательством корректности входных данных.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Что заявленные проверки прошли для конкретного состояния, не абсолютную исправность.
  2. Чтобы ошибка или недоверенный код имели меньше полномочий.

После пары

Добавить один осмысленный тест edge-case и объяснить, какой дефект он предотвращает.

Конспект, команды и разбор →

Пара 18 / декабрь

CD: версии, выпуск и откат

Выпустить новую версию локального сервиса и безопасно вернуть предыдущую.

Контекст

Готовность к выпуску и автоматический выпуск — разные договорённости.

Выпустить новую версию локального сервиса и безопасно вернуть предыдущую.

Delivery и deployment

Готовность к выпуску и автоматический выпуск — разные договорённости.

01CI
02Версионированный образ
03Решение о выпуске
04Проверка пользователя

Аналогия: партия принята контролем качества, но отправка покупателю — следующий этап.

Идентичность версии

Tag удобен человеку; digest задаёт конкретное содержимое образа.

01Commit SHA
02Image digest
03Artifact checksum
04Конфигурация

Аналогия: название книги и конкретное издание с номером партии — разные идентификаторы.

Откат и данные

Предыдущий образ можно вернуть, но данные требуют совместимости.

01Предыдущая версия
02Выпуск новой
03Smoke-проверка
04Откат при отказе

Аналогия: вернуть старый кассовый аппарат легко, но формат новых чеков должен быть ему понятен.

Команды и наблюдения

Ubuntu / Bash, lab

bash ci/check.sh
docker build -t studypulse:v1 .
APP_IMAGE=studypulse:v1 MODEL_VERSION=v1 docker compose up -d --no-build
bash scripts/smoke.sh
APP_IMAGE=studypulse:v1 MODEL_VERSION=v2 docker compose up -d --no-build
bash scripts/smoke.sh
APP_IMAGE=studypulse:v1 MODEL_VERSION=v1 docker compose up -d --no-build
bash scripts/smoke.sh

Разбор результата

healthz показывает смену метки v1 → v2 → v1; данные в томе сохраняются.

Сначала показываем безопасную смену конфигурации на одном образе. Для настоящего изменения кода в лабораторной строим второй образ и фиксируем оба ID.

На macOS

Вместо sha256sum используйте shasum -a 256. Release и rollback через Docker одинаковы. Не выдавайте локальный ARM64 image ID за доказательство доступности той же версии для AMD64-сервера.

shasum -a 256 models/model.json
docker image inspect studypulse:v1 --format "{{.Id}}"
bash scripts/smoke.sh

Мини-релиз с планом возврата

  1. Зафиксируйте commit, image ID и checksum models/model.json.
  2. Соберите отдельный v2 с небольшим проверяемым изменением в копии проекта; не подменяйте v1.
  3. Выпустите v2 локально, выполните smoke и проверьте события.
  4. Верните v1 без удаления тома; заполните release-report.md.

Что должно получиться

Два образа, отчёт о выпуске и проверенный откат.

Возврат реально выполнен; image ID и артефакт записаны; данные не удалены.

Ошибка для диагностики

latest изменился, и невозможно определить, что именно было выпущено.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Нет, различается автоматизация последнего решения о выпуске.
  2. Новые данные или миграция могут быть несовместимы со старым кодом.

После пары

Сдать ноябрьский чекпоинт: Git-история, Dockerfile, Compose, CI и журнал проверенного отката.

Конспект, команды и разбор →