Сборка пакета с нуля: различия между версиями
(Изменение собираемого пакета в примере на KChildlock) |
|||
(не показано 20 промежуточных версий 14 участников) | |||
Строка 1: | Строка 1: | ||
{{Stub}} | {{Stub}} | ||
{{Note|На данной вики есть еще статья [[Сборка пакетов start]] из проекта [[Developer_start|Начинающему разработчику]]}} | |||
{{Note|На данной вики ещё есть статья [[Сборка пакетов (etersoft-build-utils)]], предлагающая минимальный порог вхождения в процесс сборки.}} | |||
Данное руководство покажет, как правильно собрать пакет RPM в [[Sisyphus]] с нуля в инфраструктуре [[Gear]] и [[git.alt]], имея только исходный код пакета, и [[Join|права мейнтейнера]] на '''git.alt'''. В качестве примера опакетим [http://sourceforge.net/projects/kchildlock/ KChildlock], чтобы закрыть запрос на сборку в багзилле: [https://bugzilla.altlinux.org/ | Данное руководство покажет, как правильно собрать пакет RPM в [[Sisyphus]] с нуля в инфраструктуре [[Gear]] и [[git.alt]], имея только исходный код пакета, и [[Join|права мейнтейнера]] на '''git.alt'''. В качестве примера опакетим [http://sourceforge.net/projects/kchildlock/ KChildlock], чтобы закрыть запрос на сборку в багзилле: [https://bugzilla.altlinux.org/25796 https://bugzilla.altlinux.org/25796]. | ||
== Введение == | == Введение == | ||
Строка 11: | Строка 11: | ||
# У вас установлен дистрибутив ALT Linux; | # У вас установлен дистрибутив ALT Linux; | ||
# Есть желание собрать пакет правильно, а не для единичного случая; | # Есть желание собрать пакет правильно, а не для единичного случая; | ||
# Вы носите гордое звание «мейнтейнер ALT Linux Team», что подразумевает наличие электронных ключей и доступа к инфраструктуре [[git.alt]] | # Вы носите гордое звание [[Руководство_начинающего_мейнтейнера_ALT_Linux_Team|«мейнтейнер ALT Linux Team»]], что подразумевает наличие электронных ключей и доступа к инфраструктуре [[git.alt]] | ||
Третий пункт необязателен для новичков, которые просто хотят собрать пакет правильно для себя. | Третий пункт необязателен для новичков, которые просто хотят собрать пакет правильно для себя. | ||
Строка 21: | Строка 21: | ||
* Собранный двоичный пакет (имеет расширение вида ''<архитектура>.rpm''). В качестве архитектуры может быть i586, x86_64 или noarch. Такие пакеты можно устанавливать командой <pre>rpm -Uvh package...rpm</pre> | * Собранный двоичный пакет (имеет расширение вида ''<архитектура>.rpm''). В качестве архитектуры может быть i586, x86_64 или noarch. Такие пакеты можно устанавливать командой <pre>rpm -Uvh package...rpm</pre> | ||
Подробную информацию по структуре RPM и сборке с помощью команды rpm можно найти в [http:// | Подробную информацию по структуре RPM и сборке с помощью команды rpm можно найти в [http://ftp.rpm.org/max-rpm/ Maximum RPM]. | ||
Однако для сборки через rpmbuild возникают очевидные сложности: | Однако для сборки через rpmbuild возникают очевидные сложности: | ||
Строка 46: | Строка 46: | ||
* Доступ к [[Branches|репозиторию пакетов]] | * Доступ к [[Branches|репозиторию пакетов]] | ||
Для этого [[Управление пакетами|настройте репозитории]] и установите пакеты | Для этого [[Управление пакетами|настройте репозитории]] и установите пакеты: | ||
apt-get install build | apt-get install rpm-build hasher gear | ||
Будут установлены с зависимостями все необходимые пакеты для опакечивания и сборки | Будут установлены с зависимостями все необходимые пакеты для опакечивания и сборки. | ||
== Настройка среды == | == Настройка среды == | ||
=== Окружение Git === | === Окружение Git === | ||
Для идентификации Вашего ключа, Вашего имени, адреса электронной почты введите: | |||
git config --global user.name 'Andrey Cherepanov' | git config --global user.name 'Andrey Cherepanov' | ||
git config --global user.email 'cas@altlinux.org' | git config --global user.email 'cas@altlinux.org' | ||
git config --global user.signingkey 'A9EBF131' | git config --global user.signingkey 'A9EBF131' | ||
или | |||
gpg --gen-key | |||
Измените в зависимости от ваших параметров. Третья команда задаёт идентификатор вашего GPG-ключа для подписи: | Измените в зависимости от ваших параметров. Третья команда задаёт идентификатор вашего GPG-ключа для подписи: | ||
Строка 84: | Строка 89: | ||
[cas@cas ~]$ LANG=C gpg --fingerprint A9EBF131 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2 | [cas@cas ~]$ LANG=C gpg --fingerprint A9EBF131 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2 | ||
A424A3962331FDD2748BC8B34863C0F4A9EBF131 | A424A3962331FDD2748BC8B34863C0F4A9EBF131 | ||
или | |||
[cas@cas ~]$ gpg --fingerprint A9EBF131 | sed -n '/.*=/{s/.*=/%_gpg_name\t/;s/ //gp}' | |||
%_gpg_name A424A3962331FDD2748BC8B34863C0F4A9EBF131 | |||
== Окружение Hasher == | == Окружение Hasher == | ||
Строка 109: | Строка 117: | ||
mount=/dev/pts,/proc | mount=/dev/pts,/proc | ||
Соответственно, USER должен быть такой же, как заведён в ''hasher-useradd'', target — указывать на архитектуру | Соответственно, USER должен быть такой же, как заведён в ''hasher-useradd'', target — указывать на архитектуру собираемых пакетов. | ||
== Подготовка репозитория Git == | == Подготовка репозитория Git == | ||
Репозиторий Git создать очень просто. Для этого создадим каталог (имена пакетов лучше указывать в нижнем регистре, поэтому наш пакет для проекта будет называться '''kchildlock'''), перейдём в него и запустим '''git init''': | |||
mkdir kchildlock | |||
cd kchildlock | |||
git init . | |||
== Написание .gear/rules == | == Написание .gear/rules == | ||
Строка 126: | Строка 140: | ||
* [[Краткое руководство по сборке пакета]] | * [[Краткое руководство по сборке пакета]] | ||
* | * [http://uneex.ru/LecturesCMC/PackageMaintaining2009/Video Лекции Георгия Курячего] на данную тему | ||
** [http://esyr.name/video/uneex/uneex_09_12_16.ogv "Демонстрация сборки пакета"] (видео, ogv) | |||
* [[О стратегии сборки RPM пакетов]] | |||
{{Category navigation|title=Сборка пакетов|category=Сборка пакетов|sortkey={{SUBPAGENAME}}}} |
Текущая версия от 22:42, 16 октября 2024
Данное руководство покажет, как правильно собрать пакет RPM в Sisyphus с нуля в инфраструктуре Gear и git.alt, имея только исходный код пакета, и права мейнтейнера на git.alt. В качестве примера опакетим KChildlock, чтобы закрыть запрос на сборку в багзилле: https://bugzilla.altlinux.org/25796.
Введение
Для сборки пакетов подразумеваются следующие начальные условия:
- У вас установлен дистрибутив ALT Linux;
- Есть желание собрать пакет правильно, а не для единичного случая;
- Вы носите гордое звание «мейнтейнер ALT Linux Team», что подразумевает наличие электронных ключей и доступа к инфраструктуре git.alt
Третий пункт необязателен для новичков, которые просто хотят собрать пакет правильно для себя.
В ALT Linux используется формат пакетов RPM, который представляет собой архив, содержащий архив с устанавливаемыми или собираемыми файлами и заголовок с метаинформацией (например, название, версия, группа и т.п.). Различают два вида пакетов RPM:
- Пакет с исходным кодом (имеет расширение .src.rpm). Такой пакет содержит архив (один или несколько) с исходным кодом, файл Spec (далее — просто спек) и, возможно, разнообразные патчи и дополнения. Пакет src.rpm можно использовать только для сборки двоичных пакетов, но не установки. Сборка осуществляется командой:
rpmbuild --rebuild package...src.rpm
- Собранный двоичный пакет (имеет расширение вида <архитектура>.rpm). В качестве архитектуры может быть i586, x86_64 или noarch. Такие пакеты можно устанавливать командой
rpm -Uvh package...rpm
Подробную информацию по структуре RPM и сборке с помощью команды rpm можно найти в Maximum RPM.
Однако для сборки через rpmbuild возникают очевидные сложности:
- Необходимо вручную удовлетворить сборочные зависимости для сборки (поставить компилятор, включаемые файлы, библиотеки). При большом количестве собираемых пакетов система засоряется.
- Для сборки пакета нужно сформировать .src.rpm из файлов, разбросанных по разным каталогам (по умолчанию, это подкаталоги SOURCE, SPECS и подкаталоги для сборки в ~/RPM).
- Файлы с исходным кодом должны лежать в упакованном виде, что делает трудоёмким процесс изготовления патчей.
- На рабочей системе можно упустить необходимое и достаточное количество зависимостей.
Чтобы избежать этих сложностей, в ALT Linux Team было придумано две технологии:
- Hasher для сборки в изолированном окружении. В chroot ставится базовый комплект пакетов и пакеты, необходимые для сборки (поле BuildRequires в спеке). Если какой-то пакет для сборки не указан в спеке, то появится ошибка. Так обеспечивается чистота сборки. Обратной стороной является необходимость иметь доступ к репозиторию, так как пакеты ставятся при каждой сборке в Hasher.
- Gear для сборки пакетов из репозитория Git. В этом случае все файлы лежат в распакованном виде и в src.rpm упаковываются по правилам, определённым в .gear/rules. Это позволяет работать сразу с содержимым, быстро делать патчи, вести историю изменений и обмениваться изменениями при коллективной разработке.
Установка пакетов для сборки
Для сборки нам потребуются следующие компоненты:
- Любой удобный текстовый редактор (наиболее удобными являются Vim и Emacs);
- Система управления версиями Git
- Сборочная среда Hasher
- Инфраструктура Gear
- Доступ к репозиторию пакетов
Для этого настройте репозитории и установите пакеты:
apt-get install rpm-build hasher gear
Будут установлены с зависимостями все необходимые пакеты для опакечивания и сборки.
Настройка среды
Окружение Git
Для идентификации Вашего ключа, Вашего имени, адреса электронной почты введите:
git config --global user.name 'Andrey Cherepanov' git config --global user.email 'cas@altlinux.org' git config --global user.signingkey 'A9EBF131'
или
gpg --gen-key
Измените в зависимости от ваших параметров. Третья команда задаёт идентификатор вашего GPG-ключа для подписи:
[cas@cas ~]$ gpg --list-keys | grep -B 1 'Andrey Cherepanov' pub 1024D/A9EBF131 2007-03-13 uid Andrey Cherepanov (ALT Linux Team) <cas@altlinux.ru>
или
[cas@cas ~]$ gpg --list-secret-keys ------------------------------ sec 1024D/A9EBF131 2007-03-13 uid Andrey Cherepanov (ALT Linux Team) <cas@altlinux.ru>
Окружение RPM
Создайте файл ~/.rpmmacros следующего содержания (конечно, заменив ключ и имя мейнтейнера на свои):
%packager Andrey Cherepanov <cas@altlinux.org> %_gpg_name A424A3962331FDD2748BC8B34863C0F4A9EBF131
В %_gpg_name указывается отпечаток ключа (а не краткий идентификатор, как для Git). Получить его можно командой:
[cas@cas ~]$ LANG=C gpg --fingerprint A9EBF131 | grep 'fingerprint =' | tr -d ' ' | cut -d= -f2 A424A3962331FDD2748BC8B34863C0F4A9EBF131
или
[cas@cas ~]$ gpg --fingerprint A9EBF131 | sed -n '/.*=/{s/.*=/%_gpg_name\t/;s/ //gp}' %_gpg_name A424A3962331FDD2748BC8B34863C0F4A9EBF131
Окружение Hasher
Для начала создайте под правами root двух служебных пользователей для сборочницы (среды сборки Hasher):
[cas@ham1 ~]$ su - Password: [root@ham1 ~]# hasher-useradd cas Adding user cas to group cas_a Adding user cas to group cas_b Adding user cas to group hashman
Вместо «cas» нужно указать существующего пользователя на машине, где будет развёрнута сборочная среда.
Далее для простейшей конфигурации Hasher потребуется создать каталог ~/.hasher со следующими файлами:
~/.hasher/config
USER=cas workdir="/tmp/.private/cas/" target=i586 packager="`rpm --eval %packager`" apt_config="$HOME/.hasher/apt.conf" mount=/dev/pts,/proc
Соответственно, USER должен быть такой же, как заведён в hasher-useradd, target — указывать на архитектуру собираемых пакетов.
Подготовка репозитория Git
Репозиторий Git создать очень просто. Для этого создадим каталог (имена пакетов лучше указывать в нижнем регистре, поэтому наш пакет для проекта будет называться kchildlock), перейдём в него и запустим git init:
mkdir kchildlock cd kchildlock git init .
Написание .gear/rules
Импорт исходного кода
Написание спека
Сборка в Hasher
Отправка в git.alt
Ссылки
- Краткое руководство по сборке пакета
- Лекции Георгия Курячего на данную тему
- "Демонстрация сборки пакета" (видео, ogv)
- О стратегии сборки RPM пакетов