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

Материал из ALT Linux Wiki
Нет описания правки
(не показаны 44 промежуточные версии 3 участников)
Строка 1: Строка 1:
{{Stub}}
== Руководство мейнтейнера ALT Linux ==
===Введение===
Данная статья предназначена для централизации всей информации о процессе работы над репозиторием [http://packages.altlinux.org/ru Sisyphus] и интеграции в сообщество ALT Linux Team.
Для индивида может существовать множество причин стать участником сообщества:
* желание внести свой вклад в развитие открытого ПО и сделать мир лучше;
* желание "отполировать резюме" и показать рекрутёрам свои навыки;
* желание решить вполне себе практическую проблему - например, воспользоваться конкретной программой;
* необходимость решения проблем эксплуатации дистрибутива в коммерческой или государственной структуре.
__TOC__
__TOC__


==Введение в Active Directory File System==
===Кто такой мейнтейнер===
 
'''Мейнтейнер''' (дистрибутива или пакета) - это человек, который занимается тем, что интегрирует ПО в дистрибутив и сопровождает его впоследствии. То есть делает пакет для установки программы из централизованного репозитория, чинит обнаруженные в программе баги, общается с разработчиками программы, старается реагировать на нужды пользователей (багрепорты, вопросы).
 
В понимании проекта '''ALT Linux''' - мейнтейнер должен быть членом '''ALT Linux Team''' (Команды ALT Linux).
 
===Что такое ALT Linux Team===
 
'''[[ALT Linux Team]]''' - команда независимых разработчиков, которые совместно работают над поддержкой наборов программ в репозитории [[Sisyphus]] и собирают дистрибутивы на основе этого репозитория.
 
===Как стать членом ALT Linux Team===
 
Существует процедура принятия в '''ALT Linux Team''', описанная на странице '''[[Join]]''' (присоединение). Обычно, этот процесс происходит естественно, когда человек активно участвует в работе сообщества:
 
* тестирует ПО и заводит багрепорты о найденных багах;
* помогает чинить баги - присылает патчи;
* пакетирует новое ПО или помогает поддерживать существующие пакеты.
 
Взаимодействие членов команды осуществляется с помощью разнообразных средств связи (сложилось исторически):
 
* [http://sisyphus.ru Sisyphus] - репозиторий ПО;
* [http://bugzilla.altlinux.org bugzilla.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 каналы;
 
===Процедура Join===
 
Формально, '''Join''' выглядит как создание бага на [https://bugzilla.altlinux.org/ ALT Linux Bugzilla] в разделе '''Development''', с параметрами:
 
* '''Product''' == '''Team Accounts'''
* '''Component''' == '''Join'''
 
К заявке надо приложить/указать:
 
* '''публичный''' ключ SSH - для доступа к ресурсам сборочницы;
* '''публичный''' GPG-ASCIIARMOR ключ для подписи коммитов;
* указать никнейм ментора из команды;
* указать желаемый почтовый адрес вида <nickname>@altlinux.org
 
В качестве теста на членство в команде принимается работа в виде Gear-репозитория новой программы или возрождение выпавшей из сборок.
 
Чтобы указать имя ментора (члена команды, который научит собирать и спопровождать пакеты), необходимо предварительно получить его согласие на менторинг. Оптимальный вариант - договориться об этом в личной переписке по e-mail.
 
Актуальный список менторов (вечно перегружены и плохо пингуются, при возможности лучше найти "своего"):
 
* [[User:EvgenySinelnikov|sin@]]
* [[User:MichaelShigorin|mike@]]
* iv@ - только оффлайн менторинг
 
===Работа с пакетной базой===
 
[[File:Alt-hasher-architecture.png|frame|Архитектура средств управления пакетами]]
 
Экосистема '''ALT Linux''' обладает многими уникальными [[features|наработками]] и своей интересной [[history|историей]] и архитектурой.
 
====Введение в Gear-репозитории====
 
'''[[Gear]]-репозиторий''' представляет собой репозиторий '''[[Git]] DVCS''', содержаший '''RPM [[spec]]file''' и специальную директорию '''.gear''' с инструкциями по сборке пакета для RPM. Практически всегда (но это не является неприкосновенным правилом) в репозитории также хранится и код программы.
 
К сожалению, '''Gear''', как и '''Git''' - очень сложный и гибкий инструмент вида "'''всё наружу'''". Есть много вариантов хранения программ в '''gear repo''', которые могут создать проблемы начинающему мейнтейнеру или заставить поломать голову опытного. Не существует однообразного рецепта работы с '''gear repo''', так что не стесняйтесь посоветоваться с участниками сообщества по тем или иным вопросам (также специально создана рассылка [https://lists.altlinux.org/mailman/listinfo/devel-newbies devel-newbies@]).
 
Есть некоторые общие рекомендации, которых можно придерживаться:
 
* хранить код программы с редкими исправлениями удобно в ветке '''master''' - там же, где находятся '''specfile''' и директория '''.gear''';
* хранить код программы отдельно, в ветке '''upstream''', удобно, когда в программу вносится много изменений и история правок '''specfile''' или правил '''Gear''' мешает следить за ходом работы.
 
====Нюансы сборки пакетов====
 
* При жалобах на зашитый в ПО '''RPATH''' [[ProblemWithVerifyELFAndRPATH|на крайний случай]] удаляйте его при сборке с помощью программы '''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'''. В том случае, если проект неактивный, имеет много собственных специфичных патчей - предлагается хранить исходный код в одной ветке с правилами сборки.
* В случае сборки разделяемых библиотек и фреймворков необходимо поставлять '''.pc''' файлы <code>libtool</code> и файлы конфигурации '''.cmake''' для <code>CMake</code>. Также необходимо убедиться, что файлы конфигурации, будучи использованы соответствующими инструментами, позволят найти необходимые библиотеки и заголовочные файлы. Одним из оптимальных способов будет написание небольшого интеграционного теста, который будет запускаться после сборки пакета.
 
====Подготовка локального сборочного окружения====
 
=====Установка пакетов для разработки=====
 
Для разработки пакетов нам необходим сборочный тулчейн - '''rpm''', '''hasher''', '''gear''' и вспомогательные программы.
 
Обновите систему, чтобы получить свежие версии пакетов программ:
 
<pre>
# apt-get update
# apt-get dist-upgrade
# reboot
</pre>
 
и после перезагрузки установите следующие пакеты:
 
<pre>
# 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
</pre>
 
=====Настройка пользователя=====
 
Добавьте пользователя в группу <code>rpm</code>, чтобы Hasher не выкачивал пакеты для chroot каждый раз заново:
 
<pre>
# usermod -aG rpm <user>
</pre>
 
=====Настройка Git=====
 
Начальная настройка Git выполняется двумя командами:
 
<pre>
$ git config --global user.name "Vasiliy Petrov"
$ git config --global user.email "vasip@altlinux.org"
</pre>
 
 
=====Настройка RPM=====
 
Добавьте в файл '''~/.rpmmacros''' следующие строки, совпадающие с конфигурацией '''GPG2''' и '''Git''':
 
<pre>
%packager Vasiliy Petrov <vasip@altlinux.org>
%_gpg_name vasip@altlinux.org


Настройки '''Active Directory''' представляются деревьями '''LDAP'''. Данный подход сложен для человеческого восприятия. Существует утилита называемая '''hadfs''', которая представляет дерево объектов '''Active Directory''' в виде структуры файлов и каталогов. Таким образом становится возможным редактировать настройки контроллера домена простыми способами - в текстовом редакторе, с помощью скриптов или с помощью специализированного ПО.
# Завершать сборку с ошибкой, если обнаружились незапакованные файлы
%define _unpackaged_files_terminate_build 1
</pre>


==Сборка и установка==


===Сборка из исходного кода===
=====Создание пользователей Hasher=====


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


Данное ПО написано на языке программирования Haskell, потому вам понадобится компилятор (например, '''GHC''' - Glasgow Haskell Compiler) и, желательно, утилиты '''cabal-install''' или '''stack'''.
<pre>
# hasher-useradd <user>
</pre>


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


* '''git'''
=====Инициализация Hasher=====
* '''libfuse-devel'''
* '''libldap-devel'''
* '''libsasl2-devel'''
* '''libsasl2-plugin-gssapi'''
* '''ghc8.6.4'''
* '''ghc8.6.4-cabal-install'''


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


<source>
<pre>
sudo apt-get install git libfuse-devel libldap-devel libsasl2-devel libsasl2-plugin-gssapi ghc8.6.4 ghc8.6.4-cabal-install
$ mkdir ~/hasher
git clone https://github.com/altlinuxteam/hadfs.git
$ mkdir ~/.hasher
cd hadfs
$ hsh --initroot-only ~/hasher
git submodule update --init --recursive
</pre>
cabal update
cabal new-build
</source>


==Использование==
Для оптимизации производительности лучше сделать ~/hasher символической ссылкой на каталог в tmpfs (например, {{path|$TMP/hasher}} при типичных настройках дистрибутива "из коробки"):


===Зависимости===
$ rmdir ~/hasher
$ mkdir -p $TMP/hasher
$ ln -sr $TMP/hasher ~/hasher


При использовании утилиты в '''ALT Linux''' потребуются следующие пакеты:
Автоматизировать такой {{cmd|mkdir}} можно будет добавлением этой команды в {{path|~/.hasher/config}} (это конфигурационный файл в виде исполнимого скрипта).


* '''libldap'''
=====Настройка Hasher=====
* '''openldap'''
* '''libsasl2'''
* '''libsasl2-plugin-gssapi'''
* '''krb5-kinit'''


===Предварительная настройка===
Создайте файл `~/.hasher/config` примерно следующего содержания:


Утилита '''hadfs''' оперирует деревом объектов '''LDAP''', потому для работы '''hadfs''' необходим доступ к портам '''LDAP''' - '''88''' и '''389'''. Также, данная утилита использует '''FUSE''' (Filesystem in Userspace), потому у пользователя должно быть достаточно прав для использования '''fuse'''.
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


В случае с '''ALT Linux''' необходимо добавить пользователя в соответствующую группу:
для завершения процесса настройки.


<source>
===== Настройка SSH =====
sudo usermod -aG fuse username
</source>


===Подключение схемы===
Управление заданиями в сборочной инфраструктуре осуществляется с помощью SSH. Для каноничного использования серверов SSH можно прописать такие строки в <code>~/.ssh/config</code>:


Для получения дерева объектов в требуемом каталоге необходимо подключить утилиту '''hadfs-exe''' к контроллеру домена. Сделать это можно командой:
# Sisyphus infrastructure
Host git.alt
  HostName gitery.altlinux.org
  User git_<username>
  Port 222
  IdentityFile ~/.ssh/id_rsa
Host girar
  HostName gyle.altlinux.org
  User git_<username>
  Port 222
  IdentityFile ~/.ssh/id_rsa


<source>
====Создание Gear-репозитория из исходных кодов====
kinit administrator@DOMAIN.ALT
hadfs-exe /mnt/dc0.domain.alt dc0.domain.alt
</source>


Данное действие импортирует схему от контроллера домена '''dc0.domain.alt''' в каталог '''/mnt/dc0.domain.alt'''. При этом, прежде, чем '''hadfs-exe''' представит данные в качестве файловой системы, необходимо провести авторизацию в '''Kerberos''' с помощью утилиты '''kinit'''.
Мы будем создавать '''Gear-репозиторий''' с хранением кода в отдельной ветви - '''upstream''' и несколькими зависимыми пакетами (документация, плагины).


===Специальные файлы===
Сначала создайте директорию проекта и инициализируйте её:


Объекты дерева представлены в виде директорий, а их свойства представлены в виде текстовых файлов. Для изменения свойства необходимо, чтобы текстовый редактор записывал файл после изменения целиком. Вы можете столкнуться с проблемами, например, при использовании редактора '''mcedit'''.
<pre>
mkdir program
cd program
git init
</pre>


Среди специальных файлов в каталогах (дереве) можно встретить следующие:
В директории проекта могут быть следующие файлы:


* '''.chpwd''' - Доступный только на запись файл, куда вы можете записать новый пароль для пользователя.
* '''.gear/rules''' - файл "правил", согласно которым формируется архив для последущей сборки в '''Hasher''';
* '''.attributes''' - Атрибуты объекта в виде '''LDIF''' файла.
* '''.gear/tags/list''' - описание тегов для '''Gear'''.
* '''.attributes.json''' - Атрибуты объекта в виде '''JSON'''.


Также в каталоге запуска программы, в случае ошибок, вы можете встретить файл '''.lasterror''', который хранит в себе текст последней ошибки.
Перед продолжением работы стоит отметить, что в Gear-репозиториях может отсутствовать ветка <code>master</code>. Зачастую ветки именуются на основании того, для какой платформы (версии репоизтория Sisyphus) они предназначены, так как разные срезы репозитория могут отличаться по структуре.


Также существует специальный файл '''.refresh'''. Его назначение состоит в том, чтобы вызвать обновление дерева (которое закэшировано). Сделать это можно командой:
Далее нам необходимо задать базовую структуру репозитория. Создаём директорию настроек '''gear repo''':


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


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


===Работа с деревом===
<pre>
touch program.spec
</pre>


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


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


* '''Q1''': hadfs-exe: ldapGSSAPISaslBind: LDAPException LdapAuthUnknown(-6): Unknown authentication method (SASL(-4): no mechanism available: No worthy mechs found)
<pre>
* '''A1''': Установите пакет libsasl2-plugin-gssapi
merge -s ours <code_branch>
</pre>


в ветку с инструкциями сборки. Это позволит создать единую историю изменений из двух веток.


* '''Q2''': hadfs-exe: ldapGSSAPISaslBind: LDAPException LdapLocalError(-2): Local error (SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure.  Minor code may provide more information (No Kerberos credentials available (default cache: KEYRING:persistent:500)))
======Файл .gear/tags/list======
* '''A2''': Проверьте, что имя контроллера домена можно разрешить в IP-адрес.


Файл <code>.gear/tags/list</code> содержит информацию о соответствии хэшей '''Git''' тегам '''Gear'''.


* '''Q3''': hadfs-exe: ldapGSSAPISaslBind: LDAPException LdapServerDown(-1): Can't contact LDAP server
Обычно создаётся командой {{cmd|gear-store-tags -avc}}, результаты работы которой следует добавить в репозиторий отдельным коммитом, например, так: {{cmd|git commit -m 'gear-store-tags' .gear/tags/}}.
* '''A3''': Проверьте, что порты LDAP открыты на контроллере домена.


======Файл .gear/rules======


* '''Q4''': hadfs-exe: ldapGSSAPISaslBind: LDAPException LdapLocalError(-2): Local error (SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure.  Minor code may provide more information (Server not found in Kerberos database))
Файл <code>.gear/rules</code> содержит инструкции по упаковке исходного кода и патчей в архив, из которого будет производиться сборка RPM.
* '''A4''': У данной проблемы может быть много причин одной из которых могут быть неполадки при '''reverse DNS lookup'''. Проблему можно решить отключением данной функции в файле <code>/etc/openldap/ldap.conf</code> из пакета <code>openldap</code> с помощью прописывания строки: <code>sasl_nocanon yes</code>


======specfile======


* '''Q5''': Команда просмотра просмотра дерева (например, '''ls''' или графический файловый менеджер) зависает.
Кроме метаинформации для Gear касательно версионирования изменений в репозитории необходимо также оформить <code>.spec</code> файл. Данный файл содержит метаинформацию для результирующего пакета, changelog и инструкции по сборке ПО в виде shell-скриптов. Данный файл представляет из себя скрипт в особом формате.
* '''A5''': Наиболее вероятной причиной проблемы в данном случае является обрыв связи с сервером. '''hadfs''' пытается подключиться к серверу, но соединения не происходит. Подключите дерево заново, чтобы установить связь с сервером.


== Руководство мейнтейнера ALT Linux ==
Пример:
 
# Определяем макрос, который сигнализирует о том, что в случае обнаружения
# незапакованных файлов сборка должна упасть с ошибкой
%define _unpackaged_files_terminate_build 1
Name: cfengine
Version: 3.12.0
 
======Триггеры======
 
Триггеры это специальные скрипты, выполнение которых происходит при соответствии некоторых условий. Например, срабатывание при обновлении, когда версия установленного пакета ниже определённой.


__TOC__
====Доработка существующего пакета====


===Введение===
[[File:Ready package process.png|frame|Процесс работы над существующим пакетом]]


Данная статья предназначена для централизации всей информации о процессе работы над репозиторием [http://sisyphus.ru Sisyphus] и интеграции в сообщество ALT Linux (Team).
Источниками существующих пакетов могут быть:


Для индивида может существовать множество причин стать участником сообщества:
* [http://git.altlinux.org/gears/ gears] - Git-репозитории специально оформленные инструкциями по сборке пакетов RPM;
* [http://git.altlinux.org/srpms/ srpms] - Пакеты SRPM, зачастую импортированные из других RPM-based дистрибутивов.


* Желание внести свой вклад в развитие открытого ПО и сделать мир лучше;
=====Процесс работы над Gears=====
* Желание "отполировать резюме" и показать рекрутёрам свои навыки;
* Желание решить вполне себе практическую проблему - например, воспользоваться конкретной программой;
* Вы, волей судьбы, стали эксплуатантом дистрибутива в коммерческой или государственной структуре и сталкиваетесь с проблемами, которые надо как-то решать.


===Кто такой мейнтейнер===
Первоначально необходимо сделать персональную копию репозитория (форк, в терминологии GitHub), над которой и вести дальнейшую работу. Далее будет рассмотрена работа над '''CFEngine 3''' в качестве примера.


'''Мейнтейнер''' (дистрибутива или пакета) - это человек, который занимается тем, что интегрирует ПО в дистрибутив и сопровождает его впоследствии. То есть делает пакет для установки программы из централизованного репозитория, чинит обнаруженные в программе баги, общается с разработчиками программы, старается реагировать на нужды пользователей (багрепорты, вопросы).
Копируем репозиторий себе:


В понимании '''ALT Linux''' - мейнтейнер должен быть членом '''ALT Linux Team''' (Команды ALT Linux).
ssh git.alt clone /gears/c/cfengine.git


===Что такое ALT Linux Team===
В случае, если мы начинаем работу над новым пакетом, необходимо репозиторий создать командой:


'''ALT Linux Team''' - распределённая и независимая команда энтузиастов, которые совместно работают над поддержкой наборов программ в репозитории [http://sisyphus.ru Sisyphus] и собирают дистрибутивы на основе этого репозитория.
ssh git.alt init-db cfengine


===Как стать членом ALT Linux Team===
Клонируем репозиторий на локальную машину для дальнейшей работы:


Существует процедура принятия в '''ALT Linux Team''', которая называется '''Join''' (присоединение). Обычно, этот процесс происходит естественно, когда человек активно участвует в работе сообщества:
git clone git.alt:/people/''имя''/packages/cfengine.git


* Тестирует ПО и заводит багрепорты о найденных багах;
Далее стоит попытаться собрать пакет в текущей конфигурации, чтобы убедиться, что локальная сборочная система работает корректно. Выполнить эту задачу возможно с помощью утилиты <code>gear-hsh</code>. Она предназначена для сборки пакета в chroot и её успешное выполнение гарантирует 90% успеха при отправке пакета в сборочницу.
* Помогает чинить баги - присылает патчи;
* Пакетирует новое ПО или помогет поддерживать существующие пакеты.


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


* [http://sisyphus.ru Sisyphus] - репозиторий ПО;
cd cfengine
* [http://bugzilla.altlinux.org bugzilla.altlinux.org] - багтрекер проекта;
* [http://lists.altlinux.org lists.altlinux.org] - списки рассылки проекта;
* [irc://irc.freenode.net/altlinux #altlinux] и [irc://irc.freenode.net/altlinux-devel #altlinux-devel] - IRC каналы;
* [http://forum.altlinux.org forum.altlinux.org] - форум сообщества.


===Процедура Join===
И выполните команду:


Формально, '''Join''' выглядит как создание бага на [https://bugzilla.altlinux.org/ ALT Linux Bugzilla] в разделе '''Development''', с параметрами:
gear-hsh


* '''Product''' == '''Team Accounts'''
Процесс может занять некоторое время, так как будут произведены следующие шаги:
* '''Component''' == '''Join'''
* создан chroot для сборки;
* сформирован тарбол с исходным кодом программы и перемещён в chroot;
* будут скачаны и установлены пакеты сборочных зависимостей (указаны в spec файле в качестве '''BuildRequires''' директивы);
* будет запущен процесс распаковки тарбола с кодом, его сборки, тестирования и упаковки в RPM.


К заявке надо приложить/указать:
В случае, если нам необходимо добавить Git remote (например, '''git.alt''') к существующему репозиторию, стоит воспользоваться следующей командой:


* '''Публичный''' ключ SSH - для доступа к ресурсам сборочницы;
git remote add git.alt git.alt:/people/'''имя'''/packages/cfengine.git
* '''Публичный''' GPG-ASCIIARMOR ключ для подписи коммитов;
* Указать никнейм ментора из команды;
* Указать желаемый почтовый адрес вида <nickname>@altlinux.org


В качестве теста на членство в команде принимается работа в виде Gear-репозитория новой программы или возрождение выпавшей из сборок.
=====Процесс работы над SRPMS=====


Чтобы указать имя ментора (члена команды, который научит собирать и спопровождать пакеты) необходимо предварительно получить его согласие на менторинг. Оптимальный вариант - договориться об этом в личной переписке по e-mail.
Существуют ситуации, когда работа над пакетом в виде git-репозитория может быть неудобна. Например, большое ПО типа LibreOffice может занимать огромный объём дискового пространства и иметь очень сложную историю. Вытягивание изменений и их отправка при этом сильно замедляются. К этому добавляются накладные расходы на создание тарбола для сборки пакета. В некотором роде данную проблему можно решить, если хранить исходный код в виде Source RPM - SRPM.


Актуальный список менторов:
SRPM пакеты в ALT представлены Git репозиториями http://git.altlinux.org/srpms/ . История репозиториев отражает все успешные сборки SRPM. Происходит это в связи с процессом: SRPM распаковывается и собирается. Если сборка проходит успешно, то использованный исходный код автоматически коммитится в историю репозитория. Сами же SRPM пакеты лежат на зеркалах.


* mentor1
====Отправка пакета в сборочницу====
* mentor2


===Работа с пакетной базой===
Сборка пакета осуществляется из определённого тега. После сборки пакет попадает в "карман" - мини-репозиторий. Один карман может содержать несколько пакетов. Это позволяет группировать пакеты по задачам для
последующего тестирования.


[[File:Alt-hasher-architecture.png|frame|Архитектура средств управления пакетами]]
Каждый пакет относится к платформе. Узнать список платформ для которых можно выполнить сборку пакета можно командой


Экосистема '''ALT Linux''' обладает многими уникальными наработками и своей интересной историей и архитектурой.
ssh girar task new --help


====Введение в Gear-репозитории====
Чтобы начать собирать пакеты необходимо создать сборочную "задачу" (которая станет карманом):


'''Gear-репозиторий''' представляет собой репозиторий '''Git DVCS''', содержаший '''RPM specfile''' и специальную директорию '''.gear''' с инструкциями по сборке пакета для RPM. Практически всегда (но это не является неприкосновенным правилом) в репозитории также хранится и код программы.
ssh girar task new p9


К сожалению, '''Gear''', как и '''Git''' - очень сложный и гибкий инструмент вида '''всё наружу'''. Есть много вариантов хранения программ в '''gearrepo''', которые могут создать проблемы начинающему меёнтейнеру или заставить поломать голову опытного. Не существует однообразного рецепта работы с '''gearrepo''', так что не стесняйтесь посоветоваться с участниками сообщества по тем или иным вопросам.
Далее необходимо добавить репозитории для сборки. Отправить на сборку можно репозиторий, который находится в песональном подкаталоге '''packages''' на '''git.altlinux.org''' командой:


Есть некоторые общие рекомендации, которых можно придерживаться:
ssh girar task add <task id> repo cfengine.git 3.12.2-alt1


* Хранить код программы с редкими исправлениями удобно в ветке '''master''' - там же, где находятся '''specfile''' и директория '''.gear''';
Далее необходимо собственно запустить процесс сборки указанных репозиториев (на тестовую сборку, без отправки в основной репозиторий):
* Хранить код программы отдельно, в ветке '''upstream''', удобно, когда в программу вносится много изменений и история правок '''specfile''' или правил '''Gear''' мешает следить за ходом работы.


====Нюансы сборки пакетов====
ssh girar task run --test-only <task id>


* При жалобах на зашитый в ПО '''RPATH''' удаляйте его при сборке с помощью программы '''chrpath'''.
Стоит отметить, что опция {{cmd|--test-only}} является умолчальной, но не для всех сборочниц (которые бывают разные), так что рекомендуется не забывать добавлять её. После успешной сборки, если не возникает вопросов по пакетам, возможно отправить задачу в репозиторий. Для этого необходимо сделать не-тестовую сборку командой:
* Если у программы есть плагины, документация, заголовочные файлы - разместите их в отдельных пакетах.
* Если у программы есть жёсткие опциональные зависимости (например, варианты зависимости от '''MySQL/MariaDB''' и от '''PostgreSQL''') - соберите программу нескольких вариантах, чтобы позволить пользователям не тянуть лишние зависимости, когда они не нужны.
* Если пользователям могут одновременно понадобиться обе версии программы - старая и новая - соберите два пакета с разными именами. Также обдумайте интеграцию с системой '''Alternatives''' и вариант небольшого скрипта-обёртки при таком подходе.
* Если программа явлется демоном - удостоверьтесь в наличии предоставляемых файлов '''.service''' для '''systemd''' и скрипта для '''sysvinit'''.
* Политика дистрибутива такова, что не должно быть программ с '''suid-битом''' (как '''sudo'''). Существует много вариантов решения проблемы. В данном случае необходимо проконсультироваться с членами '''ALT Linux Team''' касательно разумного выхода из сложившейся ситуации.
* Если Вы импортировали '''RPM specfile''' из другого дистрибутива - оставьте прежний '''changelog''', а свои изменения дописывайте отдельно - это дань уважения авторам.


====Создание Gear-репозитория из исходных кодов====
ssh girar task run --commit <task id>


Мы будем создавать '''Gear-репозиторий''' с хранением кода в отдельной ветви - '''upstream''' и несколькими зависимыми пакетами (документация, плагины).
====Развёртывание локальной сборочницы====


Сначала создайте директорию проекта и инициализируйте её:


<source>
[[Категория:Сборка_пакетов]]
mkdir program
cd program
git init
</source>

Версия от 12:34, 13 августа 2020

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. В том случае, если проект неактивный, имеет много собственных специфичных патчей - предлагается хранить исходный код в одной ветке с правилами сборки.
  • В случае сборки разделяемых библиотек и фреймворков необходимо поставлять .pc файлы libtool и файлы конфигурации .cmake для CMake. Также необходимо убедиться, что файлы конфигурации, будучи использованы соответствующими инструментами, позволят найти необходимые библиотеки и заголовочные файлы. Одним из оптимальных способов будет написание небольшого интеграционного теста, который будет запускаться после сборки пакета.

Подготовка локального сборочного окружения

Установка пакетов для разработки

Для разработки пакетов нам необходим сборочный тулчейн - 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

для завершения процесса настройки.

Настройка SSH

Управление заданиями в сборочной инфраструктуре осуществляется с помощью SSH. Для каноничного использования серверов SSH можно прописать такие строки в ~/.ssh/config:

# Sisyphus infrastructure
Host git.alt
  HostName gitery.altlinux.org
  User git_<username>
  Port 222
  IdentityFile ~/.ssh/id_rsa

Host girar
  HostName gyle.altlinux.org
  User git_<username>
  Port 222
  IdentityFile ~/.ssh/id_rsa

Создание Gear-репозитория из исходных кодов

Мы будем создавать Gear-репозиторий с хранением кода в отдельной ветви - upstream и несколькими зависимыми пакетами (документация, плагины).

Сначала создайте директорию проекта и инициализируйте её:

mkdir program
cd program
git init

В директории проекта могут быть следующие файлы:

  • .gear/rules - файл "правил", согласно которым формируется архив для последущей сборки в Hasher;
  • .gear/tags/list - описание тегов для Gear.

Перед продолжением работы стоит отметить, что в Gear-репозиториях может отсутствовать ветка master. Зачастую ветки именуются на основании того, для какой платформы (версии репоизтория Sisyphus) они предназначены, так как разные срезы репозитория могут отличаться по структуре.

Далее нам необходимо задать базовую структуру репозитория. Создаём директорию настроек 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.

specfile

Кроме метаинформации для Gear касательно версионирования изменений в репозитории необходимо также оформить .spec файл. Данный файл содержит метаинформацию для результирующего пакета, changelog и инструкции по сборке ПО в виде shell-скриптов. Данный файл представляет из себя скрипт в особом формате.

Пример:

# Определяем макрос, который сигнализирует о том, что в случае обнаружения
# незапакованных файлов сборка должна упасть с ошибкой
%define _unpackaged_files_terminate_build 1

Name: cfengine
Version: 3.12.0
Триггеры

Триггеры это специальные скрипты, выполнение которых происходит при соответствии некоторых условий. Например, срабатывание при обновлении, когда версия установленного пакета ниже определённой.

Доработка существующего пакета

Процесс работы над существующим пакетом

Источниками существующих пакетов могут быть:

  • gears - Git-репозитории специально оформленные инструкциями по сборке пакетов RPM;
  • srpms - Пакеты SRPM, зачастую импортированные из других RPM-based дистрибутивов.
Процесс работы над Gears

Первоначально необходимо сделать персональную копию репозитория (форк, в терминологии GitHub), над которой и вести дальнейшую работу. Далее будет рассмотрена работа над CFEngine 3 в качестве примера.

Копируем репозиторий себе:

ssh git.alt clone /gears/c/cfengine.git

В случае, если мы начинаем работу над новым пакетом, необходимо репозиторий создать командой:

ssh git.alt init-db cfengine

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

git clone git.alt:/people/имя/packages/cfengine.git

Далее стоит попытаться собрать пакет в текущей конфигурации, чтобы убедиться, что локальная сборочная система работает корректно. Выполнить эту задачу возможно с помощью утилиты gear-hsh. Она предназначена для сборки пакета в chroot и её успешное выполнение гарантирует 90% успеха при отправке пакета в сборочницу.

Переключитесь в директорию проекта:

cd cfengine

И выполните команду:

gear-hsh

Процесс может занять некоторое время, так как будут произведены следующие шаги:

  • создан chroot для сборки;
  • сформирован тарбол с исходным кодом программы и перемещён в chroot;
  • будут скачаны и установлены пакеты сборочных зависимостей (указаны в spec файле в качестве BuildRequires директивы);
  • будет запущен процесс распаковки тарбола с кодом, его сборки, тестирования и упаковки в RPM.

В случае, если нам необходимо добавить Git remote (например, git.alt) к существующему репозиторию, стоит воспользоваться следующей командой:

git remote add git.alt git.alt:/people/имя/packages/cfengine.git
Процесс работы над SRPMS

Существуют ситуации, когда работа над пакетом в виде git-репозитория может быть неудобна. Например, большое ПО типа LibreOffice может занимать огромный объём дискового пространства и иметь очень сложную историю. Вытягивание изменений и их отправка при этом сильно замедляются. К этому добавляются накладные расходы на создание тарбола для сборки пакета. В некотором роде данную проблему можно решить, если хранить исходный код в виде Source RPM - SRPM.

SRPM пакеты в ALT представлены Git репозиториями http://git.altlinux.org/srpms/ . История репозиториев отражает все успешные сборки SRPM. Происходит это в связи с процессом: SRPM распаковывается и собирается. Если сборка проходит успешно, то использованный исходный код автоматически коммитится в историю репозитория. Сами же SRPM пакеты лежат на зеркалах.

Отправка пакета в сборочницу

Сборка пакета осуществляется из определённого тега. После сборки пакет попадает в "карман" - мини-репозиторий. Один карман может содержать несколько пакетов. Это позволяет группировать пакеты по задачам для последующего тестирования.

Каждый пакет относится к платформе. Узнать список платформ для которых можно выполнить сборку пакета можно командой

ssh girar task new --help

Чтобы начать собирать пакеты необходимо создать сборочную "задачу" (которая станет карманом):

ssh girar task new p9

Далее необходимо добавить репозитории для сборки. Отправить на сборку можно репозиторий, который находится в песональном подкаталоге packages на git.altlinux.org командой:

ssh girar task add <task id> repo cfengine.git 3.12.2-alt1

Далее необходимо собственно запустить процесс сборки указанных репозиториев (на тестовую сборку, без отправки в основной репозиторий):

ssh girar task run --test-only <task id>

Стоит отметить, что опция --test-only является умолчальной, но не для всех сборочниц (которые бывают разные), так что рекомендуется не забывать добавлять её. После успешной сборки, если не возникает вопросов по пакетам, возможно отправить задачу в репозиторий. Для этого необходимо сделать не-тестовую сборку командой:

ssh girar task run --commit <task id>

Развёртывание локальной сборочницы