Skip to content

Latest commit

 

History

History
194 lines (118 loc) · 21.6 KB

short-guide.md

File metadata and controls

194 lines (118 loc) · 21.6 KB

О сборке и сопровождении пакетов в Росе для знакомых со сборкой RPM

О Росе

Роса — это самостоятельный дистрибутив GNU/Linux, не основанный ни на одном другом дистрибутиве. Является продолжением развития дистрибутива Mandriva.

Модель обновление — полуроллинг: такие базовые компоненты, как glibc, gcc и др. не обновляются мажорно в рамках платформы (rosa2021.1, rosa2023.1), а пользовательские приложения (chromium, Firefox, Thunderbird, LibreOffice и др.) обновляются. Консерватизм условно средний.

Пакетный менеджер — dnf (до платформы rosa2016.1 включительно использовался унаследованный из Mandriva пакетный менеджер dnf, затем был осуществлен переход на rpm4 — смена пакетного менеджера без смены пакетной базы, своя собственная пакетная база продолжила развитие, дистрибутива ROSA не был и не стал колоном Fedora.

Низкоуровневый пакетный менеджер — rpm — той же ветки, что и в большинстве других дистрибутивов (Fedora, RHEL, openSUSE и др.). К стандартным макросам RPM добавляются макросы из rpm-rosa-setup — всегда установленного при сборке пакета — и других установленных пакетов с макросами.

После сборки пакеты попадают в репозиторий на abf-downloads.rosalinux.ru:

Затем, раз в несколько часов и если не установлено особой отметки не делать этого, происходит синхронизация на основное зеркало:

  • для платформы rosa2021.1: https://mirror.rosalinux.ru/rosa/rosa2021.1/repository/
  • для платформы rosa2023.1 зеркала пока нет, т.к. платформа находится в активной разработке и не выпущена.

Другие зеркала, например, http://mirror.yandex.ru/rosa синхронизируются с mirror.rosalinux.ru.

Репозиторий Росы делится на следующие компоненты:

  • main — репозиторий самых важных пакетов, все пакеты в нем проходят тестирование при обновлении;
  • contrib — обновления пакетов в нем не проходят тестирование;
  • non-free — некоторые несвободные пакеты и блобы без исходников (драйверы nvidia в качестве исключения находятся в main вместо non-free для сборки бинарных модулей при сборке ядер), обновления проходят тестирование.

Раньше еще была комонента restricted, но начиная с платформы rosa2021.1 ее нет, она была соединена с main.

Кратко об ABF

Для сборки пакетов используется среда обеспечения полного жизненного цикла дистрибутива ABF. Сайты abf.io и abf.rosalinux.ru являются одним и тем же.

Что делается на ABF:

  • git-репозитории с исходными кодами пакетов (они размещены здесь: https://abf.io/import/);
  • хранилище https://file-store.rosalinux.ru для хранением тарболлов и прочих исходников (чтобы не хранить большие файлы в git, они закачиваются на file-store, а в файл .abf.yml прописывается хеш-суммы файлов, которые при сборке пакета нужно взять с file-store);
  • сборка пакетов;
  • публикация результатов сборки (в репозитории на abf-downloads.rosalinux.ru);
  • сборка ISO-образов, тарболлов rootfs и др. (официальные установочные образы собираются на ABF: https://abf.io/product_build_lists);
  • служба https://repoclosure.rosalinux.ru — наглядная визуализация вывода команда dnf repoclosure с результами проверки репозиториев на замкнутость зависимостей.

Сборка пакета на ABF происходит примерно следующим образом:

  • сборочному агенты (билдеры) от управляющего сервера поступает задание взять такой-то git, из такого-то хеша коммита или ветки, и собрать пакет для такой-то платформы (rosa2021.1, rosa2023.1);
  • сборочный агент получает задание и:
    • выкачивает git (abf.io/import/xxx)
    • выкачивает все прописанные в .abf.yml файлы с file-store и кладет их в такое место, где rpmbuild ищет все Source* из спека, то есть в тот же каталог, что и содержимое скачанного git
    • запускает утилиту mock, которая:
      • создает чистый чрут, т.е. минимальное окружение;
      • устанавливает в него сборочные зависимости;
      • собирает SRPM и RPM с помощью rpmbuild (это часть rpm);
  • сборочный агент загружает результаты сборки ­— пакеты SRPM и RPM — на file-store;
  • управляющему серверу отдается мета-информация, включая хеши загруженных на file-store пакетов.

Затем система публикации пакетов может положить их в репозиторий, удалив из него пакеты, собранные в предыдущей сборке этого же проекта.

Работать с ABF можно как через веб-интерфейс, так и по API, в т.ч. через консольный клиент.

chroot/контейнер для локальной сборки

Рассмотрим, как быстро сделать контейнер с Росой, чтобы собирать пакеты в отдельном изолированном окружении. В качестве хостовой ОС может быть любой Linux с ядром >= 4.14, в т.ч. сама Роса.

Скачиваем последнюю сборку rootfs для x86_64:

Для других архитектур см. здесь: https://abf.io/platforms/rosa2021.1/products и https://abf.io/platforms/rosa2023.1/products

Для скачивания нажимаем на номер сборки и затем скачиваем архив из ссылок на результаты сборки.

Допустим, скачан файл rootfs-std-rosa2021.1_x86_64_2023-04-06.tar.xz.

Необходима утилита systemd-nspawn. В некоторых дистрибутивах, например, rosa2021.1, она входит в пакет systemd, в некоторых (Debian, Ubuntu, ALT) есть отдельный пакет systemd-container, который нужно установить на хост.

Теперь нужно распаковать архив и войти в чрут:

sudo -i
cd /var/lib/machines
mkdir rosa2021.1
cd rosa2021.1
tar -xf rootfs-std-rosa2021.1_x86_64_2023-04-06.tar.xz

Получится файловая система Росы в /var/lib/machines/rosa2021.1/. Заходим в шелл:

sudo systemd-nspawn -D /var/lib/machines/rosa2021.1.

Можно использовать snr (есть в репозиториях Росы и Альта) для сокращения команды входа до snr rosa2021.1 и чтобы сразу работала возможность запускать графические программы изнутри контейнера, что удобно для проверки результатов сборки.

Описанные ниже команды можно выполнять в этом шелле.

Здесь и далее через sudo пишутся команды, которые обязательно выполнить с root-правами, не обязательно именно через sudo.

Сборка пакета локально (без mock)

Во время сборки пакета ABF не делает чего-либо, что нельзя было бы сделать у себя на компьютере без него. Рассмотрим сборку пакета локально через rpmbuild. mock — слой абстракции над rpmbuild — пока что не будем рассматривать.

Вам потребуется либо установленная на железо ОС ROSA, либо виртуальная машина с ней, либо chroot/контейнер.

Установим необходимые пакеты:

sudo dnf install basesystem-build abf git-core /usr/bin/mbd /usr/bin/spectool createrepo_c

  • basesystem-build ­— мета-пакет, по зависимостям притягивающее пакеты, которые на ABF есть в чруте при сборке каждого пакета (rpm-build, gcc и т.д.);
  • abf — сокращение (провайд) abf-console-client — консольного клиента ABF;
  • /usr/bin/mbd (rpm-mk-build-deps) — простой скрипт, который собирает пакет-заглушку, превращая BuildRequires в RPM-спеке в Requires (зависимости) этого пакета-заглушки; установка такого пакета подтягивает сборочные зависимости, а его удаление автоматически удаляет их как сироты (в dnf хорошо работает механизм удаления сирот (autoremove));
  • spectool — утилита для, например, скачивания исходников;
  • createrepo_c ­— утилита для создания метаданных репозитория.

Для начала пересоберем какой-нибудь пакет с минимальной правкой — поднятием релиза.

Заходим на https://abf.io/import/OpenBoard и копируем ссылку на клонирование git:

""

Выполняем: git clone -b rosa2021.1 https://abf.io/import/OpenBoard.git

Ветки в git совпадают с названием платформы. В веб-интерфейсе переключение веток справа вверху:

""

Ветка master не используется.

Переходим в каталог со скачанным git: cd OpenBoard

Редактируем спек, поднимаем Release. В git diff видим правку.

Делаем пакет-заглушку для подтягивания сборочных зависимостей: mbd *.spec, ставим его: sudo dnf in *.rpm. Можете попробовать сделать sudo dnf rm OpenBoard-build-deps, чтобы посмотреть, как все подтянутые им сборочные зависимости удалятся вместе с ним.

Запускаем сборку: abf rpmbuild. Это примерно то же самое, что сначала выполнить abf fetch для скачивания прописанных в .abf.yml исходников с file-store, а затем rpmbuild --define "_sourcedir $PWD" -bb *.spec для сборки пакета. При первом запуске abf-клиент попросит задать параметры, можно просто везде нажать Enter, а затем поправить их в ~/.abfcfg или просто удалить этот файл, чтобы он снова задал вопросы.

Теперь красиво установим собранный пакет, более красиво, чем sudo dnf install пакет.rpm. Обычно такая красота излишня, но покажу для примера. После abf rpmbuild результаты сборки лежат прямо в текущем каталоге. Создадим в ней метаданные репозитория, запустив: createrepo_c .
Теперь запустим обновление системы с подключением этого репозитория:
sudo dnf --nogpgcheck --repofrompath x,$PWD upgrade
Вместо upgrade можно написать, например, install OpenBoard.

Поздравляю с первым собранным пакетом! Теперь соберем его через mock:

abf rpmbuild -bs
mock *.src.rpm

Если запускаете mock не от root, то можно добавить пользователя в группу mock (sudo usermod -a -G mock username), чтобы не спрашивало пароль.

Через git clean -fd можно удалить весь скопившийся мусор (в т.ч. результаты сборки).

Сборка на ABF

Как работает ABF, описано выше, перечитайте.

Зарегистрируйтесь на ABF по ссылке-приглашению. Нажмите на имя пользователя справа вверху, зайдите в настройки (Settings) и выберите в них русский язык, сохраните.

Откройте раздел SSH-ключей на ABF, добавьте свой публичный ключ. Если у вас нет ключевой пары, то создайте её командой ssh-keygen, а на ABF вставьте публичный ключ, т.е. вывод команды cat ~/.ssh/id_rsa.pub.

Теперь форкните проект из репозитория Росы (т.е. из abf.io/import). Для этого зайдите на страницу проекта (https://abf.io/import/OpenBoard) и воспользуйтесь синей кнопкой "Клонировать".

Вы попадете в свой форк по адресу abf.io/ваше_имя_пользователя/OpenBoard. Откройте настройки проекта и укажите ветку git по умолчанию, например, rosa2023.1. Пулл-реквесты следует отправлять в наиболее новую платформу Росы (на момент апреля 2023 г. в разработке находится платформа rosa2023.1, а rosa2021.1 перешла на консервативную политику обновлений).

Вверху выберите показывание ссылки для клонирования git по SSH. Скопируйте ссылку и выполните клонирование:

git clone [email protected]:ваше_имя_пользователя/OpenBoard.git -b rosa2023.1

Перейдите в каталог: cd OpenBoard

Теперь можно вносить правки и собирать пакет локально, как описано выше.

Внесите правки. Через git diff посмотрите их. Закоммитьте их через git commit -a. Отправьте их на сервер через git push. В веб-интерфейсе увидите свой коммит.

Для обновления версии пакета:

  • поменяйте Version в спеке;
  • сбросьте Release до 1;
  • проверьте раскрываемость спека через rpmspec -P *.spec; в некоторых проектах, например, https://abf.io/import/libreoffice, нужно сделать так: rpmspec --define "_sourcedir $PWD" -P *.spec;
  • скачайте тарболл новой версии, выполнив spectool -g *.spec, что подставит макросы, в т.ч. %{version}, в ссылку (ссылки) на Source в спеке и скачает их по получившимся после подставновки ссылкам;
  • загрузите исходники на file-store: abf put -n; в большинстве случаев старая версия автоматически удалится из .abf.yml, но иногда автоматика не срабатывает, тогда удалите лишние строки вручную и проверьте правильность правок через git diff;
  • проверьте корректность распаковки исходников, выполнив abf rpmbuild -bp или rpmbuild --define "_sourcedir $PWD" -bp *.spec;
  • закоммитьте (git commit) правки и отправьте их на сервер (git push).

Обратите внимание, что в Source в спеке обычно прописывается полная ссылка на файл так, чтобы при изменении версии было достаточно поменять Version, а ссылка за счет макроса стала бы вести на исходник новой версии, что позволяет просто скачать файл по ссылке и залить его на file-store. При сборке пакета rpmbuild отбрасывает все части до последнего слеша (/) включительно и ищет файл с получившимся именем в %_sourcedir (пример пробразования: http://nixtux.ru/proga/proga-x.tar.gz -> proga-x.tar.gz). abf fetch / abf rpmbuild / билдер ABF выкачивают прописанное в .abf.yml в %_sourcedir, там самым обеспечивая наличие прописанных в Source файлов без доступа в интернет.

Теперь нажмите кнопку запуска сборки в веб-интерфейсе. В открывшейся форме запуск сборки отметьте галками main и contrib rosa2023.1 и/или rosa2021.1, архитектуры aarch64 и x86_64, запустите сборку. В билд-листе наблюдайте живой лог сборки и ее результаты. Для первой сборки уберите подключение репозитория ваше_имя_пользователя_personal нажатием на крестик.

Кнопка создания контейнера (также при запуске есть галка для автоматического создания контейнера) создает контейнер — репозиторий из результатов сборки. Его можно использовать, например, так: sudo dnf --nogpgcheck --repofrompath o,http://ссылка-на-контейнер up OpenBoard. Также пакеты можно просто скачивать с file-store. При скачивании консольными инструментами обратите внимание на wget --content-disposition, чтобы имя файла автоматически выставлялось правильно. У wget в репозиториях Росы ключ --content-disposition включен по умолчанию, т.е. прописывать его не обязательно.

Нажмите кнопку публикации сборки. Найдите пакет в репозитории по адресу http://abf-downloads.rosalinux.ru/ваше_имя_пользователя_personal/.

Если сборки прошли успешно, а пакет работает, можно сделать пулл-реквест в rosa2023.1, а в rosa2021.1 сотрудники Росы сами смержат, соберут и отправят на тестирование, если пакет в main, а если в contrib, то просто сразу опубликуют его.