# Ревью автономного пакета П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, браузерная страница и внешняя доставка не выполнялись и не выданы
за результат статических проверок.