Packaging Automation/MassProcessing/MassImportAndSupport
Материал из ALT Linux Wiki
(→Второй запуск) |
|||
(50 промежуточных версий не показаны.) | |||
Строка 13: | Строка 13: | ||
==== trinity ==== | ==== trinity ==== | ||
- | + | ===== описание проекта trinity ===== | |
- | Есть готовый набор rpm, которые можно скачать с сайта проекта. | + | |
- | + | Допустим, мы хотим собрать в Сизиф 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 | ||
+ | Скопируем себе заготовку {{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), | ||
+ | и список имен сопровождаемых пакетов. | ||
+ | |||
+ | Конечный репозиторий (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 | rpmquery --qf '%{NAME}\n' -p TRINITY/trinity/rpm/f23/trinity-r14/SRPMS/*src.rpm > trinity.txt | ||
- | + | ===== проверка изначального списка ===== | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | Пакеты, которые входят в апстримный набор, нужно проверить -- нет ли их в Сизифе. | |
+ | В особенности подозрительны пакеты без префикса trinity-*: это {{prg|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 | /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, скрипт {{cmd|mytrinitymass}}, где укажем origin и dest репозитории | ||
+ | |||
+ | <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 "$@" | ||
+ | </source> | ||
+ | |||
+ | первый запуск: | ||
+ | ./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. | ||
+ | При работе библиотека преобразования создает временный каталог | ||
+ | вида {{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}}: | ||
+ | %if "%{?tde_version}" == "" | ||
+ | %define tde_version 14.0.0 | ||
+ | %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 | ||
+ | <source lang="perl"> | ||
+ | #!/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__ | ||
+ | </source> | ||
+ | Впишем полученный скрипт в опции запуска {{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"> | ||
+ | #!/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 \ | ||
+ | "$@" | ||
+ | </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 | ||
+ | и изучаем лог генерации. | ||
+ | |||
+ | == всякие мелочи == | ||
+ | |||
+ | === как перейти с 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 | |
+ | # пакет в Сизифе! |
Текущая версия на 15:20, 18 октября 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
В 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
- ↑ (починено в 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 в сборочницу?
- заливаем (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
- пакет в Сизифе!