Перейти к содержимому

Руководство разработчика по Backport Builder

Backport Builder — проект для инженерии выпусков. Рассматривайте исходные репозитории как входные данные, сгенерированные деревья — как выходные, а пользовательские правила Rector — как протестированную логику сборки.

Используйте это руководство, когда сопровождаете правила понижения, метаданные сгенерированных пакетов, проверки для целевой среды выполнения или автоматизацию выпуска для nextpdf/backport-builder.

УровеньВладелецОтветственностьНе размещайте здесь
Исходные репозиторииРепозитории продуктаКанонический исходный код PHP и тесты.Сгенерированные изменения для понижения.
Скрипты сборкиnextpdf/backport-builderСлияние исходного кода, выполнение преобразований, запись метаданных и проверка вывода.Прикладная логика времени выполнения.
Конфигурация Rectornextpdf/backport-builderПолитика понижения для конкретной цели.Предположения для нескольких целей без тестов.
Пользовательские правила Rectornextpdf/backport-builderПреобразования синтаксиса для конкретного проекта.Широкие непроверенные переписывания.
Сгенерированные пакетыВывод сборкиУстанавливаемые артефакты для более старых сред выполнения.Ручные правки в источнике истины.
ЭтапПоведениеДействие разработчика
Извлечение исходного кодаРабочий процесс выпуска извлекает исходные репозитории для целевого тега.Поддерживайте согласованность ссылок на исходный код между пакетами.
Проверка контрактаValidateBuildContract::run() проверяет предположения сборки.Контракт, который не прошёл проверку, должен блокировать выпуск.
СлияниеMergeSources::run() собирает дерево целевого пакета.Проверьте область целевого пакета перед запуском Rector.
ПреобразованиеКонфигурации Rector и пользовательские правила понижают синтаксис.Добавляйте тесты на фикстурах для каждого изменения правила.
Корректировка ComposerAdjustComposer записывает метаданные сгенерированного пакета и карты замены.Проверяйте имена пакетов, версии, лицензии и ограничения.
Проверка во время выполненияСгенерированный вывод проходит проверку синтаксиса и тестируется на целевых версиях PHP.Сбой в целевой среде выполнения должен блокировать выпуск.
ВыпускАрхивы прикрепляются к выпуску.Не правьте сгенерированный вывод как источник истины.

Рекомендуемый рабочий процесс для репозитория

Заголовок раздела «Рекомендуемый рабочий процесс для репозитория»
Рабочая задачаИсточник истиныПолитика сгенерированного вывода
Использование возможностей PHPОсновной исходный репозиторий.Правила backport адаптируют эту возможность.
Ограничения зависимостейМетаданные исходного composer.json и скрипт корректировки.Сгенерированный composer.json должен быть воспроизводимым.
Понижение синтаксисаКонфигурация Rector и пользовательские правила.Сгенерированный исходный код не следует править вручную.
Поддержка среды выполненияЦелевая ветка и матрица CI.Сборка должна проходить на целевой версии PHP.
Заметки о выпускеДокументация и автоматизация выпуска.Сгенерированные артефакты должны ссылаться на исходный выпуск.

Каждое пользовательское правило должно решать узкую задачу, иметь метаданные и покрытие фикстурами.

Метод правилаНазначениеТребование к качеству
getRuleDefinition()Документирует преобразование для инструментов Rector.Включите пример before/after, соответствующий фактическому понижению.
getNodeTypes()Ограничивает узлы AST, проверяемые правилом.Сохраняйте список узлов как можно меньшим.
refactor()Применяет преобразование или возвращает узел без изменений.Не меняйте несвязанные узлы; поведение должно оставаться детерминированным.
Тест на фикстуреПроверяет вывод before/after.Покройте наименьший допустимый ввод и хотя бы один случай пропуска.
<?php
final class ExampleDowngradeRector extends AbstractRector
{
public function getNodeTypes(): array
{
return [SomeNode::class];
}
public function refactor(Node $node): ?Node
{
if (!$node instanceof SomeNode) {
return null;
}
return $this->rewriteNode($node);
}
}

Используйте сухие прогоны во время разработки и при проверке кандидата в выпуск. Записывайте реальный вывод только тогда, когда известны ссылки на исходный код и целевая ветка.

Окно терминала
composer build:dry
php scripts/build.php --version=2.0.0 --target=php81 --dry-run
php scripts/build.php --version=2.0.0 --target=php74 --no-pro

Запускайте проверку сгенерированного пакета в целевой среде выполнения, а не только на современном хосте сборки.

Точка расширенияИспользуется дляОграничение
Файлы конфигурации RectorПолитика понижения для конкретной цели.Держите линии PHP 8.1 и PHP 7.4 отдельно друг от друга.
Пользовательские правила RectorПреобразования синтаксиса для конкретного проекта.Должны иметь метаданные и тесты на фикстурах.
Скрипт корректировки ComposerИдентичность сгенерированного пакета.Должен сохранять версионирование, согласованное с SemVer.
Скрипт слиянияВыбор и формирование входных данных исходного пакета.Должен записывать в журнал корни исходного кода и корни вывода.
Рабочий процесс сборкиОркестрация выпуска.Должен проверять сгенерированный вывод в целевой среде выполнения.
  1. Воспроизведите неподдерживаемый синтаксис в минимальной фикстуре.
  2. Добавьте или обновите пользовательское правило Rector.
  3. Добавьте фикстуры before/after для правила.
  4. Запустите сухую сборку.
  5. Проверьте сгенерированный вывод в целевой среде выполнения PHP.
  6. При необходимости примените то же логическое изменение к каждой долгоживущей целевой ветке.
  7. Поддерживайте воспроизводимость артефактов выпуска из тегов исходного кода и скриптов сборки.
СбойГде обрабатыватьРекомендуемая реакция
Отсутствует исходный репозиторийЭтап проверки контракта или слияния.Остановите сборку и исправьте данные для извлечения.
Сбой разбора RectorЭтап преобразования.Сведите проблему к фикстуре и обновите правило или конфигурацию.
Несоответствие в сгенерированном файле composer.jsonЭтап корректировки Composer.Исправьте скрипт генерации, а не сгенерированные метаданные.
Сбой целевого синтаксисаПроверка во время выполнения.Блокируйте выпуск, пока преобразование не будет исправлено.
Источник Pro недоступенКонфигурация сборки.Собирайте публичный артефакт только если именно это является предполагаемой целью.
АспектПо умолчаниюКогда переопределять
Сгенерированный выводАртефакт только для чтения.Никогда не делайте его источником истины.
Модель ветвленияРаздельные долгоживущие целевые ветки.Синхронизируйте изменения через независимые запросы на слияние.
Хост сборкиСовременная версия PHP.Готовность к выпуску по-прежнему определяет проверка целевой среды выполнения.
Пользовательские правилаНебольшие и подкреплённые фикстурами.Избегайте широких преобразований без явных примеров before/after.
Линия PHP 7.4Только Core, если иное не поддерживается явно.Не включайте вывод Pro без проверки целевой среды выполнения.
  • Тесты метаданных правил Rector создают экземпляры каждого пользовательского правила.
  • Тесты на фикстурах покрывают код before/after для каждого преобразования.
  • Сухая сборка выполняется перед заданиями выпуска.
  • Проверки синтаксиса целевой среды выполнения и тесты пакетов выполняются на сгенерированном выводе.
  • Тесты метаданных Composer проверяют имя пакета, версию, ограничения, карту замены и лицензию.
  • Журналы сборки включают пути к исходному коду, целевой путь, целевую среду выполнения, состояние сухого прогона и статус включения Pro.