Создаём собственный репозиторий для Fedora

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

Подготовка

Установим стандартный набор для сборки и подписи пакетов:

sudo dnf install git mock rpm-sign createrepo

Создание распространяемого пакета

Чтобы нам не пришлось вручную подключать репозиторий на каждой машине пользователя, управлять публичными ключами с GPG-подписями и производить прочие рутинные действия, создадим универсальный распространяемый пакет, который будет включать всё необходимое.

Клонируем базовый шаблон с примером репозитория foobar:

git clone https://github.com/xvitaly/fedora-repo-example.git

В примере присутствуют ветки: по одной на каждый поддерживаемый релиз дистрибутива. Переключаться между ними можно при помощи git checkout, например:

cd fedora-repo-example
git checkout f32

Ветка master всегда должна указывать на Fedora Rawhide.

Сгенерируем GPG-ключи, которыми будут подписаны пакеты (для каждой версии дистрибутива создадим индивидуальный репозиторий и ключ по следующим причинам):

gpg2 --gen-key

Экспортируем результат в файл:

gpg2 --export --armor 21AF18C6 > RPM-GPG-KEY-foobar-32

Здесь 21AF18C6 — ID ключа, foobar — название нашего репозитория, а 32 — релиз Fedora, для которого он предназначен.

Внесём правки в repo-файл и SPEC, после чего соберём распространяемый RPM-пакет:

mock -r fedora-32-$(uname -m) --buildsrpm --spec=foobar-repo.spec --sources=. --resultdir=/tmp/repo
mock -r fedora-32-$(uname -m) --rebuild /tmp/repo/*.src.rpm --resultdir=/tmp/repo

Директива Version в спеке указывает на целевую версию дистрибутива. Старые GPG-ключи удалять не следует для корректной миграции между релизами.

Результат можно найти в каталоге /tmp/repo. Он потребуется нам далее.

Создание базовой иерархии

Создадим базовую иерархию каталогов, в которых будут расположены собранные RPM пакеты и SRPM файлы для целевого дистрибутива.

Если публикация архивов с исходниками не требуется, то каталог для SRPM можно не создавать и, соответственно, удалить всю секцию foobar-source из *.repo файла.

Создадим каталоги для Fedora 32:

mkdir -p ~/fedora/32/{$(uname -m),SRPM}

Внутри архитектурно-зависимого каталога будем размещать RPM-пакеты, включая noarch и, при необходимости поддержки multilib в 64-битной версии Fedora, также 32-битные версии для архитектуры i686.

В SRPM скопируем *.src.rpm файлы с исходниками.

Обязательно добавим и наш распространяемый пакет, собранный ранее:

mv /tmp/repo/*.noarch.rpm ~/fedora/32/$(uname -m)/
mv /tmp/repo/*.src.rpm ~/fedora/32/SRPM/

Подпись RPM пакетов

Создадим файл ~/.rpmmacros следующего содержания:

%_signature gpg2
%_gpg_name 21AF18C6

Здесь 21AF18C6 — ID ключа для подписи репозитория.

К сожалению, rpm-sign не поддерживает указание ID ключа индивидуально, поэтому перед подписью каждого репозитория его придётся менять внутри данного файла.

Подпишем все RPM-пакеты в репозитории для Fedora 32:

rpm --addsign ~/fedora/32/*/*.rpm

При необходимости заменим ключ в ~/.rpmmacros и повторим действие для всех оставшихся репозиториев.

Автоматическая подпись RPM пакетов

При сборке в mock допускается настроить автоматическое подписывание пакетов, чтобы не производить эту операцию вручную.

Создадим файл ~/.config/mock.cfg следующего содержания:

config_opts['plugin_conf']['sign_enable'] = True
config_opts['plugin_conf']['sign_opts'] = {}
config_opts['plugin_conf']['sign_opts']['cmd'] = 'rpmsign'
config_opts['plugin_conf']['sign_opts']['opts'] = '--addsign %(rpms)s'

Ключ также придётся указывать в файле ~/.rpmmacros. Все создаваемые пакеты теперь будут иметь действительную цифровую подпись GnuPG.

Создание репозитория

С помощью утилиты createrepo сгенерируем метаданные, после чего наш набор файлов станет полноценным репозиторием и сможет использоваться на машинах конечных пользователей:

createrepo --database ~/fedora/*/*/

Выгрузим репозиторий на CDN, либо любой веб-сервер, отдающий файлы по прямым ссылкам (любые редиректы запрещены):

rsync -chavzP --stats --delete ~/fedora user@example.org:/var/www

Повторяем эти шаги при каждом добавлении/удалении пакетов.

Подключение репозитория

Для подключения репозитория установим распространяемый пакет любым удобным способом на машинах пользователей:

sudo dnf install --nogpgcheck https://downloads.example.org/fedora/$(rpm -E %fedora)/foobar-release-$(rpm -E %fedora)-1.fc$(rpm -E %fedora).rpm

Для удобства лучше всего сделать символическую ссылку на стороне сервера с более коротким URL.

Отключение репозитория

Для отключения просто удалим его:

sudo dnf remove foobar-release

Любые установленные из данного репозитория пакеты автоматически удалены не будут.