Binary package identity change
Версия от 20:38, 21 января 2019; IvanZakharyaschev (обсуждение | вклад) (→Предлагаемые изменения идентификации собранных пакетов: собираюсь написать от трудностях disttag, поставил ссылку)
Действующие правила именования релизов собранных пакетов
Правила нумерации релизов пакетов, собираемых в бранчи, изначально были введены для решения следующих задач:
- Обновляемость: каждый бинарный пакет из более старого бранча должен был обновляться до одноимённого пакета из более свежего бранча.
- Идентификация: набор NEVR каждого бинарного пакета должен был однозначно определять целевой бранч, в который этот пакет был собран, а также исходный пакет, из которого была выполнена сборка.
- Наглядность: имя целевого бранча каждого бинарного пакета должно было быть видно там, где виден номер релиза этого пакета.
Проблемы традиционного именования релизов собранных пакетов
Однако со временем число бранчей выросло, а их линейный (а порой даже частичный) порядок был утрачен. Сейчас ответ на вопрос, какой бранч свежее, уже фактически переложен на администратора системы. Для поддержки сборок из одних и тех же исходников в разные бранчи возникли конструкции вроде %ubt, отрицательно влияющие на воспроизводимость сборки. В то же время, копирование пакетов также регулярно приводит к проблемам как в пересобираемости, так и в работоспособности скопированного. Очевидно, что Backports_Policy устарел.
Предлагаемые изменения идентификации собранных пакетов
Предлагается изменить правила следующим образом:
- Правила нумерации релизов пакетов, собираемых в бранчи, отменяются.
- Задачу идентификации предлагается решать следующим образом:
- girar: Поскольку ожидается появление разных бинарных пакетов с одинаковыми NEVR в разных бранчах, предлагается разрешить rebuild исходных пакетов без внесения в них изменений (хотя, естественно, результат может получиться отличающимся от результата предыдущей сборки), включив $GIRAR_ALLOW_SAME_NEVR для соответствующих бранчей.
- rpm-build: во время формирования бинарных подпакетов rpm-build'ом автоматически заменять строгие зависимости между подпакетами вида "N = EVR" на ещё более строгие зависимости, основанные на $RPM_STRICT_INTERDEPS;
- Реализованный сейчас вариант использует в качестве формата более строгих зависимостей (и основного идентификатора/Provides пакета):
N = E:V-R:D
, гдеD
-- disttag. См. transition to disttag, чтобы узнать с какими трудностями связан переход на такую схему..
- Реализованный сейчас вариант использует в качестве формата более строгих зависимостей (и основного идентификатора/Provides пакета):
- girar: При создании подзаданий дополнительно создавать файл $task/gears/$subtask/sid -- source identifier в формате type:hash, где type описывает схему сборки (gear и srpm). Для сборки из gear-репозитория этот хэш является tag id подписанного тега, из которого собраны пакеты, а для sourcerpm — значение его RPMTAG_SHA1HEADER.
- girar: Чтобы обеспечить проверку того, что сборка пакетов с одинаковыми NEVR в разные бранчи производится только из одного и того же исходника, для каждой сборки пакета дополнительно в индекс исходных пакетов дописывать $task/gears/$subtask/sid (к 2018-06-04).
- girar: Во время обработки задания после того, как пакет собран, проверять наличие его NEVR в индексе исходных пакетов, и в случае наличия проверять достоверность схемы сборки и хэша; в случае несоответствия сборку запретить и перевести в состояние FAILED (к 2018-06-04).
- girar: Такую же проверку следует сделать для сборки из sourcerpm перед сборкой пакета для экономии времени. Если для данного NEVR в индексе исходных пакетов релизный хэш пустой, то его сборку в другие бранчи запретить (к 2018-06-04).
- girar, rpm-build: Имя целевого бранча каждого бинарного пакета указывать при сборке автоматически в RPMTAG_DISTRIBUTION (в формате "ALT Sisyphus") и RPMTAG_DISTTAG (например, в формате "dist.task.subtask") в дополнение к информации, уже указываемой в RPMTAG_BUILDHOST (к 2018-06-04);
- rpm: писать при установке/удалении пакета значение его RPMTAG_DISTTAG, если оно присутствует в пакете;
- (не в сборочнице) girar: В начале каждой сборки подзадания автоматически генерировать уникальный идентификатор (например, "dist.task.subtask.try.iter"), и передавать его в сборочную среду через $RPM_STRICT_INTERDEPS (к 2018-06-07);
- (не в сборочнице) girar: Бинарные пакеты с одинаковыми NEVR допускать в различные бранчи только при условии, что их исходники совпадают: при сборке из gear-репозиториев совпадать должны сборочные git-тэги, в противном случае совпадать должны srpm-пакеты (к 2018-06-07).
- TBD: girar: Если по результатам rebuild у всех собранных бинарных пакетов не изменился RPMTAG_IDENTITY, то считать, что пакеты не изменились, и присваивать статус сборки соответствующего subtask FAILED (к 2018-06-11; необходимо в rpm.org реализовать RPMTAG_IDENTITY).
- TBD girar: При использовании команды copy в бранч осуществлять пересборку пакета в окружении целевого бранча, и если по результатам сборки RPMTAG_IDENTITY всех подпакетов совпадает с таковым из подпакетов, собранных из исходного бранча, осуществлять копирование их в целевой бранч, иначе класть результат сборки. Также возможно проверять RPMTAG_IDENTITY подпакетов из предыдущих итераций сборки исходного бранча с целью поиска кандидатов на копирования, время сборки которых было не раньше времени последней сборки данного NEVR в целевой бранч, если таковой NEVR имеется.
- TBD apt: приоритезация бранчей по RPMTAG_DISTRIBUTION (через механизм apt_preferences).
- Задачу обновляемости предлагается решать следующим образом:
- для указания предпочтения пакетов из того или иного репозитория использовать механизм apt preferences;
- конфигурации apt, распространяемые в бранчах и дистрибутивах, поставлять заранее настроенными на соответствующий бранч.
- Задачу наглядности предлагается решать следующим образом:
- girar: при пересборке в changelog собранных бинарных пакетов следует автоматически вносить запись о факте пересборки;
- rpm-build: возможно, при формировании бинарных подпакетов автоматически добавлять (часть, например, первые 36 бит) их RPMTAG_IDENTITY в имена файлов путём расширения %_build_name_fmt, или же вместо RPMTAG_IDENTITY можно добавлять +b$N, где $N — порядковый номер пересборки пакета для данного бранча;
- rpm: добавить RPMTAG_NEVRI и/или RPMTAG_NEVRAI, использовать их вместо RPMTAG_NEVR и RPMTAG_NEVRA везде, где это имеет смысл.