[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