Обсуждение участника:Nir: различия между версиями

Материал из ALT Linux Wiki
м (Отмена правки 45803, сделанной Nir (обсуждение))
Метка: отмена
м (беглая вычитка, ссылки, совсем уж заметные правки, убрал sudo (из коробки только в simply) и build-environment (не о том), s/source/pre/g (иначе "ошибки разметки"))
Строка 1: Строка 1:
{{Stub}}
== Руководство мейнтейнера ALT Linux ==
== Руководство мейнтейнера ALT Linux ==


===Введение===
===Введение===


Данная статья предназначена для централизации всей информации о процессе работы над репозиторием [http://sisyphus.ru Sisyphus] и интеграции в сообщество ALT Linux (Team).
Данная статья предназначена для централизации всей информации о процессе работы над репозиторием [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''' - распределённая и независимая команда энтузиастов, которые совместно работают над поддержкой наборов программ в репозитории [http://sisyphus.ru Sisyphus] и собирают дистрибутивы на основе этого репозитория.
'''[[ALT Linux Team]]''' - распределённая и независимая команда энтузиастов, которые совместно работают над поддержкой наборов программ в репозитории [[Sisyphus]] и собирают дистрибутивы на основе этого репозитория.


===Как стать членом ALT Linux Team===
===Как стать членом ALT Linux Team===


Существует процедура принятия в '''ALT Linux Team''', которая называется '''Join''' (присоединение). Обычно, этот процесс происходит естественно, когда человек активно участвует в работе сообщества:
Существует процедура принятия в '''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 каналы;
* [http://forum.altlinux.org forum.altlinux.org] - форум сообщества.


===Процедура Join===
===Процедура Join===
Строка 49: Строка 50:
К заявке надо приложить/указать:
К заявке надо приложить/указать:


* '''Публичный''' ключ SSH - для доступа к ресурсам сборочницы;
* '''публичный''' ключ SSH - для доступа к ресурсам сборочницы;
* '''Публичный''' GPG-ASCIIARMOR ключ для подписи коммитов;
* '''публичный''' GPG-ASCIIARMOR ключ для подписи коммитов;
* Указать никнейм ментора из команды;
* указать никнейм ментора из команды;
* Указать желаемый почтовый адрес вида <nickname>@altlinux.org
* указать желаемый почтовый адрес вида <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 specfile''' и специальную директорию '''.gear''' с инструкциями по сборке пакета для RPM. Практически всегда (но это не является неприкосновенным правилом) в репозитории также хранится и код программы.
'''[[Gear]]-репозиторий''' представляет собой репозиторий '''[[Git]] DVCS''', содержаший '''RPM [[spec]]file''' и специальную директорию '''.gear''' с инструкциями по сборке пакета для RPM. Практически всегда (но это не является неприкосновенным правилом) в репозитории также хранится и код программы.


К сожалению, '''Gear''', как и '''Git''' - очень сложный и гибкий инструмент вида '''всё наружу'''. Есть много вариантов хранения программ в '''gearrepo''', которые могут создать проблемы начинающему меёнтейнеру или заставить поломать голову опытного. Не существует однообразного рецепта работы с '''gearrepo''', так что не стесняйтесь посоветоваться с участниками сообщества по тем или иным вопросам.
К сожалению, '''Gear''', как и '''Git''' - очень сложный и гибкий инструмент вида '''всё наружу'''. Есть много вариантов хранения программ в '''gear repo''', которые могут создать проблемы начинающему мейнтейнеру или заставить поломать голову опытного. Не существует однообразного рецепта работы с '''gear repo''', так что не стесняйтесь посоветоваться с участниками сообщества по тем или иным вопросам (также специально создана рассылка [https://lists.altlinux.org/mailman/listinfo/devel-newbies devel-newbies@]).


Есть некоторые общие рекомендации, которых можно придерживаться:
Есть некоторые общие рекомендации, которых можно придерживаться:


* Хранить код программы с редкими исправлениями удобно в ветке '''master''' - там же, где находятся '''specfile''' и директория '''.gear''';
* хранить код программы с редкими исправлениями удобно в ветке '''master''' - там же, где находятся '''specfile''' и директория '''.gear''';
* Хранить код программы отдельно, в ветке '''upstream''', удобно, когда в программу вносится много изменений и история правок '''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'''.
* Если программа предоставляет сервер/сервис - удостоверьтесь в наличии предоставляемых файлов '''.service''' для '''systemd''' и инитскрипта для '''sysvinit'''.
* Политика дистрибутива такова, что не должно быть программ с '''suid-битом''' (как '''sudo'''). Существует много вариантов решения проблемы. В данном случае необходимо проконсультироваться с членами '''ALT Linux Team''' касательно разумного выхода из сложившейся ситуации.
* Политика дистрибутива такова, что не должно быть программ с '''suid-битом''' (как '''sudo''') "из коробки". Существует много вариантов решения проблемы, одним из которых является добавление поддержки [[control]](8). В данном случае необходимо проконсультироваться с членами '''ALT Linux Team''' касательно разумного выхода из сложившейся ситуации.
* Если Вы импортировали '''RPM specfile''' из другого дистрибутива - оставьте прежний '''changelog''', а свои изменения дописывайте отдельно - это дань уважения авторам.
* Если Вы импортировали '''RPM specfile''' из другого дистрибутива - оставьте прежний '''changelog''', а свои изменения дописывайте отдельно - это дань уважения авторам.
* При сборке '''gearrepo''' предлагается хранить исходный код отдельно от инструкций сборки в том случае, если проект активно развивается и необходимо видеть его "чистую" историю изменений в '''Git'''. В том случае, если проект неактивный, имеет много собственных специфичных патчей - предлагается хранить исходный код в одной ветке с правилами сборки.
* При сборке '''gear repo''' предлагается хранить исходный код отдельно от инструкций сборки в том случае, если проект активно развивается и необходимо видеть его "чистую" историю изменений в '''Git'''. В том случае, если проект неактивный, имеет много собственных специфичных патчей - предлагается хранить исходный код в одной ветке с правилами сборки.


====Подготовка локального сборочного окружения====
====Подготовка локального сборочного окружения====
Строка 100: Строка 101:
Обновите систему, чтобы получить свежие версии пакетов программ:
Обновите систему, чтобы получить свежие версии пакетов программ:


<source>
<pre>
$ sudo apt-get update
# apt-get update
$ sudo apt-get upgrade
# apt-get dist-upgrade
$ sudo shutdown -r now
# reboot
</source>
</pre>


и после перезагрузки установите следующие пакеты:
и после перезагрузки установите следующие пакеты:


<source>
<pre>
$ sudo apt-get install git \
# 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 \
build-environment \
rpm-utils \
rpm-utils \
rpm-build \
rpm-build \
Строка 124: Строка 124:
apt-repo \
apt-repo \
apt-repo-tools
apt-repo-tools
</source>
</pre>


=====Настройка пользователя=====
=====Настройка пользователя=====
Строка 130: Строка 130:
Добавьте пользователя в группу <code>rpm</code>, чтобы Hasher не выкачивал пакеты для chroot каждый раз заново:
Добавьте пользователя в группу <code>rpm</code>, чтобы Hasher не выкачивал пакеты для chroot каждый раз заново:


<source>
<pre>
sudo usermod -aG rpm <user>
# usermod -aG rpm <user>
</source>
</pre>


=====Настройка Git=====
=====Настройка Git=====
Строка 138: Строка 138:
Начальная настройка Git выполняется двумя командами:
Начальная настройка Git выполняется двумя командами:


<source>
<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"
</source>
</pre>




Строка 148: Строка 148:
Добавьте в файл '''~/.rpmmacros''' следующие строки, совпадающие с конфигурацией '''GPG2''' и '''Git''':
Добавьте в файл '''~/.rpmmacros''' следующие строки, совпадающие с конфигурацией '''GPG2''' и '''Git''':


<source>
<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
</source>
</pre>




Строка 161: Строка 161:
'''Hasher''' использует двух пользователей внутри своего изолированного окружения, чтобы предотвратить атаки на хост-систему из пакетов. Нам необходимо сконфигурировать этих пользователей для аккаунта, от имени которого будет производиться процесс сборки пакетов. Сделать это можно следующей командой:
'''Hasher''' использует двух пользователей внутри своего изолированного окружения, чтобы предотвратить атаки на хост-систему из пакетов. Нам необходимо сконфигурировать этих пользователей для аккаунта, от имени которого будет производиться процесс сборки пакетов. Сделать это можно следующей командой:


<source>
<pre>
sudo /usr/sbin/hasher-useradd <user>
# hasher-useradd <user>
</source>
</pre>


Где <user> - имя пользователя. Для того, чтобы изменения к пользователю (попадание в две вспомогательных группы '''hasher''') вступили в силу необходимо выйти из аккаунта и зайти снова.
Где <user> - имя пользователя. Для того, чтобы изменения к пользователю (попадание в две вспомогательных группы '''hasher''') вступили в силу необходимо выйти из аккаунта и зайти снова.
Строка 171: Строка 171:
Создайте директорию настроек '''Hasher''' и сборочную директорию с последующей их инициализацией:
Создайте директорию настроек '''Hasher''' и сборочную директорию с последующей их инициализацией:


<source>
<pre>
$ mkdir ~/hasher
$ mkdir ~/hasher
$ mkdir ~/.hasher
$ mkdir ~/.hasher
$ hsh --initroot-only ~/hasher
$ hsh --initroot-only ~/hasher
</source>
</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` примерно следующего содержания:


<source>
packager="`rpm --eval %packager`"
USER=vasip
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
mount=/dev/pts,/proc
#lazy_cleanup=1
</source>


для завершения процесса настройки.
для завершения процесса настройки.
Строка 197: Строка 204:
Сначала создайте директорию проекта и инициализируйте её:
Сначала создайте директорию проекта и инициализируйте её:


<source>
<pre>
mkdir program
mkdir program
cd program
cd program
git init
git init
</source>
</pre>


В директории проекта могут быть следующие файлы:
В директории проекта могут быть следующие файлы:
Строка 208: Строка 215:
* '''.gear/tags/list''' - описание тегов для '''Gear'''.
* '''.gear/tags/list''' - описание тегов для '''Gear'''.


Далее нам необходимо задать базовую структуру репозитория. Создаём директорию настроек '''gearrepo''':
Далее нам необходимо задать базовую структуру репозитория. Создаём директорию настроек '''gear repo''':


<source>
<pre>
mkdir -p .gear/tags
mkdir -p .gear
touch .gear/rules
touch .gear/rules
touch .gear/tags/list
</pre>
</source>


Также нам необходимо создать файл с инструкциями сборки приложения:
Также нам необходимо создать файл с инструкциями сборки приложения:


<source>
<pre>
touch program.spec
touch program.spec
</source>
</pre>


Для продолжения работы следует принять к сведению следующую информацию:
Для продолжения работы следует принять к сведению следующую информацию:
Строка 226: Строка 232:
Gear производит сборку пакета из '''Git tag'''. В связи с тем, что на сборку отправляется конкретный тег - в его истории должен быть доступен как исходный код, так и правила сборки. Потому при хранении исходного кода в отдельной ветке необходимо производить операцию
Gear производит сборку пакета из '''Git tag'''. В связи с тем, что на сборку отправляется конкретный тег - в его истории должен быть доступен как исходный код, так и правила сборки. Потому при хранении исходного кода в отдельной ветке необходимо производить операцию


<source>
<pre>
merge -s ours <code_branch>
merge -s ours <code_branch>
</source>
</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:
Источниками существующих пакетов могут быть:
Источниками существующих пакетов могут быть:


* GEARS
* [http://git.altlinux.org/gears/ gears]
* SRPMS
* [http://git.altlinux.org/srpms/ srpms]


=====Процесс работы над Gears=====
=====Процесс работы над Gears=====
Строка 253: Строка 261:
Копируем репозиторий себе:
Копируем репозиторий себе:


<source>
ssh git.alt clone /gears/c/cfengine.git
ssh git.alt clone /gears/c/cfengine.git
</source>


Клонируем репозиторий на локальную машину для дальнейшей работы:
Клонируем репозиторий на локальную машину для дальнейшей работы:


<source>
git clone git.alt:/people/''имя''/packages/cfengine.git
git clone git.alt:/people/vasip/packages/cfengine.git
 
</source>
'''...'''
 
[[Категория:Сборка_пакетов]]

Версия от 20:15, 24 ноября 2019

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Руководство мейнтейнера 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 (присоединение). Обычно, этот процесс происходит естественно, когда человек активно участвует в работе сообщества:

  • тестирует ПО и заводит багрепорты о найденных багах;
  • помогает чинить баги - присылает патчи;
  • пакетирует новое ПО или помогает поддерживать существующие пакеты.

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

Процедура 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

...