Skip to content

Hasher

Hasher — это инструмент безопасной и воспроизводимой сборки пакетов. Все пакеты репозитория Сизиф собираются с его помощью.

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

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

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

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

Настройка Hasher

Установка Hasher:

shell
# apt-get install hasher

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

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

shell
# hasher-useradd $USER

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

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

shell
$ mkdir ~/.hasher

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

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

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

shell
$ hsh --initroot-only ~/.hasher

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

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

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

Сборка в Hasher

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

shell
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 делятся на два вида:

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

  2. Все остальные — необходимые для непосредственной сборки.

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

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

shell
rpm -bs --nodeps package.spec

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

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

Внимание

В поле BuildRequires(pre) нельзя использовать макросы.

Мануал по Hasher

Для получение подробной справки и пояснении команд — воспользуйтесь мануалом Hasher:

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

Авторы

The avatar of contributor named as x1z53 x1z53
The avatar of contributor named as Valentin Sokolov Valentin Sokolov
The avatar of contributor named as Олег Щавелев Олег Щавелев

История изменений