Hasher/Руководство

Материал из ALT Linux Wiki

Принцип действия

hasher — инструмент для сборки пакетов в «чистой» и контролируемой среде. Это достигается с помощью создания в chroot минимальной сборочной среды, установки туда указанных в source-пакете сборочных зависимостей и сборке пакета в свежесозданной среде. Для сборки каждого пакета сборочная среда создаётся заново[1].

Такой принцип сборки имеет несколько следствий:

  • Все необходимые для сборки зависимости должны быть указаны в пакете. Для облегчения поддержания сборочных зависимостей в актуальном состоянии в Sisyphus придуман инструмент под названием buildreq,
  • Сборка не зависит от конфигурации компьютера пользователя, собирающего пакет, и может быть повторена на другом компьютере,
  • Изолированность среды сборки позволяет с лёгкостью собирать на одном компьютере пакеты для разных дистрибутивов и веток репозитория — для этого достаточно лишь направить hasher на различные репозитории для каждого сборочного окружения.

Дополнительно к сборке пакетов hasher

  • проверяет их с помощью утилиты sisyphus_check,
  • создаёт локальный APT-репозиторий с результатами сборки, позволяя последовательно собирать пакеты, опираясь на уже собранные.

Установка

hasher в Sisyphus и дистрибутивах ALT Linux располагается в пакетах hasher и hasher-priv и легко устанавливается:

# apt-get install hasher

Добавление пользователя

hasher использует специальных вспомогательных пользователей и группу hashman для своей работы, поэтому каждого пользователя, желающего использовать hasher, перед началом работы нужно зарегистрировать:

# hasher-useradd USER

Эта команда создаёт вспомогательных пользователей USER_a и USER_b и добавляет пользователя USER в группы hashman, USER_a и USER_b.

Поскольку hasher-useradd добавляет пользователя в группы, пользователю необходимо перелогиниться (открытия нового терминала в X недостаточно; su - $USER достаточно) перед началом работы с hasher.

Настройка сборочной среды

Для работы hasher требуется создать директорию, в которой будет строиться сборочная среда:

$ mkdir ~/hasher

Рабочий каталог (в данном случае ~/hasher) должен быть доступен на запись пользователю, запускающему сборку.

Кроме того, его нельзя располагать на файловой системе, которая смонтирована с опциями noexec или nodev — в таких условиях hasher не сможет создать корректное сборочное окружение.

Сборочное окружение можно создать явно:

$ hsh --initroot-only ~/hasher[2]

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

hasher берёт пакеты для установки из APT-источников. По умолчанию в сборочную среду копируется список источников, указанный в конфигурации APT хост-системы, но это можно изменить с помощью альтернативного файла конфигурации APT:

$ hsh --apt-config=~/branch4.1-apt.conf --initroot-only ~/hasher

В таком файле конфигурации необходимо укзать расположение файла с APT-источниками:

Dir::Etc::SourceList "/home/USER/sources.list.branch4.1";

После создания сборочной среды (неявного, при сборке пакета, или явного, с помощью --initroot-only) параметр --apt-config больше не нужен.

Сборка программ в hasher

Сборка происходит от обычного пользователя, добавленного с помощью hasher-useradd:

$ hsh ~/hasher freetype-2.1.9-alt2.src.rpm

При удачной сборке полученные пакеты будут лежать в ~/hasher/repo/<платформа>/RPMS.hasher/, в противном случае на stdout будет выведена информация об ошибках сборки.

Создаваемый hasher репозиторий является обычным APT-репозиторием и может быть использован в sources.list. Дополнительно, этот репозиторий будет использован при дальнейшей сборке пакетов (это поведение можно регулировать ключом --without-stuff).

Сборочные зависимости

Сборочные зависимости RPM делятся на два вида:

  • необходимые для корректного создания src.rpm из spec-файла (содержащие определения RPM-макросов, используемых в spec-файле),
  • все остальные (необходимые для непосредственной сборки).

Поскольку hasher собирает пакеты из src.rpm (не считая поддержки gear), то для сборки необходимо иметь в хост-системе установленные сборочные зависимости первого типа. Большинство таких зависимостей (но пока не все) содержатся в пакетах с названием rpm-build-*.

Поскольку сборка src.rpm либо завершается неудачно (при отсутствии сборочной зависимости первого типа), либо корректно, то собирать src.rpm-пакеты в хост системе можно с помощью --nodeps:

rpm -bs --nodeps foo.spec

Сам hasher, в отличие от gear, не предъявляет никаких требований к разделению сборочных зависимостей на первый и второй тип. Однако для совместимости с gear и для улучшения документируемости spec-файла рекомендуется распределять их так:

  • В поле BuildRequires(pre) помещать сборочные завимости, требуемые для сборки src.rpm,
  • В поле BuildRequires — все остальные.

Архитектура пакетов

В связи с идиотизмомособенностями версии RPM, используемой в Sisyphus, rpmbuild (и, как следствие, hasher) на x86-системах могут собирать RPM-пакеты для совершенно разных архитектур: pentium3, pentium4, athlon и т.д.

Для отключения эвристик RPM по определению целевой архитектуры можно воспользоваться ключом --target или опцией конфигурации def_target.

$ hsh --target=i586 mypkg-0.0-alt0.src.rpm

