1. Подготовка рабочего окружения
Первые шаги для тех, кто решил начать RPM-пакетирование в openSUSE на рабочей станции Tumbleweed.
Эта глава для человека, который только решил попробовать пакетирование в openSUSE. Цель не в том, чтобы сразу отправить пакет в Factory, а в том, чтобы подготовить рабочую станцию, понять минимальный набор инструментов и один раз собрать существующий пакет локально.
В качестве рабочей системы берём openSUSE Tumbleweed. Это удобная стартовая точка: Tumbleweed близок к openSUSE:Factory, где живёт разработка новых пакетов, и быстрее показывает проблемы с актуальными версиями RPM macros и проверок сборки.
Leap тоже можно использовать, особенно если цель - сопровождение stable update. Но для первого знакомства проще начинать с Tumbleweed, а различия Leap разобрать позже.
Что нужно до начала
Минимальные требования:
- установленная openSUSE Tumbleweed;
- обычный пользователь с правом запускать
sudo; - стабильный интернет:
osc buildскачивает build dependencies; - 20-30 ГБ свободного места под build root и cache;
- базовое понимание командной строки,
zypperи текстового редактора.
OBS-аккаунт нужен для работы с build.opensuse.org: checkout, branch, commit, submit request. Для чтения документации он не нужен, но для практики с osc branch лучше создать его заранее.
Создай аккаунт через Web UI:
Не начинай с отправки Submit Request. Сначала научись локально собирать существующий пакет и читать ошибки сборки.
Обновить Tumbleweed
Для Tumbleweed используется zypper dup, а не обычный zypper up:
sudo zypper refresh
sudo zypper dup
sudo reboot
После перезагрузки проверь, что это действительно openSUSE Tumbleweed:
cat /etc/os-release
Проверь базовые RPM macros, чтобы привыкнуть смотреть окружение, а не гадать:
rpm --eval '%{?suse_version} %{?is_opensuse} %{?sles_version} %{?sle_version}'
rpm --eval '%{_libexecdir} %{_unitdir} %{_tmpfilesdir} %{_sysusersdir}'
Для Tumbleweed/Factory на июль 2026 ожидаемо видеть %suse_version 1699 и %is_opensuse 1. В spec-файле условные блоки по этим значениям нужны только при реальном различии поведения между ветками.
Поставить минимальные инструменты
Для старта поставь только osc:
sudo zypper in osc
osc сам подтянет свои runtime dependencies. Не ставь заранее компиляторы, CMake, Meson, Python/Rust/Go macros и source services. При обычной локальной сборке через osc build компиляторы и библиотеки должны устанавливаться внутрь build root из BuildRequires, а не засорять хост-систему.
Проверь, что клиент установлен:
osc --version
Когда дойдёшь до первой локальной сборки, поставь только build helper:
sudo zypper in build
Остальные инструменты ставь по факту:
rpmlint- когда готов смотреть warnings/errors по собранному RPM;spec-cleaner- когда начал редактировать spec-файл;git- когда работаешь с upstream source или patches; для первой сборки существующего пакета он не нужен;quilt patchutils- когда реально ведёшь downstream patches;obs-service-*- когда пакет использует_service;- language macros (
python-rpm-macros,cargo-packaging,golang-packaging) - только для пакетов соответствующей экосистемы.
Примеры точечной установки, но только когда дошёл до соответствующей задачи:
sudo zypper in rpmlint
sudo zypper in spec-cleaner
sudo zypper in gitGit можно отложить
Для первого упражнения с osc branch и osc build git не требуется. Он понадобится, когда начнёшь смотреть upstream source, делать patches или работать с package repositories, которые уже переехали в Git.
Когда дойдёшь до этого этапа, поставь и настрой git:
sudo zypper in git
git config --global user.name "Имя Фамилия"
git config --global user.email "you@example.org"
git config --global init.defaultBranch main
Для openSUSE package changes важнее .changes, чем git commit message, но нормальная git-конфигурация нужна для работы с patches и upstream clone.
Настроить osc
Первый запуск osc создаёт конфигурацию и попросит логин OBS:
osc ls /
Файл конфигурации находится в ~/.config/osc/oscrc. Минимальный пример:
[general]
apiurl = https://api.opensuse.org
packagecachedir = /var/tmp/osbuild-packagecache
build-root = /var/tmp/build-root/%(repo)s-%(arch)s
build-jobs = 4
extra-pkgs = less vim gdb strace
[https://api.opensuse.org]
user = LOGIN
aliases = obs
use_keyring = 1
Если keyring не настроен, osc может хранить пароль или token иначе. Проверь права на файл:
chmod 600 ~/.config/osc/oscrc
Проверь, что доступ к OBS работает:
osc whois LOGIN
osc ls home:LOGIN
osc repos openSUSE:Factory
Если home:LOGIN ещё не существует, создай home project через Web UI OBS. Редактирование project meta через osc meta prj -e home:LOGIN лучше оставить на потом: новичку проще не начинать с XML meta.
Создать рабочие каталоги
Для первого дня достаточно одного каталога под OBS checkout:
mkdir -p ~/obs
Позже можно разделить рабочие каталоги так:
~/obs- checkout пакетов из OBS черезosc coилиosc branch;~/src- upstream git clone, где удобно смотреть код и делать patches;~/rpmbuild- локальные эксперименты сrpmbuild, если они нужны вне OBS workflow.
В OBS package directory обычно лежат только package sources: *.spec, *.changes, tarballs, patches, _service, rpmlintrc, _constraints.
Первый практический тест: собрать существующий пакет
Для первого теста не создавай новый пакет. Возьми маленький существующий пакет и собери его локально. Это проверит osc, build root и установку build dependencies.
Пример с пакетом hello:
sudo zypper in build
cd ~/obs
osc branch openSUSE:Factory hello
cd home:LOGIN:branches:openSUSE:Factory/hello
osc build openSUSE_Tumbleweed x86_64 hello.spec --clean
Что происходит:
osc branchсоздаёт личную branch-копию пакета вhome:LOGIN;osc buildсобирает пакет локально, не публикуя результат в OBS;--cleanпересоздаёт build root, чтобы тест был ближе к чистой сборке.
Если команда просит выбрать repository/architecture, сначала посмотри доступные варианты:
osc repos
Если сборка прошла, это уже нормальная первая цель. Не делай osc ci и не отправляй SR, пока не понимаешь diff.
Посмотреть результат сборки
Найди собранные RPM:
find /var/tmp/build-root -path '*RPMS*' -name '*.rpm' | sort
rpmlint для первого знакомства можно поставить отдельно, когда сборка уже прошла:
sudo zypper in rpmlint
rpmlint hello.spec
rpmlint /var/tmp/build-root/openSUSE_Tumbleweed-x86_64/home/abuild/rpmbuild/RPMS/*/*.rpm
Если build root в твоём oscrc другой, смотри путь в конце вывода osc build.
Посмотри build log:
less /var/tmp/build-root/openSUSE_Tumbleweed-x86_64/.build.log
В build log начинающий packager должен научиться находить:
- установленные
BuildRequires; - начало
%prep,%build,%install,%check; - место первой ошибки;
- вывод
rpmlintи post-build checks.
Если сборка упала
Не исправляй всё сразу. Сначала классифицируй ошибку.
Проблемы с OBS/API:
osc api /about
osc whois LOGIN
Проблемы с repository или architecture:
osc repos
osc buildinfo openSUSE_Tumbleweed x86_64 hello.spec | sed -n '1,120p'
Проблемы внутри build root:
osc buildlog openSUSE_Tumbleweed x86_64
osc chroot openSUSE_Tumbleweed x86_64
rpm --eval '%{optflags}'
exit
Если ошибка непонятна, сохрани последние 80-120 строк build log и ищи первую реальную ошибку выше финального Bad exit status.
Что делать дальше
После первой успешной сборки последовательность такая:
- Прочитать главу про экосистему openSUSE и понять разницу Tumbleweed, Leap, Slowroll.
- Прочитать главу про инструментарий и научиться
osc build,osc results,osc buildlog. - Взять маленький пакет из
home:LOGIN, изменить только.changes, собрать и посмотретьosc diff. - Только потом переходить к правке spec-файла или созданию нового пакета.
Нормальный первый критерий готовности: ты можешь объяснить, где лежит spec, где .changes, где build log, какие BuildRequires поставились и, если запускал rpmlint, почему он ругается.