В данной инструкции мы научимся готовить Linux-среду для работы и рассмотрим примеры по созданию своих пакетов RPM. Мы будем работать в системе CentOS (Red Hat / Fedora).
Для работы по сборке пакетов лучше использовать отдельный компьютер, виртуальную машину или контейнер Docker.
1. Установим пакеты:
yum install rpmdevtools rpmlint
* где:
А также ставим:
yum group install «Development Tools»
* данная группа пакетов включает все необходимое для сборки. Ее не рекомендуется ставить на рабочий компьютер, так как устанавливается много ненужного для стандартной системы мусора.
2. Создаем пользователя.
Делать готовые установочные сборки пакетов очень опасно от пользователя root. Если мы допустим ошибку с путями, файлы могут перетереть или удалить важные для работы директории. Стоит создать отдельного пользователя и работать под ним. Однако, если мы работаем в виртуальной среде или контейнере Docker, нам это не страшно. Тогда данный пункт можно пропустить и работать из под root.
Выполняем команду:
useradd builder -m
* в данном примере мы создадим пользователя builder. Опция -m сразу создаст домашний каталог для пользователя.
Теперь заходим под данным пользователем — последующие команды мы будем выполнять от него:
su — builder
3. Создадим структуру каталогов для сборки:
rpmdev-setuptree
В нашей текущем каталоге должна появиться папка rpmbuild — а в ней:
Мы готовы к сборке.
Рассмотрим пример создания RPM из пакета, который нужно собирать из исходников с помощью команды make. Например, возьмем данную программу: github.com/brettlaforge/pg_redis_pubsub.
Создадим файл spec:
rpmdev-newspec rpmbuild/SPECS/pg_redis_pubsub.spec
Теперь откроем его и приведем к виду:
vi rpmbuild/SPECS/pg_redis_pubsub.spec
Name: pg_redis_pubsubVersion: 1.0.2Release: 1%{?dist}Summary: Redis Publish from PostgreSQLLicense: X11 LicenseURL: https://github.com/brettlaforge/pg_redis_pubsubSource0: %{name}-%{version}.tar.gz
BuildRequires: postgresql-devel postgresql-server-develBuildRequires: hiredis-develRequires: postgresql%if 0%{?rhel} < 8Requires: hiredis-last >= 0.13.3-1%elseRequires: hiredis = 0.15%endif
%define _build_id_links none
%descriptionRedis Publish from PostgreSQL
%prep%{__rm} -rf %{name}-%{version}%{__mkdir} -p %{name}-%{version}%{__tar} -xzvf %{SOURCE0} -C %{_builddir}/%{name}-%{version} —strip-components 1
%buildcd %{name}-%{version}%{__make}
%installcd %{name}-%{version}%{__make} install DESTDIR=%{buildroot}
%clean%{__rm} -rf $RPM_BUILD_ROOT%{__rm} -rf $RPM_BUILD_DIR/*
%files%defattr(-,root,root)%{_libdir}/pgsql/redis.so%{_datadir}/pgsql/extension/redis.control%{_datadir}/pgsql/extension/redis—0.0.1.sql%doc %{_datadir}/doc/extension/redis.mmd
%changelog* Fri Jul 9 2021 root—
* чтобы понять, как заполнить spec-файл, рекомендуется для начала собрать и установить приложение вручную с помощью make и make install. Также необходимо изучить документацию устанавливаемого пакета или (при наличие возможности) поговорить с разработчиками программного обеспечения.
Установим зависимости, которые необходимы для сборки (BuildRequires):
yum-builddep rpmbuild/SPECS/pg_redis_pubsub.spec
* утилита yum-builddep сама читает зависимости, необходимые для сборки и устанавливает недостающие пакеты.
Можно это сделать и вручную. В данном примере это: yum install epel-release yum install postgresql-devel postgresql-server-devel hiredis-devel * конкретно, в моем примере для установки hiredis-devel необходимо поставить репозиторий epel-release. Список пакетов, необходимый для сборки конкретного пакета необходимо уточнить в документации.
Можно это сделать и вручную. В данном примере это:
yum install epel-release
yum install postgresql-devel postgresql-server-devel hiredis-devel
* конкретно, в моем примере для установки hiredis-devel необходимо поставить репозиторий epel-release. Список пакетов, необходимый для сборки конкретного пакета необходимо уточнить в документации.
Теперь копируем исходник на свой компьютер. В моем примере клонируем репозиторий:
git clone https://github.com/brettlaforge/pg_redis_pubsub.git
Готовим архив и помещаем его в каталог rpmbuild/SOURCES:
tar -czvf rpmbuild/SOURCES/pg_redis_pubsub-1.0.2.tar.gz pg_redis_pubsub
Если бы в качестве Source мы указали внешний URL, можно было бы предварительно загрузить исходники командой: spectool -g -R rpmbuild/SPECS/pg_redis_pubsub.spec Данная команда разместит загруженные файлы в каталоге rpmbuild/SOURCES/.
Если бы в качестве Source мы указали внешний URL, можно было бы предварительно загрузить исходники командой:
spectool -g -R rpmbuild/SPECS/pg_redis_pubsub.spec
Данная команда разместит загруженные файлы в каталоге rpmbuild/SOURCES/.
Проверяем корректность SPEC-файла:
rpmlint rpmbuild/SPECS/pg_redis_pubsub.spec
В моем примере команда вернула ответ:
rpmbuild/SPECS/pg_redis_pubsub.spec: W: invalid-url Source0: pg_redis_pubsub-1.0.2.tar.gz0 packages and 1 specfiles checked; 0 errors, 1 warnings.
Данное предупреждение можно проигнорировать.
Выполняем сборку:
rpmbuild -bb rpmbuild/SPECS/pg_redis_pubsub.spec
Если она пройдет без ошибок, мы должны найти RPM-пакет в каталоге rpmbuild/RPMS/x86_64, где x86_64 — архитектура пакета.
Данный файл является инструкцией по сборке пакета. В нем мы описываем сам пакет, задаем метаданные и указываем, как извлекать файлы и куда их копировать при установке пакета. Синтаксис файла включает такие элементы, как разделы, макросы, операторы, опции. Рассмотрим их отдельно.
Определяют описание пакета, а также некоторые важные для сборки параметры.
С помощью тега %define можно определять переменные. Предоставлены разные возможности это сделать:
В каждом разделе описывается своя часть логики процесса сборки пакета.
У каждого из разделов могут быть свои макросы:
Мы можем описать команды, которые будут выполняться на конечном компьютере при установке или удалении пакета:
Внутри сценариев могут быть запущены свои макросы:
Некоторые системные команды лучше писать не напрямую, а через макросы. Это позволит добиться большей стабильности при сборке на различных системах. Приведем в пример данные команды:
* полный список макросов можно получить командой rpm —showrc.
Каталоги лучше писать не буквально, а через макросы:
* обратите внимание, что некоторые макросы ведут не на конкретные пути, а на другие макросы.* полный список макросов можно получить командой rpm —showrc.
SPEC файл позволяет задавать логику с помощью операторов сравнения. Приведем примеры их использования:
Рассмотрим примеры ошибко, с которыми мы можем столкнуться.
Ошибка появляется в конце процесса сборки пакета.
Причина: обнаружены файлы, которые были установлены с помощью make install, но которые не были перечислены в %files. Таким образом, сборщик пакета не знает, что с ними делать.
Решение: секция %files должна содержать все файлы, необходимые для работы приложения. Их нужно перечислить.
Но если у нас есть полная уверенность, что мы перечислили все необходимое, а оставшиеся файлы нам ни к чему, то добавляем в файл spec:
%define _unpackaged_files_terminate_build 0
* в верхнюю часть.
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies