Packaging Automation/MassProcessing/MassImportAndSupport: различия между версиями

Материал из ALT Linux Wiki
Строка 101: Строка 101:
  ошибка: Файл /mnt/home/archive/gitrepo/fcimport.git/trinity-abakus-0.91-14.0.3_1.fc23.2861/SOURCES/trinity-abakus-14.0.0.tar.gz: Нет такого файла или каталога
  ошибка: Файл /mnt/home/archive/gitrepo/fcimport.git/trinity-abakus-0.91-14.0.3_1.fc23.2861/SOURCES/trinity-abakus-14.0.0.tar.gz: Нет такого файла или каталога
  Writing src.rpm failed. May be some important rpm macros packages are missing. Writing hasher tar.
  Writing src.rpm failed. May be some important rpm macros packages are missing. Writing hasher tar.
При этом в рабочей директории появилась куча подкаталогов:
drwxr-xr-x    -    fileshareset-2.0-1.fc23.15605
drwxr-xr-x    -    trinity-abakus-0.91-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-akode-2.0.2-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-amarok-1.4.10-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-arts-1.5.10-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-avahi-tqt-0.6.30-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-basket-1.0.3.1-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-bibletime-1.6.6.0-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-dbus-1-tqt-0.9-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-dbus-tqt-0.63-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-digikam-0.9.6-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-dolphin-0.9.2-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-filelight-1.0-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-gtk-qt-engine-0.8-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-gtk3-tqt-engine-0.5-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-gwenview-1.4.2-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-gwenview-i18n-1.4.2-14.0.3_1.fc23.14567
drwxr-xr-x    -    trinity-icons-kfaenza-0.8.9-1.fc23.14567
[...]
Это для fcimport аналог crush dump.
При работе библиотека преобразования создает временный каталог
вида %{NAME}-%{VERSION}-%{R$ELEASE}.$PID,
куда распаковывает исходный srpm (в подпапки SOURCES и SPEC)
и пишет новый спек (в подпапку NEW).
Если rpmbuild -bs завершился неудачей,
то  распакованный srpm не удаляется, чтобы можно было внутри
посмотреть, почему так.
После просмотра все, что в листинге -- мусор, можно удалить
rm -r *-*-*.{fc,mga}*.*
Станем разбираться.
Станем разбираться.
Оказывается, эти src.rpm не полноценные (не самдостаточные). В них используется макрос tde_version, который извне был определен в значение {{term|14.0.3}}, а внутри, если не определен, определяется как {{term|14.0.0}}:
Оказывается, эти src.rpm не полноценные (не самдостаточные). В них используется макрос tde_version, который извне был определен в значение {{term|14.0.3}}, а внутри, если не определен, определяется как {{term|14.0.0}}:
  %if "%{?tde_version}" == ""                                                     
  %if "%{?tde_version}" == ""                                                     
