Ранее в нашем цикле статей мы рассказывали о создании 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
Любые установленные из данного репозитория пакеты автоматически удалены не будут.