Hasher
Hasher — это инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты репозитория Сизиф собираются с его помощью.
Принцип действия
Hasher собирает пакеты в «чистой» и контролируемой среде. Это достигается с помощью создания изолированной минимальной сборочной среды, установки туда указанных в source-пакете сборочных зависимостей и сборке пакета в свежесозданной среде. Для сборки каждого пакета сборочная среда создаётся заново.
Такой принцип сборки имеет несколько следствий:
- Все необходимые для сборки зависимости должны быть указаны в пакете. Для облегчения поддержки сборочных зависимостей в актуальном состоянии в Сизифе есть инструмент
buildreq; - Сборка не зависит от конфигурации компьютера пользователя, собирающего пакет, и может быть воспроизведена на другом компьютере;
- Изолированность среды сборки позволяет с лёгкостью собирать на одном компьютере пакеты для разных дистрибутивов и веток репозитория — для этого достаточно лишь направить Hasher на различные репозитории для каждого сборочного окружения.
Настройка Hasher
Установка Hasher:
# apt-get install hasherДобавление пользователя:
Hasher использует специальных вспомогательных пользователей и группу hashman для своей работы, поэтому пользователя перед началом работы нужно зарегистрировать:
# hasher-useradd $USERНастройка сборочной среды:
Для работы Hasher требуется создать директорию, в которой будет строиться сборочная среда:
$ mkdir ~/.hasherДля запуска сборки, у пользователя должны быть права записи в рабочий каталог (в данном случае ~/.hasher).
Кроме того, его нельзя располагать на файловой системе, которая смонтирована с опциями noexec или nodev — в таких условиях Hasher не сможет создать корректное сборочное окружение.
Сборочное окружение можно создать явно:
$ hsh --initroot-only ~/.hasherЯвное создание необязательно — при необходимости оно будет произведено при первой сборке пакета.
Hasher берёт пакеты для установки из APT-источников. По умолчанию в сборочную среду копируется список источников, указанный в конфигурации APT хост-системы. Также можно явно задать дополнительные репозитории, указав альтернативный файл конфигурации APT:
$ hsh --apt-config=branch4.1-apt.conf --initroot-only ~/.hasherСборка в Hasher
Сборка происходит от обычного пользователя, добавленного с помощью hasher-useradd:
hsh ~/.hasher /home/work/rpm/package.src.rpmПри удачной сборке полученные пакеты будут лежать в ~/.hasher/repo/<платформа>/RPMS.hasher/, в противном случае в консоль будет выведена информация об ошибках сборки.
Создаваемый Hasher репозиторий является обычным APT-репозиторием и может быть использован в sources.list[3]. Также он будет использован при дальнейшей сборке пакетов (это поведение можно регулировать флагом --without-stuff).
Если сборочная среда в tmpfs (см. ниже), каталог ~/.hasher/repo будет удалён после перезагрузки системы. Репозиторий можно переместить в постоянное место, указав в .hasher/config параметр def_repo=постоянное_хранилище (или вызвав Hasher с флагом --repo).
Сборочные зависимости
Сборочные зависимости RPM делятся на два вида:
Необходимые для корректного создания
src.rpmиз Spec-файла, содержащие определения RPM-макросов, используемых в Spec-файле;Все остальные — необходимые для непосредственной сборки.
Поскольку Hasher собирает пакеты из src.rpm (не считая поддержки Gear), то для сборки необходимо иметь в хост-системе установленные сборочные зависимости первого типа. Большинство таких зависимостей содержатся в пакетах с названием rpm-build-*.
Поскольку сборка src.rpm либо завершается неудачно (при отсутствии сборочной зависимости первого типа), либо корректно, то собирать src.rpm в хост системе можно с помощью флага --nodeps:
rpm -bs --nodeps package.specСам Hasher, в отличие от Gear, не предъявляет никаких требований к разделению сборочных зависимостей на первый и второй тип. Однако для совместимости с Gear и для улучшения описания Spec-файла рекомендуется распределять их так:
- В поле
BuildRequires(pre)указывать сборочные зависимости, требуемые для сборкиsrc.rpm; - В поле
BuildRequiresуказывать все остальные.
Внимание
В поле BuildRequires(pre) нельзя использовать макросы.
Мануал по Hasher
Для получение подробной справки и пояснении команд — воспользуйтесь мануалом Hasher:
$ man hshМонтирование файловых систем внутри Hasher
Некоторым приложениям для сборки требуется смонтированная файловая система (например, /proc). Hasher поддерживает монтирование дополнительных файловых систем в сборочную среду.
Монтирование происходит при одновременном выполнении четырёх условий:
- Файловая система описана в файле
/etc/hasher-priv/fstabили является одной из предопределённых:/proc,/dev/pts,/sys; - В конфигурации
hasher-priv(/etc/hasher-priv/system) файловая система указана в опцииallowed_mountpoints; - Файловая система указана в опции
--mountpointsпри запуске Hasher или в ключеknown_mountpointsконфигурационного файла Hasher (~/.hasher/config); - Файловая система указана сборочной зависимостью (например,
BuildReq: /proc) собираемого пакета, прямой или косвенной (через зависимости сборочных зависимостей пакета).