Binary package identity change
Версия от 11:14, 15 декабря 2017; VladimirSeleznev (обсуждение | вклад)
Действующие правила именования релизов собранных пакетов
Правила нумерации релизов пакетов, собираемых в бранчи, изначально были введены для решения следующих задач:
- Обновляемость: каждый бинарный пакет из более старого бранча должен был обновляться до одноимённого пакета из более свежего бранча.
- Идентификация: набор NEVR каждого бинарного пакета должен был однозначно определять целевой бранч, в который этот пакет был собран, а также исходный пакет, из которого была выполнена сборка.
- Наглядность: имя целевого бранча каждого бинарного пакета должно было быть видно там, где виден номер релиза этого пакета.
Проблемы традиционного именования релизов собранных пакетов
Однако со временем число бранчей выросло, а их линейный (а порой даже частичный) порядок был утрачен. Сейчас ответ на вопрос, какой бранч свежее, уже фактически переложен на администратора системы. Для поддержки сборок из одних и тех же исходников в разные бранчи возникли конструкции вроде %ubt, отрицательно влияющие на воспроизводимость сборки. В то же время, копирование пакетов также регулярно приводит к проблемам как в пересобираемости, так и в работоспособности скопированного. Очевидно, что Backports_Policy устарел.
Предлагаемые изменения идентификации собранных пакетов
Предлагается изменить правила следующим образом:
- Правила нумерации релизов пакетов, собираемых в бранчи, отменяются.
- Задачу обновляемости предлагается решать следующим образом:
- для указания предпочтения пакетов из того или иного репозитория использовать механизм apt preferences;
- конфигурации apt, распространяемые в бранчах и дистрибутивах, поставлять заранее настроенными на соответствующий бранч.
- Задачу идентификации предлагается решать следующим образом:
- имя целевого бранча каждого бинарного пакета указывать при сборке автоматически в RPMTAG_DISTRIBUTION (в формате "ALT Sisyphus") и RPMTAG_DISTTAG (в формате "dist.owner.task.subtask") в дополнение к информации, уже указываемой в RPMTAG_BUILDHOST;
- в начале каждой сборки подзадания автоматически генерировать уникальный идентификатор (например, хэш от "dist.owner.task.subtask.try.iter"), и передавать его в сборочную среду; имя этому уникальному идентификатору ещё предстоит придумать;
- ввести новый тэг RPMTAG_IDENTITY; при формировании бинарных подпакетов rpm-build'ом автоматически вычислять для каждого подпакета RPMTAG_IDENTITY -- хэш тех же данных, по которым вычисляется RPMTAG_SHA1HEADER, за вычетом некоторых тэгов (таких как RPMTAG_BUILDTIME и RPMTAG_BUILDHOST);
- во время формирования бинарных подпакетов rpm-build'ом после вычисления RPMTAG_IDENTITY автоматически заменять строгие зависимости между подпакетами вида "N = EVR" на ещё более строгие зависимости, основанные на RPMTAG_IDENTITY, например, вида ".hash_N";
- если во время формирования бинарных подпакетов rpm-build'ом образуются noarch-подпакеты, строго зависящие от arch-подпакетов, или, наоборот, arch-подпакеты, строго зависящие от noarch-подпакетов, то при наличии уникального идентификатора автоматически заменять эти зависимости на ещё более строгие зависимости, основанные на этом уникальном идентификаторе, а не на RPMTAG_IDENTITY;
- бинарные пакеты с одинаковыми NEVR допускать в различные бранчи только при условии, что их исходники совпадают; при сборке из gear-репозиториев совпадать должны сборочные git-тэги, в противном случае совпадать должны srpm-пакеты.
- Задачу наглядности предлагается решать следующим образом:
- при формировании бинарных подпакетов rpm-build'ом автоматически добавлять (часть, например, первые 36 бит) их RPMTAG_IDENTITY в имена файлов путём расширения %_build_name_fmt;
- добавить RPMTAG_NEVRI и/или RPMTAG_NEVRAI, использовать их вместо RPMTAG_NEVR и RPMTAG_NEVRA везде, где это имеет смысл.
- Поскольку ожидается появление разных бинарных пакетов с одинаковыми NEVR в разных бранчах, предлагается разрешить rebuild исходных пакетов без внесения в них изменений (хотя, естественно, результат может получиться отличающимся от результата предыдущей сборки); при этом в changelog собранных бинарных пакетов следует автоматически вносить запись о факте пересборки. Если по результатам rebuild RPMTAG_IDENTITY всех бинарных пакетов не изменился, то считать, что пакеты не изменились, и присваивать статус сборки соответствующего subtask FAILED.
- Копирование пакетов предлагается запретить полностью. Для сохранения обратной совместимости girar-интерфейса предлагается изменить операцию copy таким образом, чтобы она приводила к пересборке пакета из исходного бранча в целевой.
- Для каждого бранча в дополнение к индексу исходных пакетов предлагается одновременно поддерживать и индекс бинарных пакетов.