Эта глава для человека, который только решил попробовать пакетирование в 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 git

Git можно отложить

Для первого упражнения с 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.

Что делать дальше

После первой успешной сборки последовательность такая:

  1. Прочитать главу про экосистему openSUSE и понять разницу Tumbleweed, Leap, Slowroll.
  2. Прочитать главу про инструментарий и научиться osc build, osc results, osc buildlog.
  3. Взять маленький пакет из home:LOGIN, изменить только .changes, собрать и посмотреть osc diff.
  4. Только потом переходить к правке spec-файла или созданию нового пакета.

Нормальный первый критерий готовности: ты можешь объяснить, где лежит spec, где .changes, где build log, какие BuildRequires поставились и, если запускал rpmlint, почему он ругается.

Где искать дополнительно