Обсуждение участника:Nir: различия между версиями
Nir (обсуждение | вклад) м (Отмена правки 45803, сделанной Nir (обсуждение)) Метка: отмена |
м (беглая вычитка, ссылки, совсем уж заметные правки, убрал sudo (из коробки только в simply) и build-environment (не о том), s/source/pre/g (иначе "ошибки разметки")) |
||
Строка 1: | Строка 1: | ||
{{Stub}} | |||
== Руководство мейнтейнера ALT Linux == | == Руководство мейнтейнера ALT Linux == | ||
===Введение=== | ===Введение=== | ||
Данная статья предназначена для централизации всей информации о процессе работы над репозиторием [http:// | Данная статья предназначена для централизации всей информации о процессе работы над репозиторием [http://packages.altlinux.org/ru Sisyphus] и интеграции в сообщество ALT Linux Team. | ||
Для индивида может существовать множество причин стать участником сообщества: | Для индивида может существовать множество причин стать участником сообщества: | ||
* | * желание внести свой вклад в развитие открытого ПО и сделать мир лучше; | ||
* | * желание "отполировать резюме" и показать рекрутёрам свои навыки; | ||
* | * желание решить вполне себе практическую проблему - например, воспользоваться конкретной программой; | ||
* | * необходимость решения проблем эксплуатации дистрибутива в коммерческой или государственной структуре. | ||
__TOC__ | __TOC__ | ||
Строка 18: | Строка 19: | ||
'''Мейнтейнер''' (дистрибутива или пакета) - это человек, который занимается тем, что интегрирует ПО в дистрибутив и сопровождает его впоследствии. То есть делает пакет для установки программы из централизованного репозитория, чинит обнаруженные в программе баги, общается с разработчиками программы, старается реагировать на нужды пользователей (багрепорты, вопросы). | '''Мейнтейнер''' (дистрибутива или пакета) - это человек, который занимается тем, что интегрирует ПО в дистрибутив и сопровождает его впоследствии. То есть делает пакет для установки программы из централизованного репозитория, чинит обнаруженные в программе баги, общается с разработчиками программы, старается реагировать на нужды пользователей (багрепорты, вопросы). | ||
В понимании '''ALT Linux''' - мейнтейнер должен быть членом '''ALT Linux Team''' (Команды ALT Linux). | В понимании проекта '''ALT Linux''' - мейнтейнер должен быть членом '''ALT Linux Team''' (Команды ALT Linux). | ||
===Что такое ALT Linux Team=== | ===Что такое ALT Linux Team=== | ||
'''ALT Linux Team''' - распределённая и независимая команда энтузиастов, которые совместно работают над поддержкой наборов программ в репозитории [ | '''[[ALT Linux Team]]''' - распределённая и независимая команда энтузиастов, которые совместно работают над поддержкой наборов программ в репозитории [[Sisyphus]] и собирают дистрибутивы на основе этого репозитория. | ||
===Как стать членом ALT Linux Team=== | ===Как стать членом ALT Linux Team=== | ||
Существует процедура принятия в '''ALT Linux Team''', | Существует процедура принятия в '''ALT Linux Team''', описанная на странице '''[[Join]]''' (присоединение). Обычно, этот процесс происходит естественно, когда человек активно участвует в работе сообщества: | ||
* | * тестирует ПО и заводит багрепорты о найденных багах; | ||
* | * помогает чинить баги - присылает патчи; | ||
* | * пакетирует новое ПО или помогает поддерживать существующие пакеты. | ||
Взаимодействие членов команды осуществляется с помощью разнообразных средств связи (сложилось исторически): | Взаимодействие членов команды осуществляется с помощью разнообразных средств связи (сложилось исторически): | ||
Строка 37: | Строка 38: | ||
* [http://bugzilla.altlinux.org bugzilla.altlinux.org] - багтрекер проекта; | * [http://bugzilla.altlinux.org bugzilla.altlinux.org] - багтрекер проекта; | ||
* [http://lists.altlinux.org lists.altlinux.org] - списки рассылки проекта; | * [http://lists.altlinux.org lists.altlinux.org] - списки рассылки проекта; | ||
* [http://forum.altlinux.org forum.altlinux.org] - форум сообщества. | |||
* [irc://irc.freenode.net/altlinux #altlinux] и [irc://irc.freenode.net/altlinux-devel #altlinux-devel] - IRC каналы; | * [irc://irc.freenode.net/altlinux #altlinux] и [irc://irc.freenode.net/altlinux-devel #altlinux-devel] - IRC каналы; | ||
===Процедура Join=== | ===Процедура Join=== | ||
Строка 49: | Строка 50: | ||
К заявке надо приложить/указать: | К заявке надо приложить/указать: | ||
* ''' | * '''публичный''' ключ SSH - для доступа к ресурсам сборочницы; | ||
* ''' | * '''публичный''' GPG-ASCIIARMOR ключ для подписи коммитов; | ||
* | * указать никнейм ментора из команды; | ||
* | * указать желаемый почтовый адрес вида <nickname>@altlinux.org | ||
В качестве теста на членство в команде принимается работа в виде Gear-репозитория новой программы или возрождение выпавшей из сборок. | В качестве теста на членство в команде принимается работа в виде Gear-репозитория новой программы или возрождение выпавшей из сборок. | ||
Чтобы указать имя ментора (члена команды, который научит собирать и спопровождать пакеты) необходимо предварительно получить его согласие на менторинг. Оптимальный вариант - договориться об этом в личной переписке по e-mail. | Чтобы указать имя ментора (члена команды, который научит собирать и спопровождать пакеты), необходимо предварительно получить его согласие на менторинг. Оптимальный вариант - договориться об этом в личной переписке по e-mail. | ||
Актуальный список менторов: | Актуальный список менторов (вечно перегружены и плохо пингуются, при возможности лучше найти "своего"): | ||
* sin@ | * sin@ | ||
Строка 68: | Строка 69: | ||
[[File:Alt-hasher-architecture.png|frame|Архитектура средств управления пакетами]] | [[File:Alt-hasher-architecture.png|frame|Архитектура средств управления пакетами]] | ||
Экосистема '''ALT Linux''' обладает многими уникальными наработками и своей интересной историей и архитектурой. | Экосистема '''ALT Linux''' обладает многими уникальными [[features|наработками]] и своей интересной [[history|историей]] и архитектурой. | ||
====Введение в Gear-репозитории==== | ====Введение в Gear-репозитории==== | ||
'''Gear-репозиторий''' представляет собой репозиторий '''Git DVCS''', содержаший '''RPM | '''[[Gear]]-репозиторий''' представляет собой репозиторий '''[[Git]] DVCS''', содержаший '''RPM [[spec]]file''' и специальную директорию '''.gear''' с инструкциями по сборке пакета для RPM. Практически всегда (но это не является неприкосновенным правилом) в репозитории также хранится и код программы. | ||
К сожалению, '''Gear''', как и '''Git''' - очень сложный и гибкий инструмент вида '''всё наружу'''. Есть много вариантов хранения программ в ''' | К сожалению, '''Gear''', как и '''Git''' - очень сложный и гибкий инструмент вида '''всё наружу'''. Есть много вариантов хранения программ в '''gear repo''', которые могут создать проблемы начинающему мейнтейнеру или заставить поломать голову опытного. Не существует однообразного рецепта работы с '''gear repo''', так что не стесняйтесь посоветоваться с участниками сообщества по тем или иным вопросам (также специально создана рассылка [https://lists.altlinux.org/mailman/listinfo/devel-newbies devel-newbies@]). | ||
Есть некоторые общие рекомендации, которых можно придерживаться: | Есть некоторые общие рекомендации, которых можно придерживаться: | ||
* | * хранить код программы с редкими исправлениями удобно в ветке '''master''' - там же, где находятся '''specfile''' и директория '''.gear'''; | ||
* | * хранить код программы отдельно, в ветке '''upstream''', удобно, когда в программу вносится много изменений и история правок '''specfile''' или правил '''Gear''' мешает следить за ходом работы. | ||
====Нюансы сборки пакетов==== | ====Нюансы сборки пакетов==== | ||
* При жалобах на зашитый в ПО '''RPATH''' удаляйте его при сборке с помощью программы '''chrpath'''. Раньше использование '''RPATH''' было очень популярно (особенно в системе сборки automake/libtool), но потом мейнтейнеры пришли к выводу, что это мешает искать библиотеки в стандартных путях. Потому, не оставляйте '''RPATH''' без особой необходимости. | * При жалобах на зашитый в ПО '''RPATH''' [[ProblemWithVerifyELFAndRPATH|на крайний случай]] удаляйте его при сборке с помощью программы '''chrpath'''. Раньше использование '''RPATH''' было очень популярно (особенно в системе сборки automake/libtool), но потом мейнтейнеры пришли к выводу, что это мешает искать библиотеки в стандартных путях. Потому, не оставляйте '''RPATH''' без особой необходимости. | ||
* Если у программы есть плагины, документация, заголовочные файлы - разместите их в отдельных | * Если у программы есть плагины (особенно с развесистыми или взаимно противоречащими зависимостями), документация, заголовочные файлы библиотек - разместите их в отдельных подпакетах. | ||
* Если у программы есть жёсткие опциональные зависимости (например, варианты зависимости от '''MySQL/MariaDB''' и от '''PostgreSQL''') - соберите программу в нескольких вариантах, чтобы позволить пользователям не тянуть лишние зависимости, когда они не нужны. | * Если у программы есть жёсткие опциональные зависимости (например, варианты зависимости от '''MySQL/MariaDB''' и от '''PostgreSQL''') - соберите программу в нескольких вариантах, чтобы позволить пользователям не тянуть лишние зависимости, когда они не нужны. | ||
* Если пользователям могут одновременно понадобиться обе версии программы - старая и новая - соберите два пакета с разными именами. Также обдумайте интеграцию с системой '''Alternatives''' и вариант небольшого скрипта-обёртки при таком подходе. | * Если пользователям могут одновременно понадобиться обе версии программы - старая и новая - соберите два пакета с разными именами. Также обдумайте интеграцию с системой '''Alternatives''' и вариант небольшого скрипта-обёртки при таком подходе. | ||
* Если программа | * Если программа предоставляет сервер/сервис - удостоверьтесь в наличии предоставляемых файлов '''.service''' для '''systemd''' и инитскрипта для '''sysvinit'''. | ||
* Политика дистрибутива такова, что не должно быть программ с '''suid-битом''' (как '''sudo'''). Существует много вариантов решения проблемы. В данном случае необходимо проконсультироваться с членами '''ALT Linux Team''' касательно разумного выхода из сложившейся ситуации. | * Политика дистрибутива такова, что не должно быть программ с '''suid-битом''' (как '''sudo''') "из коробки". Существует много вариантов решения проблемы, одним из которых является добавление поддержки [[control]](8). В данном случае необходимо проконсультироваться с членами '''ALT Linux Team''' касательно разумного выхода из сложившейся ситуации. | ||
* Если Вы импортировали '''RPM specfile''' из другого дистрибутива - оставьте прежний '''changelog''', а свои изменения дописывайте отдельно - это дань уважения авторам. | * Если Вы импортировали '''RPM specfile''' из другого дистрибутива - оставьте прежний '''changelog''', а свои изменения дописывайте отдельно - это дань уважения авторам. | ||
* При сборке ''' | * При сборке '''gear repo''' предлагается хранить исходный код отдельно от инструкций сборки в том случае, если проект активно развивается и необходимо видеть его "чистую" историю изменений в '''Git'''. В том случае, если проект неактивный, имеет много собственных специфичных патчей - предлагается хранить исходный код в одной ветке с правилами сборки. | ||
====Подготовка локального сборочного окружения==== | ====Подготовка локального сборочного окружения==== | ||
Строка 100: | Строка 101: | ||
Обновите систему, чтобы получить свежие версии пакетов программ: | Обновите систему, чтобы получить свежие версии пакетов программ: | ||
< | <pre> | ||
# apt-get update | |||
# apt-get dist-upgrade | |||
# reboot | |||
</ | </pre> | ||
и после перезагрузки установите следующие пакеты: | и после перезагрузки установите следующие пакеты: | ||
< | <pre> | ||
# apt-get install git \ | |||
gear \ | gear \ | ||
hasher \ | hasher \ | ||
Строка 115: | Строка 116: | ||
hasher-rich-chroot \ | hasher-rich-chroot \ | ||
hasher-rich-chroot-user-utils \ | hasher-rich-chroot-user-utils \ | ||
rpm-utils \ | rpm-utils \ | ||
rpm-build \ | rpm-build \ | ||
Строка 124: | Строка 124: | ||
apt-repo \ | apt-repo \ | ||
apt-repo-tools | apt-repo-tools | ||
</ | </pre> | ||
=====Настройка пользователя===== | =====Настройка пользователя===== | ||
Строка 130: | Строка 130: | ||
Добавьте пользователя в группу <code>rpm</code>, чтобы Hasher не выкачивал пакеты для chroot каждый раз заново: | Добавьте пользователя в группу <code>rpm</code>, чтобы Hasher не выкачивал пакеты для chroot каждый раз заново: | ||
< | <pre> | ||
# usermod -aG rpm <user> | |||
</ | </pre> | ||
=====Настройка Git===== | =====Настройка Git===== | ||
Строка 138: | Строка 138: | ||
Начальная настройка Git выполняется двумя командами: | Начальная настройка Git выполняется двумя командами: | ||
< | <pre> | ||
git config --global user.name "Vasiliy Petrov" | $ git config --global user.name "Vasiliy Petrov" | ||
git config --global user.email "vasip@altlinux.org" | $ git config --global user.email "vasip@altlinux.org" | ||
</ | </pre> | ||
Строка 148: | Строка 148: | ||
Добавьте в файл '''~/.rpmmacros''' следующие строки, совпадающие с конфигурацией '''GPG2''' и '''Git''': | Добавьте в файл '''~/.rpmmacros''' следующие строки, совпадающие с конфигурацией '''GPG2''' и '''Git''': | ||
< | <pre> | ||
%packager Vasiliy Petrov <vasip@altlinux.org> | %packager Vasiliy Petrov <vasip@altlinux.org> | ||
%_gpg_name vasip@altlinux.org | %_gpg_name vasip@altlinux.org | ||
Строка 154: | Строка 154: | ||
# Завершать сборку с ошибкой, если обнаружились незапакованные файлы | # Завершать сборку с ошибкой, если обнаружились незапакованные файлы | ||
%define _unpackaged_files_terminate_build 1 | %define _unpackaged_files_terminate_build 1 | ||
</ | </pre> | ||
Строка 161: | Строка 161: | ||
'''Hasher''' использует двух пользователей внутри своего изолированного окружения, чтобы предотвратить атаки на хост-систему из пакетов. Нам необходимо сконфигурировать этих пользователей для аккаунта, от имени которого будет производиться процесс сборки пакетов. Сделать это можно следующей командой: | '''Hasher''' использует двух пользователей внутри своего изолированного окружения, чтобы предотвратить атаки на хост-систему из пакетов. Нам необходимо сконфигурировать этих пользователей для аккаунта, от имени которого будет производиться процесс сборки пакетов. Сделать это можно следующей командой: | ||
< | <pre> | ||
# hasher-useradd <user> | |||
</ | </pre> | ||
Где <user> - имя пользователя. Для того, чтобы изменения к пользователю (попадание в две вспомогательных группы '''hasher''') вступили в силу необходимо выйти из аккаунта и зайти снова. | Где <user> - имя пользователя. Для того, чтобы изменения к пользователю (попадание в две вспомогательных группы '''hasher''') вступили в силу необходимо выйти из аккаунта и зайти снова. | ||
Строка 171: | Строка 171: | ||
Создайте директорию настроек '''Hasher''' и сборочную директорию с последующей их инициализацией: | Создайте директорию настроек '''Hasher''' и сборочную директорию с последующей их инициализацией: | ||
< | <pre> | ||
$ mkdir ~/hasher | $ mkdir ~/hasher | ||
$ mkdir ~/.hasher | $ mkdir ~/.hasher | ||
$ hsh --initroot-only ~/hasher | $ hsh --initroot-only ~/hasher | ||
</ | </pre> | ||
Для оптимизации производительности лучше сделать ~/hasher символической ссылкой на каталог в tmpfs (например, {{path|$TMP/hasher}} при типичных настройках дистрибутива "из коробки"): | |||
$ rmdir ~/hasher | |||
$ mkdir -p $TMP/hasher | |||
$ ln -sr $TMP/hasher ~/hasher | |||
Автоматизировать такой {{cmd|mkdir}} можно будет добавлением этой команды в {{path|~/.hasher/config}} (это конфигурационный файл в виде исполнимого скрипта). | |||
=====Настройка Hasher===== | =====Настройка Hasher===== | ||
Создайте файл `~/hasher/config` следующего содержания: | Создайте файл `~/.hasher/config` примерно следующего содержания: | ||
packager="`rpm --eval %packager`" | |||
no_sisyphus_check="packager,buildhost,gpg" | |||
packager="`rpm --eval %packager`" | apt_config="$HOME/.hasher/apt.conf | ||
no_sisyphus_check="packager,buildhost,gpg" | allowed_mountpoints=/dev/pts,/proc | ||
apt_config="$HOME/.hasher/apt.conf | #mkdir -p $TMP/hasher | ||
#lazy_cleanup=1 | |||
для завершения процесса настройки. | для завершения процесса настройки. | ||
Строка 197: | Строка 204: | ||
Сначала создайте директорию проекта и инициализируйте её: | Сначала создайте директорию проекта и инициализируйте её: | ||
< | <pre> | ||
mkdir program | mkdir program | ||
cd program | cd program | ||
git init | git init | ||
</ | </pre> | ||
В директории проекта могут быть следующие файлы: | В директории проекта могут быть следующие файлы: | ||
Строка 208: | Строка 215: | ||
* '''.gear/tags/list''' - описание тегов для '''Gear'''. | * '''.gear/tags/list''' - описание тегов для '''Gear'''. | ||
Далее нам необходимо задать базовую структуру репозитория. Создаём директорию настроек ''' | Далее нам необходимо задать базовую структуру репозитория. Создаём директорию настроек '''gear repo''': | ||
< | <pre> | ||
mkdir -p .gear | mkdir -p .gear | ||
touch .gear/rules | touch .gear/rules | ||
</pre> | |||
</ | |||
Также нам необходимо создать файл с инструкциями сборки приложения: | Также нам необходимо создать файл с инструкциями сборки приложения: | ||
< | <pre> | ||
touch program.spec | touch program.spec | ||
</ | </pre> | ||
Для продолжения работы следует принять к сведению следующую информацию: | Для продолжения работы следует принять к сведению следующую информацию: | ||
Строка 226: | Строка 232: | ||
Gear производит сборку пакета из '''Git tag'''. В связи с тем, что на сборку отправляется конкретный тег - в его истории должен быть доступен как исходный код, так и правила сборки. Потому при хранении исходного кода в отдельной ветке необходимо производить операцию | Gear производит сборку пакета из '''Git tag'''. В связи с тем, что на сборку отправляется конкретный тег - в его истории должен быть доступен как исходный код, так и правила сборки. Потому при хранении исходного кода в отдельной ветке необходимо производить операцию | ||
< | <pre> | ||
merge -s ours <code_branch> | merge -s ours <code_branch> | ||
</ | </pre> | ||
в ветку с инструкциями сборки. Это позволит создать единую историю изменений из двух веток. | в ветку с инструкциями сборки. Это позволит создать единую историю изменений из двух веток. | ||
Строка 235: | Строка 241: | ||
Файл <code>.gear/tags/list</code> содержит информацию о соответствии хэшей '''Git''' тегам '''Gear'''. | Файл <code>.gear/tags/list</code> содержит информацию о соответствии хэшей '''Git''' тегам '''Gear'''. | ||
Обычно создаётся командой {{cmd|gear-store-tags -avc}}, результаты работы которой следует добавить в репозиторий отдельным коммитом, например, так: {{cmd|git commit -m 'gear-store-tags' .gear/tags/}}. | |||
======Файл .gear/rules====== | ======Файл .gear/rules====== | ||
Строка 244: | Строка 252: | ||
Источниками существующих пакетов могут быть: | Источниками существующих пакетов могут быть: | ||
* | * [http://git.altlinux.org/gears/ gears] | ||
* | * [http://git.altlinux.org/srpms/ srpms] | ||
=====Процесс работы над Gears===== | =====Процесс работы над Gears===== | ||
Строка 253: | Строка 261: | ||
Копируем репозиторий себе: | Копируем репозиторий себе: | ||
ssh git.alt clone /gears/c/cfengine.git | |||
ssh git.alt clone /gears/c/cfengine.git | |||
Клонируем репозиторий на локальную машину для дальнейшей работы: | Клонируем репозиторий на локальную машину для дальнейшей работы: | ||
git clone git.alt:/people/''имя''/packages/cfengine.git | |||
git clone git.alt:/people/ | |||
'''...''' | |||
[[Категория:Сборка_пакетов]] |
Версия от 23:15, 24 ноября 2019
Руководство мейнтейнера ALT Linux
Введение
Данная статья предназначена для централизации всей информации о процессе работы над репозиторием Sisyphus и интеграции в сообщество ALT Linux Team.
Для индивида может существовать множество причин стать участником сообщества:
- желание внести свой вклад в развитие открытого ПО и сделать мир лучше;
- желание "отполировать резюме" и показать рекрутёрам свои навыки;
- желание решить вполне себе практическую проблему - например, воспользоваться конкретной программой;
- необходимость решения проблем эксплуатации дистрибутива в коммерческой или государственной структуре.
Кто такой мейнтейнер
Мейнтейнер (дистрибутива или пакета) - это человек, который занимается тем, что интегрирует ПО в дистрибутив и сопровождает его впоследствии. То есть делает пакет для установки программы из централизованного репозитория, чинит обнаруженные в программе баги, общается с разработчиками программы, старается реагировать на нужды пользователей (багрепорты, вопросы).
В понимании проекта ALT Linux - мейнтейнер должен быть членом ALT Linux Team (Команды ALT Linux).
Что такое ALT Linux Team
ALT Linux Team - распределённая и независимая команда энтузиастов, которые совместно работают над поддержкой наборов программ в репозитории Sisyphus и собирают дистрибутивы на основе этого репозитория.
Как стать членом ALT Linux Team
Существует процедура принятия в ALT Linux Team, описанная на странице Join (присоединение). Обычно, этот процесс происходит естественно, когда человек активно участвует в работе сообщества:
- тестирует ПО и заводит багрепорты о найденных багах;
- помогает чинить баги - присылает патчи;
- пакетирует новое ПО или помогает поддерживать существующие пакеты.
Взаимодействие членов команды осуществляется с помощью разнообразных средств связи (сложилось исторически):
- Sisyphus - репозиторий ПО;
- bugzilla.altlinux.org - багтрекер проекта;
- lists.altlinux.org - списки рассылки проекта;
- forum.altlinux.org - форум сообщества.
- #altlinux и #altlinux-devel - IRC каналы;
Процедура Join
Формально, Join выглядит как создание бага на ALT Linux Bugzilla в разделе Development, с параметрами:
- Product == Team Accounts
- Component == Join
К заявке надо приложить/указать:
- публичный ключ SSH - для доступа к ресурсам сборочницы;
- публичный GPG-ASCIIARMOR ключ для подписи коммитов;
- указать никнейм ментора из команды;
- указать желаемый почтовый адрес вида <nickname>@altlinux.org
В качестве теста на членство в команде принимается работа в виде Gear-репозитория новой программы или возрождение выпавшей из сборок.
Чтобы указать имя ментора (члена команды, который научит собирать и спопровождать пакеты), необходимо предварительно получить его согласие на менторинг. Оптимальный вариант - договориться об этом в личной переписке по e-mail.
Актуальный список менторов (вечно перегружены и плохо пингуются, при возможности лучше найти "своего"):
- sin@
- mike@
- iv@ - только оффлайн менторинг
Работа с пакетной базой
Экосистема ALT Linux обладает многими уникальными наработками и своей интересной историей и архитектурой.
Введение в Gear-репозитории
Gear-репозиторий представляет собой репозиторий Git DVCS, содержаший RPM specfile и специальную директорию .gear с инструкциями по сборке пакета для RPM. Практически всегда (но это не является неприкосновенным правилом) в репозитории также хранится и код программы.
К сожалению, Gear, как и Git - очень сложный и гибкий инструмент вида всё наружу. Есть много вариантов хранения программ в gear repo, которые могут создать проблемы начинающему мейнтейнеру или заставить поломать голову опытного. Не существует однообразного рецепта работы с gear repo, так что не стесняйтесь посоветоваться с участниками сообщества по тем или иным вопросам (также специально создана рассылка devel-newbies@).
Есть некоторые общие рекомендации, которых можно придерживаться:
- хранить код программы с редкими исправлениями удобно в ветке master - там же, где находятся specfile и директория .gear;
- хранить код программы отдельно, в ветке upstream, удобно, когда в программу вносится много изменений и история правок specfile или правил Gear мешает следить за ходом работы.
Нюансы сборки пакетов
- При жалобах на зашитый в ПО RPATH на крайний случай удаляйте его при сборке с помощью программы chrpath. Раньше использование RPATH было очень популярно (особенно в системе сборки automake/libtool), но потом мейнтейнеры пришли к выводу, что это мешает искать библиотеки в стандартных путях. Потому, не оставляйте RPATH без особой необходимости.
- Если у программы есть плагины (особенно с развесистыми или взаимно противоречащими зависимостями), документация, заголовочные файлы библиотек - разместите их в отдельных подпакетах.
- Если у программы есть жёсткие опциональные зависимости (например, варианты зависимости от MySQL/MariaDB и от PostgreSQL) - соберите программу в нескольких вариантах, чтобы позволить пользователям не тянуть лишние зависимости, когда они не нужны.
- Если пользователям могут одновременно понадобиться обе версии программы - старая и новая - соберите два пакета с разными именами. Также обдумайте интеграцию с системой Alternatives и вариант небольшого скрипта-обёртки при таком подходе.
- Если программа предоставляет сервер/сервис - удостоверьтесь в наличии предоставляемых файлов .service для systemd и инитскрипта для sysvinit.
- Политика дистрибутива такова, что не должно быть программ с suid-битом (как sudo) "из коробки". Существует много вариантов решения проблемы, одним из которых является добавление поддержки control(8). В данном случае необходимо проконсультироваться с членами ALT Linux Team касательно разумного выхода из сложившейся ситуации.
- Если Вы импортировали RPM specfile из другого дистрибутива - оставьте прежний changelog, а свои изменения дописывайте отдельно - это дань уважения авторам.
- При сборке gear repo предлагается хранить исходный код отдельно от инструкций сборки в том случае, если проект активно развивается и необходимо видеть его "чистую" историю изменений в Git. В том случае, если проект неактивный, имеет много собственных специфичных патчей - предлагается хранить исходный код в одной ветке с правилами сборки.
Подготовка локального сборочного окружения
Установка пакетов для разработки
Для разработки пакетов нам необходим сборочный тулчейн - rpm, hasher, gear и вспомогательные программы.
Обновите систему, чтобы получить свежие версии пакетов программ:
# apt-get update # apt-get dist-upgrade # reboot
и после перезагрузки установите следующие пакеты:
# apt-get install git \ gear \ hasher \ hasher-priv \ hasher-rich-chroot \ hasher-rich-chroot-user-utils \ rpm-utils \ rpm-build \ rpm-build-licenses \ rpm-macros-cmake \ rpm-macros-make \ rpm-macros-generic-compat \ apt-repo \ apt-repo-tools
Настройка пользователя
Добавьте пользователя в группу rpm
, чтобы Hasher не выкачивал пакеты для chroot каждый раз заново:
# usermod -aG rpm <user>
Настройка Git
Начальная настройка Git выполняется двумя командами:
$ git config --global user.name "Vasiliy Petrov" $ git config --global user.email "vasip@altlinux.org"
Настройка RPM
Добавьте в файл ~/.rpmmacros следующие строки, совпадающие с конфигурацией GPG2 и Git:
%packager Vasiliy Petrov <vasip@altlinux.org> %_gpg_name vasip@altlinux.org # Завершать сборку с ошибкой, если обнаружились незапакованные файлы %define _unpackaged_files_terminate_build 1
Создание пользователей Hasher
Hasher использует двух пользователей внутри своего изолированного окружения, чтобы предотвратить атаки на хост-систему из пакетов. Нам необходимо сконфигурировать этих пользователей для аккаунта, от имени которого будет производиться процесс сборки пакетов. Сделать это можно следующей командой:
# hasher-useradd <user>
Где <user> - имя пользователя. Для того, чтобы изменения к пользователю (попадание в две вспомогательных группы hasher) вступили в силу необходимо выйти из аккаунта и зайти снова.
Инициализация Hasher
Создайте директорию настроек Hasher и сборочную директорию с последующей их инициализацией:
$ mkdir ~/hasher $ mkdir ~/.hasher $ hsh --initroot-only ~/hasher
Для оптимизации производительности лучше сделать ~/hasher символической ссылкой на каталог в tmpfs (например, $TMP/hasher при типичных настройках дистрибутива "из коробки"):
$ rmdir ~/hasher $ mkdir -p $TMP/hasher $ ln -sr $TMP/hasher ~/hasher
Автоматизировать такой mkdir можно будет добавлением этой команды в ~/.hasher/config (это конфигурационный файл в виде исполнимого скрипта).
Настройка Hasher
Создайте файл `~/.hasher/config` примерно следующего содержания:
packager="`rpm --eval %packager`" no_sisyphus_check="packager,buildhost,gpg" apt_config="$HOME/.hasher/apt.conf allowed_mountpoints=/dev/pts,/proc #mkdir -p $TMP/hasher #lazy_cleanup=1
для завершения процесса настройки.
Создание Gear-репозитория из исходных кодов
Мы будем создавать Gear-репозиторий с хранением кода в отдельной ветви - upstream и несколькими зависимыми пакетами (документация, плагины).
Сначала создайте директорию проекта и инициализируйте её:
mkdir program cd program git init
В директории проекта могут быть следующие файлы:
- .gear/rules - файл "правил", согласно которым формируется архив для последущей сборки в Hasher;
- .gear/tags/list - описание тегов для Gear.
Далее нам необходимо задать базовую структуру репозитория. Создаём директорию настроек gear repo:
mkdir -p .gear touch .gear/rules
Также нам необходимо создать файл с инструкциями сборки приложения:
touch program.spec
Для продолжения работы следует принять к сведению следующую информацию:
Gear производит сборку пакета из Git tag. В связи с тем, что на сборку отправляется конкретный тег - в его истории должен быть доступен как исходный код, так и правила сборки. Потому при хранении исходного кода в отдельной ветке необходимо производить операцию
merge -s ours <code_branch>
в ветку с инструкциями сборки. Это позволит создать единую историю изменений из двух веток.
Файл .gear/tags/list
Файл .gear/tags/list
содержит информацию о соответствии хэшей Git тегам Gear.
Обычно создаётся командой gear-store-tags -avc, результаты работы которой следует добавить в репозиторий отдельным коммитом, например, так: git commit -m 'gear-store-tags' .gear/tags/.
Файл .gear/rules
Файл .gear/rules
содержит инструкции по упаковке исходного кода и патчей в архив, из которого будет производиться сборка RPM.
Доработка существующего пакета
Источниками существующих пакетов могут быть:
Процесс работы над Gears
Первоначально необходимо сделать персональную копию репозитория (форк, в терминологии GitHub), над которой и вести дальнейшую работу. Далее будет рассмотрена работа над CFEngine 3 в качестве примера.
Копируем репозиторий себе:
ssh git.alt clone /gears/c/cfengine.git
Клонируем репозиторий на локальную машину для дальнейшей работы:
git clone git.alt:/people/имя/packages/cfengine.git
...