# Ревью автономного пакета П25 · март 2020 · «Минимальный CI/CD pipeline» Статус: **принят в publication registry 31 июля 2026 года**. В нём три revision по стабильным slug; registry сохраняет метаданные базового архива: - editorial-2020-03-practice-ci-pipeline; - editorial-2020-03-mechanism-ci-pipeline; - editorial-2020-03-field-ci-pipeline. Модуль не задаёт date или author, поэтому базовые метаданные архива остаются источником истины. Материалы описывают учебную конфигурацию GitLab CI/CD и учебную диагностику. В них нет реальных credentials, запущенных CI job, длительностей, production-деплоя или показателей надёжности конкретной команды. ## Проход 1. Факты и техника — пройдено | Утверждение | Первичный источник | Проверенная граница | | --- | --- | --- | | GitLab CI/CD задаёт последовательность job через stages и поддерживает job-level ключи artifacts, dependencies и when | [GitLab CI/CD YAML syntax reference](https://docs.gitlab.com/ee/ci/yaml/) | В примере использован консервативный линейный набор ключей; перед применением нужно сверить его с версией GitLab и Runner конкретной установки | | Job artifact — набор файлов job, а dependencies ограничивает, какие artifacts получает следующая job | [GitLab Job artifacts](https://docs.gitlab.com/ci/jobs/job_artifacts/) | В deploy явно указан только build; artifact в статьях — контракт внутри pipeline, а не вечное или криптографически защищённое хранилище | | npm ci работает с существующим lockfile и завершает установку ошибкой при конфликте package manifest и lockfile | [npm CLI v6: npm ci](https://docs.npmjs.com/cli/v6/commands/npm-ci/) | Пример использует Node 12 и npm ci как эпоху 2020 года; cache не объявлен источником релизного результата | | GitLab 12.9.0, выпущенный в марте 2020 года, содержит выбранные базовые конструкции artifacts/dependencies/manual job | [GitLab 12.9.0 CI YAML reference](https://gitlab.com/gitlab-org/gitlab/-/blob/v12.9.0-ee/doc/ci/yaml/README.md) | Никакие поздние policy-as-code, SLSA, зрелая DevOps-платформа или GitHub Actions по умолчанию в тексты не добавлены | ### Технические ограничения примеров - deploy_staging содержит вызов вымышленного локального скрипта ./scripts/deploy-staging. Он обозначает границу побочного эффекта, но не существует в этом репозитории и не запускался. - REVISION и SHA256SUMS — диагностический контракт учебного артефакта. Они не заменяют доступ к среде, секреты, подпись релиза, тестирование приложения, rollback или проверку всего supply chain. - Команда sha256sum в тексте рассчитана на плоский GNU/Linux-совместимый каталог dist/. Для вложенного output, другого shell или другой ОС её нужно адаптировать и проверить отдельно. - when: manual и allow_failure: false выражают намерение остановить delivery до ручного разрешения. Точное поведение и права запуска должны быть проверены небольшим пилотом на версии GitLab конкретной команды. Вердикт прохода: **пройден**. Внутри статей отделены подтверждённые свойства конфигурации от того, что требуется проверить в живом окружении. ## Проход 2. Редактура и голос М3 / март 2020 — пройдено | Ревизия | Симптом и цена в начале | Главный вопрос | Практический артефакт и ограничение | | --- | --- | --- | --- | | Практика | Зелёный pipeline может отправить другой каталог; цена — ручной разбор и риск выложить неверный bundle | Как описать входы, собрать output один раз и остановить deploy до сети | GitLab YAML, таблица контракта и shell-проверка; нет настоящей доставки или измерений | | Механизм | Зелёный build не отвечает, какой output проверен и отправлен; цена — невозможность повторить откат | Почему checkout, cache, artifact и deploy — четыре разных состояния | Схема gate, manifest-проверка и таблица недопустимых подмен; checksum не выдан за полную безопасность | | Полевой разбор | Deploy пересобирает checkout после зелёного build; цена — потеря связи между проверкой и доставкой | Как расследовать нарушение происхождения artifact без retry как первого действия | Явно помеченный учебный антипример, диагностическая матрица и маршрут исправления; не real incident | - Все три текста строятся по цепочке «симптом → причина → проверка → действие». Первые два абзаца сразу называют проблему, стоимость и границу учебного примера. - Голос соответствует М3 / 2020: автор уверенно описывает delivery как инженерную границу между job, но не изображает владельца сложной платформенной практики или организации production-инцидентов. - Формулировки не используют поздние подходы и не обещают универсальную автоматизацию. Cache отделён от артефакта, ручной gate — от доказательства функциональной готовности, а staging — от production. - Каждая статья содержит figure с самостоятельным alt и подписью, table с caption/thead, конфигурационный или shell-пример, нумерованный маршрут и четыре официальные ссылки. Вердикт прохода: **пройден**. Тексты достаточно предметны для инженера, который уже обслуживает delivery, но сохраняют осторожность автора 2020 года. ## Проход 3. Визуал и выпуск — пройдено в пределах автономного пакета - ci-pipeline-contract-2020.svg вертикально показывает один путь: входы → verify → единственный build → artifact → ручной deploy. В нижней части прямо отделены cache и релизный результат. - ci-pipeline-gates-2020.svg раскладывает четыре независимых вопроса: lockfile, lint/test, состав output и проверка перед delivery. Красная метка FAIL → STOP не позволяет трактовать зелёный предыдущий job как разрешение на deploy. - ci-pipeline-diagnosis-2020.svg превращает разбор в короткий вертикальный маршрут: dependency, revision, manifest, обязательный файл, затем manual gate. - У всех SVG есть title, desc, role="img" и aria-labelledby. В них нет script, foreignObject, внешних URL и растровых data URI. - Независимый raster preflight отрендерил каждый SVG через Sharp в PNG шириной 375 px. Проверены короткие строки, крупные заголовки, отсутствие обрезания, наложения и горизонтального выхода. Это проверка статичных схем, не browser-review опубликованной страницы. - Основной редактор повторно просмотрел три финальных raster-версии на 375 px и подтвердил вывод. После подключения registry strict audit и production build пройдены; они не подменяют запуск GitLab job или delivery-script. ### Фактические проверки Запущены после финальных правок 31 июля 2026 года:
node --check web/scripts/upgrade-2020-03.mjs
cd web && npm run audit:draft -- scripts/upgrade-2020-03.mjs
xmllint --noout \
  web/public/assets/editorial/2020/ci-pipeline-contract-2020.svg \
  web/public/assets/editorial/2020/ci-pipeline-gates-2020.svg \
  web/public/assets/editorial/2020/ci-pipeline-diagnosis-2020.svg
| Проверка | Результат | | --- | --- | | node --check | PASS, code 0 | | Draft gate | PASS: 8 828 / 8 888 / 8 037 знаков основного текста; у каждой статьи есть проблема в начале, figure, table, code, маршрут и источники | | xmllint --noout | PASS, все три SVG — корректный XML | | Source reachability | PASS, четыре официальные ссылки вернули HTTP 200 после допустимых redirect, где он есть | | Sharp preflight 375 px | PASS, три вертикальных SVG читабельны, без обрезания и наложения | | Strict audit после подключения registry | PASS: 8 828 / 8 888 / 8 037 знаков; по одному figure и table, 2 / 1 / 2 code example | | npm run build | PASS, code 0, 374 статические страницы | | Scope/self-review | PASS: в revision нет date/author, articles.json не перезаписан; посторонние незакоммиченные материалы не добавлялись в индекс | Выпусковой вердикт: **тройное ревью пройдено, пакет принят к публикации**. Registry заменяет только редакционные поля по стабильному slug. Реальный GitLab job, браузерная страница и внешняя доставка не выполнялись и не выданы за результат статических проверок.