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

Материал из ALT Linux Wiki
м (источник неправильного написания названия дистрибутива, в т.ч. и в википедии)
 
(не показано 40 промежуточных версий 2 участников)
Строка 15: Строка 15:
===== описание проекта trinity =====
===== описание проекта trinity =====


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


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


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


Массовое автоматическое преобразование этих пакетов из fedora в ALTLinux выполняет утилита fcmass.
Массовое автоматическое преобразование этих пакетов из fedora в ALT Linux выполняет утилита fcmass.
(Из SuSE -- susemass).  
(Из SuSE -- susemass).  
Установим ее и нужную ей базу distromap:
Установим ее и нужную ей базу distromap:
  apt-get install /usr/bin/fcmass distromap-fedora-rawhide-altlinux-sisyphus
  apt-get install /usr/bin/fcmass distromap-fedora-rawhide-altlinux-sisyphus
Также обновим базу DistroDB Сизифа:
Также обновим базу DistroDB Сизифа: запустим программу
  distrodb-update-repocop-db-altlinux-sisyphus  
  distrodb-update-repocop-db-altlinux-sisyphus  


Строка 38: Строка 38:
  cd trinity-package-builder.git
  cd trinity-package-builder.git
  git init-db
  git init-db
Скопируем себе заготовку {{path|hooks/template.pl}} из {{path|git.altlinux.org/people/viy/packages/fcimport.git}}
В git храним только то, что персонально добавили в папку руками.
Выхлопы fcimport, такие, как готовые пакеты в OUT, временные папки вида
{{path|%{NAME}-%{VERSION}-%{R$ELEASE}.$PID}}, логи и т.д. в git не храним.
Готовый репозиторий можно посмотреть
[http://git.altlinux.org/people/ruslandh/packages/trinity-package-builder.git здесь.]
Утилите fcmass при запуске нужно указать исходный репозиторий (origin), конечный репозиторий (destination),
Утилите fcmass при запуске нужно указать исходный репозиторий (origin), конечный репозиторий (destination),
и список имен сопровождаемых пакетов.
и список имен сопровождаемых пакетов.
Строка 51: Строка 59:
так как им же будем и проверять набор пакетов на обновления.
так как им же будем и проверять набор пакетов на обновления.
  mkdir bin
  mkdir bin
  vim bin/update_triity.sh
  vim bin/update_trinity.sh
Где скрипт bin/update_triity.sh имеет вид
Где скрипт bin/update_trinity.sh имеет вид
  mkdir -p TRINITY/trinity/rpm/f23/trinity-r14/
  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/
  rsync -avp --delete-after rsync://mirror.ntmm.org/trinity/trinity/rpm/f23/trinity-r14/SRPMS TRINITY/trinity/rpm/f23/trinity-r14/
Строка 64: Строка 72:


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


Проверка показала, что fileshareset нет, hk_classes сейчас нет, но в 5.1 был  
Проверка показала, что fileshareset нет, hk_classes сейчас нет, но в 5.1 был  
  /var/ftp/pub/Linux/ALT/5.1/branch/files/SRPMS/hk_classes-0.8.3-alt3.src.rpm
  /var/ftp/pub/Linux/ALT/5.1/branch/files/SRPMS/hk_classes-0.8.3-alt3.src.rpm
поэтому hk_classes первый раз надо будет сгенерировать отдельно с опцией --release alt3_1,
поэтому первый раз до отправки в Сизиф  hk_classes надо будет обработать отдельно.
чтобы пакет был старше, чем alt3.  
Например, сгенерировать с опцией --release alt3_1, чтобы пакет был старше, чем alt3.  
Еще лучше вместо этого скачать из 5.1 hk_classes-0.8.3-alt3.src.rpm,
и особо запустить mytrinitymass персонально для hk_classes
с опцией --parent:
./mytrinitymass hk_classes --parent ./hk_classes-0.8.3-alt3.src.rpm
 
Если же вдруг под рукой есть зеркало 5.1 srpms, то вышеперечисленных танцев с
бубном для hk_classes совершать не нужно. Достаточно добавить путь к 5.1
в конец --dest-path, и fcmass сделает все, что надо, автоматически.
 
pan найден в autoimports, я его переложил в Сизиф, так как он более свежий (1.140),
pan найден в autoimports, я его переложил в Сизиф, так как он более свежий (1.140),
torsocks и wv2 найдены в Сизифе.
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/wv2-0.4.2-alt3.src.rpm
  /var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS/torsocks-2.2.0-alt1.gite389c999.src.rpm
  /var/ftp/pub/Linux/ALT/Sisyphus/files/SRPMS/torsocks-2.2.0-alt1.gite389c999.src.rpm
Строка 95: Строка 114:
  ошибка: Файл /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.14567
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.
При работе библиотека преобразования создает временный каталог
вида {{path|%{NAME}-%{VERSION}-%{R$ELEASE}.$PID}},
куда распаковывает исходный srpm (в подпапки SOURCES и SPEC)
и пишет новый спек (в подпапку NEW).
Если rpmbuild -bs завершился неудачей,
то пишется hasher tar (возможно, для rpmbuild -bs просто не хватило установленных макросов в хост системе), а распакованный srpm не удаляется, чтобы можно было внутри посмотреть, почему rpmbuild -bs не отработал.
После того, как просмотрели и разобрались, все, что в листинге -- мусор, можно удалить
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}" == ""                                                     
  %define tde_version 14.0.0                                                     
  %define tde_version 14.0.0                                                     
  %endif
  %endif
