[devel] I: руководство по использованию girar-nmu на примере сборки perl5.20
Igor Vlasenko
vlasenko на imath.kiev.ua
Пт Дек 12 22:37:59 MSK 2014
Уважаемые господа,
Как мы видим, залитая в Сизиф транзакция для perl 5.20
собралась с первой попытки (я забыл проверить acl, но
это уже другая история).
При том, что это токсичная пересборка: мы не можем
использовать еще не пересорбранные пакеты, должны
найти правильный порядок сборки, также нам будут мешать
циклы, которые мы должны выявить и обезвредить.
Во всем этом очень сильно помогли утилиты girar-nmu,
новая версия которых, улучшенная по итогам работы,
ушла позавчера в Сизиф.
Для тех, кто может оказаться в похожей ситуации
токсичной массовой пересборки, расскажу,
как с помощью эих утилит готовилась транзакция perl.
=== подготовка транзакции для обновления ===
Итак, bootstrap rpm-build-perl и новый perl-5.20.1 собраны, пора
готовить транзакцию для заливки в Сизиф -- нужно пересобрать все
пакеты, которые слинкованы со старой libperl-5.18.so.
Нужно не просто подготовить список пакетов для пересборки,
но и отсортировать их в правильном порядке, так как если еще не
пересобранный пакет требуется в BuildRequires:, то он не сможет
быть установлен в сборочное окружение вместе с новым perl 5.20
из-за зависимости на старую libperl-5.18.so.
К счастью, для этого у меня есть готовая утилита из пакета girar-nmu.
$ md REBUILD
$ cd REBUILD
$ girar-nmu-sort-transaction --mark-req-regexp '^libperl-5.18.so' \
/var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS \
/var/ftp/pub/Linux/ALT/Sisyphus/files/noarch/RPMS \
/var/ftp/pub/Linux/ALT/Sisyphus/files/x86_64/RPMS > perl_rebuild_order.txt
cyclic dependencies detected:
cycle00001:
libkrb5-devel-1.13-alt1.x86_64.rpm
libkrb5-ldap-1.13-alt1.x86_64.rpm
openldap-2.4.32-alt2.1.src.rpm
libldap-2.4.32-alt2.1.x86_64.rpm
libssl-devel-1.0.1j-alt1.x86_64.rpm
cycle00002:
perl-XML-LibXML-2.0117-alt2.src.rpm
perl-XML-LibXML-2.0117-alt2.x86_64.rpm
perl-XML-SAX-0.99-alt2.noarch.rpm
cycle00003:
perl-Math-BigInt-1.9993-alt1.noarch.rpm
perl-Math-BigInt-FastCalc-0.31-alt2.src.rpm
perl-Math-BigInt-FastCalc-0.31-alt2.x86_64.rpm
cycle00004:
perl-Data-Visitor-0.30-alt1.noarch.rpm
perl-Moose-2.1213-alt2.src.rpm
perl-Moose-2.1213-alt2.x86_64.rpm
perl-MooseX-Clone-0.05-alt1.noarch.rpm
perl-MooseX-Params-Validate-0.18-alt1.noarch.rpm
perl-MooseX-SemiAffordanceAccessor-0.09-alt1.noarch.rpm
perl-Specio-0.08-alt1.noarch.rpm
cycle00005:
perl-Date-Calc-6.3-alt3.noarch.rpm
perl-Date-Calc-XS-6.3-alt4.src.rpm
perl-Date-Calc-XS-6.3-alt4.x86_64.rpm
cycle00006:
perl-Readonly-2.00-alt1.noarch.rpm
perl-Readonly-XS-1.05-alt5.src.rpm
perl-Readonly-XS-1.05-alt5.x86_64.rpm
При первом запуске утилита не только сосчитала и отсортировала пакеты
для сборки, но и выдала предупреждение о том, что в Сизифе найдены циклы.
Например, cycle00006:
не получится просто пересобрать perl-Readonly-XS, так как в Сизифе он
он BuildRequires: perl-Readonly, а perl-Readonly
BuildRequires: perl-Readonly-XS.
Особняком стоит cycle00001, на него можно не обращать внимания,
это не настоящий цикл, так как libldap не линкуется с libperl-5.18.so,
а только ее perl'овая обертка.
Однако все циклы cycle00002 - cycle00006 можно разорвать с помощью
bootstrap сборок соответствующих пакетов.
Проинформируем об этом утилиту girar-nmu-sort-transaction с помощью опции
--del-textid-relations-from ../altlinux/girar-nmu/known_bootstrap_cycles
В файле altlinux/girar-nmu/known_bootstrap_cycles содержатся
зависимости, которе есть в Сизифе, но которых не будет в
bootstrap сборке, или, как в случае с openldap, которые можно не учитывать:
!-------------------------------------------
openldap libldap.x86_64
perl-XML-SAX.noarch perl-XML-LibXML
perl-Date-Calc.noarch perl-Date-Calc-XS
perl-Readonly.noarch perl-Readonly-XS
perl-DateTime-TimeZone.noarch perl-DateTime
perl-Math-BigInt.noarch perl-Math-BigInt-FastCalc
perl-Specio.noarch perl-Moose
!-------------------------------------------
Подробную информацию по этим зависимостям можно при желании получить с
помощью опции --debug.
Заново запускаем
$ girar-nmu-sort-transaction --mark-req-regexp '^libperl-5.18.so' \
--del-textid-relations-from ../altlinux/girar-nmu/known_bootstrap_cycles \
/var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS \
/var/ftp/pub/Linux/ALT/Sisyphus/files/noarch/RPMS \
/var/ftp/pub/Linux/ALT/Sisyphus/files/x86_64/RPMS > perl_rebuild_order.txt
теперь мы получили сообщение
"no cyclic dependencies detected".
для некоторых видов циклов еще могла бы помочь опция
--ignore-ambiguous-provides -- игнорирование тех значений Provides:,
которые предоставляются несколькими пакетами.
В нашем случае они роли не играют, но упомянем ее, посколоьку эта
опция может пригодиться при обновлении к perl 5.22.
Перед основной транзакцией я отправил в Сизиф rpm-build-perl в bootstrap виде.
rpm-build-perl числится в нашем списке, поэтому имеет смысл перезалить
его уже сразу unbootstrap'ленным, пересобранным с новым perl.
Также, поскольку perf из kernel-image-led-ws зависит от libperl.
в списке оказался kernel-image-led-ws.
Майнтайнеру сейчас некогда с ним возиться, поэтому я
его тоже удалил из Сизифа отдельной транзакцией
и руками удалил из списка.
В полученном списке perl_rebuild_order.txt 377 пакетов.
В этом месте уже пора проверить список пакетов на права доступа.
Сразу я это, к сожалению забыл сделать, в результате чего
сборочницу пришлось гонять 2 раза.
Сдалать это можно было бы так:
$ cat perl_rebuild_order.txt | altlinux-acl-filter-list-by-access -n -u viy | altlinux-acl-filter-list-append-acl | sort
Здесь altlinux-acl-filter-list-by-access отбирает пакеты, у которых у
usera (-u) viy нет (-n) доступа, altlinux-acl-filter-list-append-acl
дописывает к именам пакетов acl, чтобы знать, кому писать.
По полученному списку генерируем NMU srpm пакеты и клонированные NMU
gear репозитории с помощью утилиты girar-nmu-prepare.
girar-nmu-prepare проверяет способ заливки пакетов, и
в зависимости от этого генерирует либо NMU srpm, либо NMU .git gear репозиторий
(увеличивается релиз и добавляется строчка в %changelog).
Запускаем:
girar-nmu-prepare --changelog '- rebuild with new perl 5.20.1' --hook ../altlinux/girar-nmu/with-bootstrap.pl --srpmdir /var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS `cat perl_rebuild_order.txt`
Обратите внимание на опцию
--hook ../altlinux/girar-nmu/with-bootstrap.pl
Эта опция загружает небольшую программу для girar-nmu-prepare,
которая в указанных пакетах perl-Date-Calc-XS ... perl-XML-LibXML
прописывает %def_with bootstrap, а в rpm-build-perl
прописывает %def_without bootstrap.
!-------------------------------------------
#!/usr/bin/perl -w
my %bootstrap=map {$_=>1} qw/
perl-Date-Calc-XS
perl-DateTime
perl-Math-BigInt-FastCalc
perl-Moose
perl-Readonly-XS
perl-Test-LeakTrace
perl-XML-LibXML
/;
my %unbootstrap=map {$_=>1} qw/
rpm-build-perl
/;
push @SPECHOOKS,
sub {
my ($spec) = @_;
my $mainsec=$spec->main_section;
my $name=$mainsec->get_tag('Name');
$mainsec->subst_body(qr'^\%def_without\s+bootstrap','%def_with bootstrap') if $bootstrap{$name};
$mainsec->subst_body(qr'^\%def_with\s+bootstrap','%def_without bootstrap') if $unbootstrap{$name};
};
!-------------------------------------------
Без этой программы мне пришлось бы вручную править сгенерированные
пакеты. А так эта же программа пригодится и при обновлении до perl 5.22.
тестируем то, что получилось, с помощью
girar-nmu-local-build `cat perl_rebuild_order.txt` -- \
hsh --apt-config=/etc/apt/apt.conf.SS --with-stuff --mountpoints=/proc \
--packager="Igor Vlasenko <viy на altlinux.ru>" --number 2 $TMP/hasher2
где в $TMP/hasher2 уже находится собранный свежий perl 5.20.1 и
bootstrap rpm-build-perl.
Поскольку всего в транзакции 377 пакетов, то не удивительно, что
некоторые из них не собрались под новый perl (а некоторые пакеты
просто вообще не собирались, так как были сломаны в сизифе).
На таком пакете пересборка с помощью girar-nmu-local-build
останавливалась. В таком случае чиним пакет, собираем его вручную, и
далее запускаем girar-nmu-local-build с хвостом списка:
girar-nmu-local-build `tail -287 perl_rebuild_order.txt` -- \
hsh --apt-config=/etc/apt/apt.conf.SS --with-stuff --mountpoints=/proc \
--packager="Igor Vlasenko <viy на altlinux.ru>" --number 2 $TMP/hasher2
продолжаем так до тех пор, пока все пакеты не починим.
Когда все пакеты успешно соберутся с новым perl 5.20.1,
создаем task с perl.git и добавляем в этот task пакеты транзакции c помощью
girar-nmu-task-add [-t taskid] `cat perl_rebuild_order.txt`
еще раз проверяем, как у нас с выдачей acl на пакеты транзакции
и запускаем:
ssh git.alt task run
После того, как обновление perl прошло, нужно убрать bootstrap
из тех пакетов, где мы его включали. Делаем это с помощью
команд вида
srpmnmu --nextrel nmuadd --ch '- unbootstrap' \
--hook ../altlinux/girar-nmu/without-bootstrap.pl \
/var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS/perl-Date-Calc-XS-*.src.rpm
которые генерируют уже unbootstrap'ленные src.rpm с помощью
программы perl.git/altlinux/girar-nmu/without-bootstrap.pl,
и отправляем полученные src.rpm в Сизиф.
--
I V
Подробная информация о списке рассылки Devel