Строка 127: Строка 158:
push @PREHOOKS,  
push @PREHOOKS,  
sub {
sub {
    my ($spec,$parent) = @_;
     # не предупреждать, если изменения не удалось применить
     # не предупреждать, если изменения не удалось применить
     #  (так как мы будем применять этот скрипт ко всем пакетам подряд,  
     #  (так как мы будем применять этот скрипт ко всем пакетам подряд,  

Версия от 09:32, 12 октября 2016



Введение.

TODO

Примеры

trinity

описание проекта trinity

Допустим, мы хотим собрать в Сизиф TDE. Есть готовый набор rpm trinity-r14, которые можно скачать с сайта проекта. Эти rpm с помoщью %if-ов рассчитаны на поддержку одновременно и fedora, и SuSE. Можно настроить их преобразование из SuSE в ALT, можно (и надежнее, так как лучше оттестировано) преобразование из fedora в ALT.

Настроим автоматическое преобразование этих пакетов из fedora в ALTLinux.

предварительная настройка рабочего места

Массовое автоматическое преобразование этих пакетов из fedora в ALTLinux выполняет утилита fcmass. (Из SuSE -- susemass). Установим ее и нужную ей базу distromap:

apt-get install /usr/bin/fcmass distromap-fedora-rawhide-altlinux-sisyphus

Также обновим базу DistroDB Сизифа: запустим программу

distrodb-update-repocop-db-altlinux-sisyphus 

Приступим к работе. Удобно для работы создать выделенный git реозиторий, в котором хранить скрипты синхронизации, хуки и патчи для пакетов и другие настройки специально для этого набора пакетов.

mkdir trinity-package-builder.git
cd trinity-package-builder.git
git init-db

Скопируем себе заготовку hooks/template.pl из git.altlinux.org/people/viy/packages/fcimport.git

Утилите fcmass при запуске нужно указать исходный репозиторий (origin), конечный репозиторий (destination), и список имен сопровождаемых пакетов.

Конечный репозиторий (destination) --- это Sisyphus. Предположим, что зеркало Sisyphus находится в /var/ftp/pub/Linux/ALT/Sisyphus Для краткости, сделаем симлинк

ln -s /var/ftp/pub/Linux/ALT ./ALT

Исходный репозиторий (origin) -- это набор rpm trinity-r14 с сайта проекта. Их тоже надо скачать и поместить под рукой. Скачаем пакеты исходного репозитория. Удобно сразу же написать скрипт для скачивания, так как им же будем и проверять набор пакетов на обновления.

mkdir bin
vim bin/update_trinity.sh

Где скрипт bin/update_trinity.sh имеет вид

mkdir -p TRINITY/trinity/rpm/f23/trinity-r14/
rsync -avp --delete-after rsync://mirror.ntmm.org/trinity/trinity/rpm/f23/trinity-r14/SRPMS TRINITY/trinity/rpm/f23/trinity-r14/

Запустив его, получим в папке TRINITY исходные пакеты.

Далее получим список имен сопровождаемых пакетов.

rpmquery --qf '%{NAME}\n' -p TRINITY/trinity/rpm/f23/trinity-r14/SRPMS/*src.rpm > trinity.txt
проверка изначального списка

Пакеты, которые входят в апстримный набор, нужно проверить -- нет ли их в Сизифе. В особенности подозрительны пакеты без префикса trinity-*: это fileshareset hk_classes pan torsocks wv2.

Проверка показала, что fileshareset нет, hk_classes сейчас нет, но в 5.1 был

/var/ftp/pub/Linux/ALT/5.1/branch/files/SRPMS/hk_classes-0.8.3-alt3.src.rpm

поэтому hk_classes первый раз надо будет сгенерировать отдельно с опцией --release alt3_1,

чтобы пакет был старше, чем alt3.

pan найден в autoimports, я его переложил в Сизиф, так как он более свежий (1.140),

torsocks и wv2 найдены в Сизифе.

/var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS/wv2-0.4.2-alt3.src.rpm
/var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS/torsocks-2.2.0-alt1.gite389c999.src.rpm

Следовательно, список trinity.txt надо отредактировать, удалив pan torsocks wv2.

Первый запуск

Сделаем обертку над fcmass, скрипт mytrinitymass, где укажем origin и dest репозитории

 #!/bin/sh
 fcmass \
   --origin TRINITY/trinity/rpm/f23/trinity-r14/SRPMS \
   --dest ~/hasher/repo/SRPMS.hasher:./ALT/Sisyhus/files/SRPMS:./ALT/5.1/files/SRPMS "$@"

первый запуск:

./mytrinitymass `cat trinity.txt` 2>&1 | tee import.log

увидим много ругани вида

WARNING: setting new version: can't find Source0:       %{name}-%{tde_version}%{?preversion:~%{preversion}}.tar.gz. Pray for the best! at /usr/share/perl5/RPM/Source/Transformation/Factory/RaiseRelease.pm line 569.
ошибка: Файл /mnt/home/archive/gitrepo/fcimport.git/trinity-abakus-0.91-14.0.3_1.fc23.2861/SOURCES/trinity-abakus-14.0.0.tar.gz: Нет такого файла или каталога
Writing src.rpm failed. May be some important rpm macros packages are missing. Writing hasher tar.

При этом в рабочей директории появилась куча подкаталогов:

drwxr-xr-x     -     fileshareset-2.0-1.fc23.15605
drwxr-xr-x     -     trinity-abakus-0.91-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-akode-2.0.2-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-amarok-1.4.10-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-arts-1.5.10-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-avahi-tqt-0.6.30-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-basket-1.0.3.1-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-bibletime-1.6.6.0-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-dbus-1-tqt-0.9-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-dbus-tqt-0.63-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-digikam-0.9.6-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-dolphin-0.9.2-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-filelight-1.0-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-gtk-qt-engine-0.8-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-gtk3-tqt-engine-0.5-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-gwenview-1.4.2-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-gwenview-i18n-1.4.2-14.0.3_1.fc23.14567
drwxr-xr-x     -     trinity-icons-kfaenza-0.8.9-1.fc23.14567
[...]

Это для fcimport аналог crush dump. При работе библиотека преобразования создает временный каталог вида %{NAME}-%{VERSION}-%{R$ELEASE}.$PID, куда распаковывает исходный srpm (в подпапки SOURCES и SPEC) и пишет новый спек (в подпапку NEW). Если rpmbuild -bs завершился неудачей, то распакованный srpm не удаляется, чтобы можно было внутри посмотреть, почему так. После просмотра все, что в листинге -- мусор, можно удалить

rm -r *-*-*.{fc,mga}*.*

Станем разбираться. Оказывается, эти src.rpm не полноценные (не самдостаточные). В них используется макрос tde_version, который извне был определен в значение 14.0.3, а внутри, если не определен, определяется как 14.0.0:

%if "%{?tde_version}" == ""                                                     
%define tde_version 14.0.0                                                    
%endif

Исключение trinity-kooldock, у которого умолчание 14.0.1.

Соответственно, библиотека SourceAnalyser по записи Source0: %{name}-%{tde_version}.tar.gz ищет файл trinity-abakus-14.0.0.tar.gz, не находит его (есть trinity-abakus-14.0.3.tar.gz) и ругается. Аналогично, rpmbuild не может найти файл SOURCES/trinity-abakus-14.0.0.tar.gz и не может упаковать src.rpm.

Опцией --macrodef tde_version=14.0.3 можно помочь библиотеке SourceAnalyser найти правильный файл, но эта опция не редактирует спек файл и не поможет на следующем этапе, когда будет вызван rpmbuild -bs для записи src.rpm. Для исправления спек файла надо писать скрипт на встроенном языке.

Исправим версию на правильную. Для этого создадим скрипт, который подредактирует определение:

cp hooks/template.pl set_trinity_version.pl
vim set_trinity_version.pl
 
#!/usr/bin/perl
push @PREHOOKS, 
sub {
    my ($spec,$parent) = @_;
    # не предупреждать, если изменения не удалось применить
    #  (так как мы будем применять этот скрипт ко всем пакетам подряд, 
    #   в том числе fileshareset hk_classes где макроса tde_version явно нет).
    $spec->applied_off();
    $spec->get_section('package','')->map_body(sub {s/14.0.\d+/14.0.3/ if /\%define\s+tde_version/});
    $spec->_reset_macros();
    # опять предупреждать, если изменения не удалось применить
    $spec->applied_on();
    #print STDERR "tde version=",$spec->{MACRO}->{tde_version},"\n";
};
__END__

Впишем полученный скрипт в опции запуска fcmass в наш скрипт-обертку mytrinitymass, чтобы он выполнялся над каждым пакетом из trinity.txt:

 #!/bin/sh
 fcmass \
   --origin TRINITY/trinity/rpm/f23/trinity-r14/SRPMS \
   --dest ~/hasher/repo/SRPMS.hasher:./ALT/Sisyhus/files/SRPMS:./ALT/5.1/files/SRPMS \
   --hook set_trinity_version.pl "$@"
Второй запуск
./mytrinitymass `cat trinity.txt` 2>&1 | tee import.log

и изучаем лог генерации. Видим, что у части пакетов

ошибка: строка 20: Prefix:    %{tde_prefix}
Writing src.rpm failed. May be some important rpm macros packages are missing. Writing hasher tar.
Written: ./OUT/trinity-icons-crystalsvg-updated-1.0-alt1_1.tar

Используется макрос tde_prefix, который в одних пакетах определен в значение /opt/trinity, а в других не определен. исправим это. Для этого создадим скрипт

cp hooks/template.pl add_trinity_prefix.pl
vim add_trinity_prefix.pl
 
#!/usr/bin/perl
push @SPECHOOKS, 
sub {
    if( ! $spec->get_section('package','')->match_body(qr'define\s+tde_prefix') ) {
        $spec->get_section('package','')->unshift_body('%define tde_prefix /opt/trinity'."\n");
    }
};
__END__

Также у пакетов trinity-libcaldav trinity-libcarddav был обнаружен загадочный подземный стук, который вылечился опцией

--SET RPM::Source::Transformation::Factory::DependencyFilter::group_filters_by_transformation=0

Впишем полученные скрипты и опции запуска fcmass в наш скрипт-обертку mytrinitymass:

 #!/bin/sh
 fcmass \
   --origin TRINITY/trinity/rpm/f23/trinity-r14/SRPMS \
   --dest ~/hasher/repo/SRPMS.hasher:./ALT/Sisyhus/files/SRPMS:./ALT/5.1/files/SRPMS \
   --SET RPM::Source::Transformation::Factory::DependencyFilter::group_filters_by_transformation=0 \
   --hook set_trinity_version.pl \
   --hook add_trinity_prefix.pl \
   "$@"

По хорошему, вместо хака add_trinity_prefix.pl надо бы сделать скрипт, который удаляет из спеков все эти определения

%define tde_prefix /opt/trinity                                                                                                 
%define tde_bindir %{tde_prefix}/bin
%define tde_confdir %{_sysconfdir}/trinity
%define tde_datadir %{tde_prefix}/share
%define tde_docdir %{tde_datadir}/doc
%define tde_includedir %{tde_prefix}/include
%define tde_libdir %{tde_prefix}/%{_lib}
%define tde_mandir %{tde_datadir}/man
[...]

и вставляет вместо этого

BuildRequires(pre): rpm-macros-trinity.

Но это потом. Сначала добъемся успешной генерации всех пакетов.

WARNING: forbidden Group

Еще были сообщения о forbidden Group, связанные с Multimedia.

WARNING: forbidden Group: Application/Multimedia in amarok. Please, replace.
WARNING: forbidden Group: Productivity/Multimedia/Other in -n trinity-libarts-akode. Please, replace.
[...]

В нашем rpm можно указывать только группы, прописанные в /usr/lib/rpm/GROUPS. Все другие группы запрещены. Библиотека конверсии пытается подобрать для чужих групп их аналоги из /usr/lib/rpm/GROUPS, но иногда подобрать замену не удается. В таком случае группа остается как есть, и выдается предупреждение WARNING: forbidden Group:. В частности, непонятно, какую группу указывать для Multimedia, так как Multimedia нет в /usr/lib/rpm/GROUPS, а есть Graphics, Sound и Video Побороть это можно, либо грубо сбросив все такие группы в Other c помощью опции

--group-translate Application/Multimedia,Other,Productivity/Multimedia/Other,Other

где указываются пары для замены, либо указать точные замены для каждого пакета отдельно. Для этого нужно создать каталог groups и в нем создать файлы вида groups/<name>, содержащие таблицы замен групп для пакета <name> с именами групп, разделенными табуляцией, по одной замене в ряд.

Примеры:

groups/amarok

Application/Multimedia<--здесь tab-->Sound

groups/trinity-libarts

Productivity/Multimedia/Other<--здесь tab-->Sound

Эти же файлы можно создавать, чтобы подправить не совсем аккуратные замены. К примеру, видя в trinity-filelights

warning: substituting Group: Applications/Utilities with unaccurate Other

создадим groups/trinity-filelights

Applications/Utilities<--здесь tab-->File tools
Третий запуск
./mytrinitymass `cat trinity.txt` 2>&1 | tee import.log

и изучаем лог генерации.