Билдер debian пакетов

Система сборки deb-пакетов. Служит для упрощения некоторых процессов сборки, таких как компиляция и создание окружения под неё. Для работы с окружениями же используется утлилита schroot.

Настройка билдера

Нам понадобится:

  • 2 руки
  • Чистый дистрибутив Debian
  • Немного фантазии

Установка пакетов

Здесь всё достаточно просто:

# apt-get install sbuild debhelper devscripts

Дальше на вкус и цвет пакеты можно доставлять в зависимости от используемых бэкендов для sbuild:

  • lvm-snapshot
    • Достаточно сильно нагружает дисковую подсистему
    • Как и любой снапшот занимает только то пространство, которое отличается от оригинала
  • aufs (нужно поставить aufs-tools)
    • Обычная прослойка надо директорией
  • overlayfs
    • Так же как и aufs прослойка над директорией, но завести не смог
  • directory
    • Обычная директория, в которой будет жить chroot
  • file
    • Архив с chroot

Я успел попробовать только два первых решения, так что на них и остановимся подробнее.

Schroot

lvm-snapshot

Как работать с LVM я рассказал в другой статье, так что здесь мы будем отталкиваться от того, что и группа у нас есть, и диск мы уже создали. Назовём его stretch.

Итак, сначала создаём ФС

# mkfs.ext4 /dev/build_roots/stretch

После чего монтируем ФС и распаковывем базовую систему:

# mount /dev/build_roots/stretch /mnt
# debootstrap --keyring=/etc/apt/trusted.gpg stretch /mnt http://repo.owlhost.in/debian

На выходе получаем готовый к запуску stretch с минимальным набором пакетов. Отмонтируем ФС и переходим к конфигурации schroot, где в /etc/schroot/schroot.conf дописываем:

/etc/schroot/schroot.conf
[stretch]
type=lvm-snapshot
description=Debian stretch LVM snapshot
groups=sbuild,root
root-users=owlbook
root-groups=root,sbuild
device=/dev/build_roots/stretch
mount-options=-o atime,sync,user_xattr
lvm-snapshot-options=--size 8G

По большей части настройки, я думаю, понятны, в крайнем случае есть ман.

После того, как всё подготовлено пробуем попасть в chroot:

# schroot -c stretch

Если всё успешно, к PS1 в начале должно добавиться (stretch). Если что-то пошло не так - вам обязательно скажут.

aufs

Второй тип aufs, который позволяет хранить только разницу между базовой директорией и пользовательскими изменениями.

Первые этапы такие же, создаём раздел, делаем на него debootstrap системы, однако дальше всё идёт несколько иначе.

В /etc/fstab нужно добавить строчку монтирования нашего раздела, чтобы при перезагрузке ничего не ломалось:

/etc/fstab
/dev/build_roots/stretch /srv/build/stretch ext4 noatime 0 0

После этого выполнить

# mount -a

и проверить, что раздел успешно процепился.

Далее в /etc/schroot/schroot.conf требуется добавить секцию вида:

/etc/schroot/schroot.conf
[stretch]
aliases=stable
type=directory
directory=/srv/build/stretch
description=Debian stretch
groups=sbuild,root
root-users=owlbook
root-groups=root,sbuild
union-type=aufs

И проверить, что с schroot всё хорошо:

# schroot -c stretch

Дополнительные крутилки

  • Если требуется добавить определённый ключ репозитория (например если у нас свои репы), то есть два пути
    • Добавить его непосредственно в базовой директории
    • Добавить его добавление в скриптах создания schroot (/etc/schroot/setup.d/20add-key)
  • Если нужны отличные от стоковых репозитории то так же, либо правим базовую систему, либо добавляем в скрипты

Вообще стоит почитать директорию /etc/schroot и поглядеть какие скрипты она использует. Вещь полностью кастомизируемая.

SBuild

После всех шаманств с schroot можно наконец перейти к настройке самого билдера. Не ходя далеко начинаем с файла конфигурации /etc/sbuild/sbuild.conf

/etc/sbuild/sbuild.conf
$build_arch_all = 1;
$build_source = 0;
$distribution = 'stable';
$chroot_mode = 'schroot';
$chroot_split = 0;
$purge_build_deps="never";
$sbuild_mode = "user";
$apt_allow_unauthenticated = 0;
$apt_update = 1;
$apt_upgrade = 1;
$apt_distupgrade = 0;
$check_space = 1;
1;

В общем и целом это всё, что используется в моей инсталляции, но если чего-то не будет хватать - добро пожаловать в man.

Работа с базовой системой

Для обновления пакетов в базовой системе и вообще выполнения практически любых операций у sbuild есть пачка утилит

  sbuild-update - обновляет репозитории в заданном дистрибутиве
  sbuild-apt <distro> apt-get install <package> - устанавливает в <distro> выбранные <package>
  sbuild-upgrade - обновляет заданный дистрибутив

Сборка пакета

Итак, систему вроде бы настроили, теперь настало время собирать пакет. Здесь нет ничего сложного, нужно просто осилить тонные бессмысленной документации DPKG, которая ничего не объясняет, а в довесок даёт ещё больше вопросов.

Вкратце сборка пакетов выглядит так:

  • После прочтения документации у нас появляется директория debian/, в которой находятся такие важные для создания пакета файлы как rules, control, changelog и, кажется, всё
  • Рядом с директорией debian/ лежат распакованные сорцы
  • Для икремента версии можно использовать утилиту dch - она вполне удобна, кстати
  • В директории с сорцами запускается sbuild
  • Сборка продолжается какое-то время
  • В случае успеха на выходе получаем файл *.deb (иногда несколько файлов - зависит от того, что написано в debian/control)
  • Файл закидывается в репозиторий (например с помощью Aptly)
  • И раздётся по сервера посредством apt-get update && apt-get install <pkg-name>