или, в ~/.hasher/config:

def_target=i586

Монтирование файловых систем внутри hasher

Некоторым приложениям для сборки требуется смонтированная файловая система (например, /proc). hasher поддерживает монтирование дополнительных файловых систем в сборочную среду.

Монтирование происходит при одновременном выполнении следующих трёх условий:

  • Необходимая файловая система указана в файле /etc/hasher-priv/fstab, либо является одной из /proc, /dev/pts, /sys.
  • Необходимая файловая система указана в опции --mountpoints при запуске hasher, либо, что то же самое, в ключе known_mountpoints конфигурационного файла hasher (~/.hasher/config).
  • Необходимая файловая система укзана сборочной зависимостью (например, BuildReq: /proc) собираемого пакета, прямой или косвенной (через другие сборочные зависимости пакета).

Монтирование /proc

  • known_mountpoints=/proc в конфиге hasher или опция --mountpoints=/proc при сборке пакета,
  • BuildRequires: /proc в пакете

Для сборки в Incoming достаточно сборочной зависимости на /proc.

Использование нескольких сборочных окружений

hasher не ограничивает пользователей одним сборочным окружением. Первый параметр, передаваемый hsh, указывает на конкретную сборочницу, в которой необходимо производить работу:

$ hsh ~/hasher-4.0 mypkg-0.0-alt0.M40.0.src.rpm
...
$ hsh ~/hasher-4.1 mypkg-0.0-alt0.M41.0.src.rpm
...

По умолчанию используется директория ~/hasher.

Параллельная сборка

По умолчанию hasher позволяет одному пользователю производить не больше одной сборки на данной системе в любой момент времени. Для преодоления этого ограничения используются subconfigs и дополнительные вспомогательные пользователи.

Детали применения такой конфигурации описаны на man-странице hsh(1) в описании ключа --number.

Сборка пакетов на tmpfs

При наличии достаточного количества памяти на сборочной машине сборку пакетов можно производить на tmpfs - такая конфигурация заметно ускоряет сборку.

В качестве tmpfs можно взять уже смонтированный /tmp:

$ mkdir /tmp/.private/$USER/hasher
$ hsh --repo=$HOME/hasher-repo /tmp/.private/$USER/hasher somepkg-0.0-alt0.src.rpm

Создавать директорию /tmp/.private/$USER/hasher придётся после каждой перезагрузки. Указывать --repo придётся для каждой сборки.

Возможно, что для сборки чего-нибудь тяжёлого придётся в увеличить размер tmpfs, смонтированной в /tmp. Эта операция производится в файле /etc/fstab:

tmpfs /tmp tmpfs nosuid,size=1g 0 0

Разумеется, изменения в /etc/fstab применяются только после перемонтирования файловой системы.

В баге 16706 идёт обсуждение создания более удобного средства для сборки на tmpfs и имеется предварительная реализация.

Отключение проверок sisyphus_check

По умолчанию hasher запускает утилиту sisyphus_check с полным набором тестов. sisyphus_check проверяет не только технические требоввания репозитория Sisyphus, но и организационные: сборочный хост, подпись PGP-ключом члена ALT Linux Team и т.д., так что в случае сборки пакета не для репозитория Sisyphus возникает необходимость отключить часть проверок.

Для отключения части или всех проверок используется ключ --no-sisyphus-check[=LIST] или, что эквивалентно, опция конфига no_sisyphus_check.

Без аргумента этот ключ отключает запуск sisyphus_check вообще:

$ hsh --no-sisyphus-check mybroken-but-cool-package-I-need-to-run-today-0.0-alt0.src.rpm

С аргументом - списком отключаемых тестов - отключает только эти тесты:

$ hsh --no-sisyphus-check=packager,gpg my-package-for-different-repository-0.0-0.src.rpm

Со списком тестов можно ознакомиться в подсказке самого sisyphus_check:

$ sisyphus_check --help
...
Valid options are:
...
  --[no-]check-buildhost
  --[no-]check-buildtime
  --[no-]check-changelog
...
$

Более тонко запуск тестов можно настроить с помощью опций --no-sisyphus-check-in и --no-sisyphus-check-out, с описанием которых можно ознакомиться в man-странице hsh(1).

Ограничение ресурсов

hasher позволяет ограничить ресурсы, выделяемые на сборку: CPU, память, общее время исполнения и другие. Ограничения указываются в конфигурационном файле hasher-priv.

Полный список ограничиваемых ресурсов можно найти в man-странице hasher-priv.conf(5).

Отладка в сборочном chroot

Для отладки сборки иногда полезно запустить shell в сборочном chroot. Для этого используется утилита hsh-shell(1):

$ hsh-shell

Можно запустить программу и с правами псевдо-root:

$ hsh-shell --rooter

Для контроля за содержимым сборочного chrootа используются опции hsh: --cleanup-only, --eager-cleanup, --lazy-cleanup.

Для запуска произвольных программ в сборочном чруте существует более низкоуровневая утилита hsh-run(1).

Примечания

  1. за исключением кэширования образа базовой системы, которое не влияет на корректность и воспроизводимость результата
  2. Директория ~/hasher используется по умолчанию во всех командах hsh-* и её можно не указывать: hsh --initroot-only, hsh somepkg.src.rpm и т. д.