Собираем RPM пакеты для Fedora в mock

Ранее мы уже многократно описывали алгоритмы сборки RPM пакетов, однако делали это непосредственно внутри установленной системы при помощи прямого вызова инструмента rpmbuild. Существует и другой, более правильный, на наш взгляд, метод — mock.

Подготовка среды

Для начала нам потребуется установить и подготовить среду к работе. Установим сам mock, а также ряд необязательных, но необходимых для наших целей компонентов:

sudo dnf install mock rpmdevtools rpm-build

Если для сборки пакета нам потребуются не только базовые репозитории Fedora, но и RPMFusion, потребуется добавить готовые конфиги и для этого сценария:

sudo dnf install mock-rpmfusion-free

Получение прав на сборку

По умолчанию использовать mock имеют право только те пользователи, которые состоят в одноимённой группе, созданной при установке среды.

Первым делом необходимо добавить свою учётную запись в группу mock. Это можно сделать при помощи usermod:

sudo usermod -a -G mock $(whoami)

Теперь выполним повторную инициализацию пользовательского сеанса с регистрацией в новой группе (в качестве альтернативы можно просто выйти и повторно войти в систему):

newgrp mock

Подготовка пакета к сборке

Для запуска сборки в mock, мы должны использовать пакет с исходными текстами *.src.rpm (SRPM).

При отсутствии готового к сборке SRPM и наличии только SPEC-файла, нам потребуется сначала его сгенерировать.

Создадим базовую структуру каталогов rpmbuild для текущего пользователя:

rpmdev-setuptree

Загрузим все исходники, указанные внутри SPEC-файла, улититой spectool (они будут загружены в каталог ~/rpmbuild/SOURCES/):

spectool -g -R имя_пакета.spec

Создадим SRPM-пакет:

rpmbuild -bs имя_пакета.spec

Итоговый SRPM будет лежать в каталоге ~/rpmbuild/SRPMS/.

Запуск сборки пакета в mock

Итак, у нас есть пакет с исходниками и спеком — SRPM — поэтому приступим непосредственно к сборке:

mock -r fedora-$(rpm -E %fedora)-$(uname -m)-rpmfusion_free --rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm

В этом примере мы собираем пакет для текущей используемой версии Fedora ($(rpm -E %fedora)), текущей платформы ($(uname -m)) с добавлением поддержки репозитория RPMFusion во время сборки (-rpmfusion_free).

Сборка для иных версий Fedora и платформ

Если необходимо собрать пакет для другой версии Fedora или другой архитектуры, то сделать это очень просто. Для начала узнаем какие файлы конфигурации у нас установлены:

ls -l /etc/mock/*.cfg

Данные файлы конфигурации содержат список репозиториев и тулчейнов, которые будут использоваться при сборке. Необходимый конфигурационный файл следует указать после параметра -r без расширения. Если он не указан, то будет использоваться /etc/mock/default.cfg, который является симлинком. Допускается удалить данный симлинк и создать на его месте свой собственный конфиг по умолчанию (в качестве примера можно взять любой из существующих (это обычные текстовые файлы)).

Для Fedora 25 для архитектуры i386 (32-бита) без подключения RPMFusion:

mock -r fedora-25-i386 --rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm

Для Fedora 25 для архитектуры x86_64 (64-бита) с подключением RPMFusion:

mock -r fedora-25-x86_64-rpmfusion_free --rebuild ~/rpmbuild/SRPMS/имя_пакета*.src.rpm

Получение результата

Сборка будет происходить внутри создаваемого chroot окружения и никак не затронет основную систему. По её окончании временные файлы будут уничтожены.

Mock располагает свои файлы в следующих каталогах:

  • /etc/mock — конфигурационные файлы;
  • /var/cache/mock — кэш пакетов dnf (может быть очищен пользователем);
  • /var/lib/mock — каталог хранения chroot окружений и результатов сборки (также может быть очищен пользователем).

По окончании работы собранные RPM пакеты, а также полные логи могут быть найдены в каталоге /var/lib/mock/ID_окружения/result/.

2 commentary to post

  1. Чем конкретно этот способ сборки лучше старого?

    1. Чем конкретно этот способ сборки лучше старого?

      Основные отличия:

      • нет необходимости устанавливать в систему кучу development пакетов и компиляторов;
      • весь процесс сборки происходит строго внутри создаваемого изолированного chroot окружения, очищаемого по её окончании;
      • допускается собирать пакеты для других дистрибутивов и архитектур.

Обсуждение закрыто.