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
) собираемого пакета, прямой или косвенной (через зависимости сборочных зависимостей пакета).