исправим версию на правильную. Для этого создадим скрипт, который подредактирует определение:
Исключение {{pkg|trinity-kooldock}}, у которого умолчание {{term|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. Для исправления спек файла надо писать скрипт
на [[Packaging_Automation/Embedded_Language|встроенном языке]].
 
Исправим версию на правильную. Для этого создадим скрипт, который подредактирует определение:
  cp hooks/template.pl set_trinity_version.pl
  cp hooks/template.pl set_trinity_version.pl
  vim set_trinity_version.pl
  vim set_trinity_version.pl
Строка 108: Строка 170:
push @PREHOOKS,  
push @PREHOOKS,  
sub {
sub {
     $spec->get_section('package','')->map_body(sub {s,14.0.0,14.0.3, if /\%define\s+tde_version/});
    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->_reset_macros();
    # опять предупреждать, если изменения не удалось применить
    $spec->applied_on();
     #print STDERR "tde version=",$spec->{MACRO}->{tde_version},"\n";
     #print STDERR "tde version=",$spec->{MACRO}->{tde_version},"\n";
};
};
__END__
__END__
</source>
</source>
Впишем полученный скрипт в опции запуска {{cmd|fcmass}}:
Впишем полученный скрипт в опции запуска {{cmd|fcmass}} в наш скрипт-обертку {{cmd|mytrinitymass}},
чтобы он выполнялся над каждым пакетом из {{path|trinity.txt}}:
<source lang="bash">
#!/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 "$@"
</source>
 
===== Второй запуск =====
./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, который в одних пакетах определен в значение {{term|/opt/trinity}}, а в других не определен. исправим это. Для этого создадим скрипт
cp hooks/template.pl add_trinity_prefix.pl
vim add_trinity_prefix.pl
<source lang="perl">
#!/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__
</source>
 
Также у пакетов {{pkg|trinity-libcaldav}} {{pkg|trinity-libcarddav}} был обнаружен загадочный подземный
стук<ref>(починено в perl-RPM-Source-Convert-0.617-alt1 perl-RPM-Source-Editor-0.880-alt1, так что можно и без нее)</ref>, который вылечился опцией
--SET RPM::Source::Transformation::Factory::DependencyFilter::group_filters_by_transformation=0
<references/>
 
Впишем полученные скрипты и опции запуска {{cmd|fcmass}} в наш скрипт-обертку {{cmd|mytrinitymass}}:
<source lang="bash">
<source lang="bash">
  #!/bin/sh
  #!/bin/sh
  fcmass \
  fcmass \
   --origin TRINITY/trinity/rpm/f23/trinity-r14/SRPMS \
   --origin TRINITY/trinity/rpm/f23/trinity-r14/SRPMS \
   --dest ~/hasher/repo/SRPMS.hasher:./ALT/Sisyhus/files/SRPMS:./ALT/5.1/files/SRPMS "$@"
   --dest ~/hasher/repo/SRPMS.hasher:./ALT/Sisyhus/files/SRPMS:./ALT/5.1/files/SRPMS \
   --hook set_trinity_version.pl --macrodef tde_version=14.0.3
  --SET RPM::Source::Transformation::Factory::DependencyFilter::group_filters_by_transformation=0 \
   --hook set_trinity_version.pl \
  --hook add_trinity_prefix.pl \
  "$@"
</source>
</source>


По хорошему, вместо хака {{path|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 можно указывать только группы, прописанные в {{path|/usr/lib/rpm/GROUPS}}.
Все другие группы запрещены. Библиотека конверсии пытается подобрать для чужих групп их аналоги
из {{path|/usr/lib/rpm/GROUPS}}, но иногда подобрать замену не удается. В таком случае
группа остается как есть, и выдается предупреждение WARNING: forbidden Group:.
В частности, непонятно, какую группу указывать для {{term|Multimedia}}, так как {{term|Multimedia}} нет
в {{path|/usr/lib/rpm/GROUPS}}, а есть {{term|Graphics}}, {{term|Sound}} и {{term|Video}}
Побороть это можно, либо грубо сбросив все такие группы в {{term|Other}} c помощью опции
--group-translate Application/Multimedia,Other,Productivity/Multimedia/Other,Other
где указываются пары для замены, либо указать точные замены для каждого пакета отдельно.
Для этого нужно создать каталог {{path|groups}} и в нем создать файлы вида {{path|groups/<name>}},
содержащие таблицы замен групп для пакета {{path|<name>}} с именами групп, разделенными табуляцией,
по одной замене в ряд.
Примеры:
{{path|groups/amarok}}
Application/Multimedia<--здесь tab-->Sound
{{path|groups/trinity-libarts}}
Productivity/Multimedia/Other<--здесь tab-->Sound
Эти же файлы можно создавать, чтобы подправить не совсем аккуратные замены.
К примеру, видя в {{path|trinity-filelights}}
warning: substituting Group: Applications/Utilities with unaccurate Other
создадим
{{path|groups/trinity-filelights}}
Applications/Utilities<--здесь tab-->File tools
===== Третий запуск =====
  ./mytrinitymass `cat trinity.txt` 2>&1 | tee import.log
  ./mytrinitymass `cat trinity.txt` 2>&1 | tee import.log
и изучаем лог генерации.
== всякие мелочи ==
=== как перейти с gear на заливку srpm ===
Используем утилиту girar-print-build-commit из пакета girar-nmu.
Пример из жизни: Пакет jogl2 собирался руками из gear.
Было принято решение заменить его пакетом от робота.
Как залить srpm в сборочницу?
# заливаем (task 170882)
# сборочница дает отлуп: error: /gears/j/jogl2.git branch `sisyphus' already exists, package update by srpm upload is not possible
# ssh girar task check-git-inheritance 170882 100 disable `girar-print-build-commit -b sisyphus jogl2`
# ssh girar task run 170882
# пакет в Сизифе!

Текущая версия от 10:48, 31 мая 2019



Введение.

TODO

Примеры

trinity

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

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

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

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

Массовое автоматическое преобразование этих пакетов из fedora в ALT Linux выполняет утилита 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

В git храним только то, что персонально добавили в папку руками. Выхлопы fcimport, такие, как готовые пакеты в OUT, временные папки вида %{NAME}-%{VERSION}-%{R$ELEASE}.$PID, логи и т.д. в 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. Еще лучше вместо этого скачать из 5.1 hk_classes-0.8.3-alt3.src.rpm, и особо запустить mytrinitymass персонально для hk_classes с опцией --parent:

./mytrinitymass hk_classes --parent ./hk_classes-0.8.3-alt3.src.rpm

Если же вдруг под рукой есть зеркало 5.1 srpms, то вышеперечисленных танцев с бубном для hk_classes совершать не нужно. Достаточно добавить путь к 5.1 в конец --dest-path, и fcmass сделает все, что надо, автоматически.

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.14567
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 завершился неудачей, то пишется hasher tar (возможно, для rpmbuild -bs просто не хватило установленных макросов в хост системе), а распакованный srpm не удаляется, чтобы можно было внутри посмотреть, почему rpmbuild -bs не отработал. После того, как просмотрели и разобрались, все, что в листинге -- мусор, можно удалить

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 был обнаружен загадочный подземный стук[1], который вылечился опцией

--SET RPM::Source::Transformation::Factory::DependencyFilter::group_filters_by_transformation=0
  1. (починено в perl-RPM-Source-Convert-0.617-alt1 perl-RPM-Source-Editor-0.880-alt1, так что можно и без нее)

Впишем полученные скрипты и опции запуска 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

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

всякие мелочи

как перейти с gear на заливку srpm

Используем утилиту girar-print-build-commit из пакета girar-nmu.

Пример из жизни: Пакет jogl2 собирался руками из gear. Было принято решение заменить его пакетом от робота. Как залить srpm в сборочницу?

  1. заливаем (task 170882)
  2. сборочница дает отлуп: error: /gears/j/jogl2.git branch `sisyphus' already exists, package update by srpm upload is not possible
  3. ssh girar task check-git-inheritance 170882 100 disable `girar-print-build-commit -b sisyphus jogl2`
  4. ssh girar task run 170882
  5. пакет в Сизифе!