Hasher/Руководство: различия между версиями
(Новая: Категория:Справочники Категория:Devel Категория:Sisyphus {{stub}} == Установка == <tt>hasher</tt> в ALT Linux распола...) |
Нет описания правки |
||
Строка 3: | Строка 3: | ||
[[Категория:Sisyphus]] | [[Категория:Sisyphus]] | ||
{{stub}} | {{stub}} | ||
== Принцип действия == | |||
<tt>hasher</tt> — инструмент для сборки пакетов в «чистой» и контролируемой среде. Это достигается с помощью создания в chroot минимальной сборочной среды, установки туда указанных в source-пакете сборочных зависимостей и сборке пакета в свежесозданной среде. Для сборки нового пакета сборочная среда создаётся заново (за исключением кэширования образа базовой системы, которое не влияет на корректность и воспроизводимость результата). | |||
Такой принцип сборки вызывает несколько последствий: | |||
* Все необходимые для сборки зависимости должны быть указаны в пакете. Для облегчения поддержания сборочных зависимостей в актуальном состоянии в Sisyphus придуман инструмент под названием [[buildreq]], | |||
* Сборка не зависит от конфигурации компьютера пользователя, собирающего пакет, и может быть повторена на другом компьютере, | |||
* Изолированность среды сборки позволяет собирать на одном компьютере пакеты для разных дистрибутивов и веток репозитория — для этого достаточно лишь направить <tt>hasher</tt> на различные репозитории для каждого сборочного окружния. | |||
Дополнительно к сборке пакетов <tt>hasher</tt> | |||
* проверяет их с помощью утилиты [[sisyphus_check]], | |||
* создаёт локальный APT-репозиторий с результатами сборки, позволяя последовательно собирать пакеты опираясь на уже собранные. | |||
== Установка == | == Установка == | ||
<tt>hasher</tt> в ALT Linux располагается в пакетах <tt>hasher</tt> и <tt>hasher-priv</tt> и легко устанавливается: | <tt>hasher</tt> в Sisyphus и дистрибутивах ALT Linux располагается в пакетах <tt>hasher</tt> и <tt>hasher-priv</tt> и легко устанавливается: | ||
# apt-get install hasher | # apt-get install hasher | ||
== Добавление пользователя == | == Добавление пользователя == | ||
<tt>hasher</tt> использует специальных вспомогательных | <tt>hasher</tt> использует специальных вспомогательных пользователей и группу <tt>hashman</tt> для своей работы. Каждого пользователя перед началом работы нужно зарегистрировать в <tt>hasher</tt>: | ||
# hasher-useradd USER | # hasher-useradd USER | ||
Эта команда создаёт вспомогательных пользователей USER_a и USER_b и добавляет пользователя USER в группы <tt>hashman</tt>, <tt>USER_a</tt> и <tt>USER_b</tt>. | Эта команда создаёт вспомогательных пользователей USER_a и USER_b и добавляет пользователя USER в группы <tt>hashman</tt>, <tt>USER_a</tt> и <tt>USER_b</tt>. | ||
Поскольку <tt>hasher-useradd</tt> добавляет пользователя в группы, пользователю необходимо перелогиниться (открытие нового терминала в X не поможет) перед началом работы с <tt>hasher</tt>. | Поскольку <tt>hasher-useradd</tt> добавляет пользователя в группы, пользователю необходимо перелогиниться (открытие нового терминала в X не поможет) перед началом работы с <tt>hasher</tt>. | ||
== Настройка сборочной среды == | |||
Для работы <tt>hasher</tt> требуется создать директорию, в которой будет строиться сборочная среда: | |||
$ mkdir ~/hasher | |||
Рабочий каталог (в данном случае <tt>~/hasher</tt>) должен быть доступен на запись пользователю, запускающему сборку. | |||
Кроме того, его нельзя располагать на файловой системе, которая смонтирована с опциями <tt>noexec</tt> или <tt>nodev</tt> — в таких услоиях <tt>hasher</tt> не сможет создать корректное сборочное окружение. | |||
Сборочное окружение можно создать явно: | |||
$ hsh --init ~/hasher<ref>Директория ~/hasher используется по умолчанию во всех операциях команды <tt>hsh</tt> и её можно опустить: <tt>hsh --init</tt></ref> | |||
Явное создание необязательно - при необходимости оно будет произведено при первой сборке пакета. | |||
<tt>hasher</tt> берёт пакеты для установки из APT-источников. По умолчанию в сборочную среду копируется список источников, указанный в конфигурации APT хост-системы, но это можно изменить с помощью альтернативного файла конфигурации APT: | |||
$ hsh --apt-config=~/branch4.1-apt.conf --init ~/hasher | |||
В таком файле конфигурации необходимо укзать расположение файла с APT-источниками: | |||
Dir::Etc::SourceList "/home/USER/sources.list.branch4.1"; | |||
После создания сборочной среды (неявного, при сборке пакета, или явного, с помощью <tt>--init</tt>) параметр <tt>--apt-config</tt> больше не нужен. | |||
== Сборка программ в hasher == | |||
Сборка происходит от обычного пользователя, добавленного с помощью <tt>hasher-useradd</tt>: | |||
$ hsh ~/hasher freetype-2.1.9-alt2.src.rpm | |||
При удачной сборке полученные пакеты будут лежать в <tt>~/hasher/repo/<платформа>/RPMS.hasher/</tt>, в противном случае на stdout будет выведена информация об ошибках сборки. | |||
Создаваемый <tt>hasher</tt> репозиторий является обычным APT-репозиторием и может быть использован в <tt>sources.list</tt>. Дополнительно, этот репозиторий будет использован при дальнейшей сборке пакетов (это поведение можно регулировать ключом <tt>--without-stuff</tt>). | |||
== Сборочные зависимости == | == Сборочные зависимости == | ||
Строка 47: | Строка 86: | ||
При сборке пакетов в [[Incoming]] при наличии <tt>/proc</tt> в сборочных зависимостях пакета эта файловая система будет смонтирована. | При сборке пакетов в [[Incoming]] при наличии <tt>/proc</tt> в сборочных зависимостях пакета эта файловая система будет смонтирована. | ||
== Сборка пакетов на <tt>tmpfs</tt> == | |||
При наличии достаточного количества памяти на сборочной машине сборку пакетов можно производить на [[enwp:Tmpfs#Linux|<tt>tmpfs</tt>]] - такая конфигурация заметно [[Hasher/Speed|ускоряет]] сборку. | |||
В качестве <tt>tmpfs</tt> можно взять уже смонтированный /tmp: | |||
$ mkdir /tmp/.private/$USER/hasher | |||
$ hsh --repo=$HOME/hasher-repo /tmp/.private/$USER/hasher somepkg-0.0-alt0.src.rpm | |||
Создавать директорию <tt>/tmp/.private/$USER/hasher</tt> придётся после каждой перезагрузки. Указывать <tt>--repo</tt> придётся для каждой сборки. | |||
Для сборки чего-нибудь тяжёлого возможно придётся в /etc/fstab увеличить размер <tt>tmpfs</tt>, смонтированной в /tmp: | |||
tmpfs /tmp tmpfs nosuid,'''size=1g''' 0 0 | |||
В [[altbug:16706|баге 16706]] идёт обсуждение создания более удобного средства для сборки на <tt>tmpfs</tt> и имеется предварительная реализация. | |||
== Примечания == | |||
<references/> |
Версия от 00:20, 17 августа 2008
Принцип действия
hasher — инструмент для сборки пакетов в «чистой» и контролируемой среде. Это достигается с помощью создания в chroot минимальной сборочной среды, установки туда указанных в source-пакете сборочных зависимостей и сборке пакета в свежесозданной среде. Для сборки нового пакета сборочная среда создаётся заново (за исключением кэширования образа базовой системы, которое не влияет на корректность и воспроизводимость результата).
Такой принцип сборки вызывает несколько последствий:
- Все необходимые для сборки зависимости должны быть указаны в пакете. Для облегчения поддержания сборочных зависимостей в актуальном состоянии в 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 не поможет) перед началом работы с hasher.
Настройка сборочной среды
Для работы hasher требуется создать директорию, в которой будет строиться сборочная среда:
$ mkdir ~/hasher
Рабочий каталог (в данном случае ~/hasher) должен быть доступен на запись пользователю, запускающему сборку.
Кроме того, его нельзя располагать на файловой системе, которая смонтирована с опциями noexec или nodev — в таких услоиях hasher не сможет создать корректное сборочное окружение.
Сборочное окружение можно создать явно:
$ hsh --init ~/hasher[1]
Явное создание необязательно - при необходимости оно будет произведено при первой сборке пакета.
hasher берёт пакеты для установки из APT-источников. По умолчанию в сборочную среду копируется список источников, указанный в конфигурации APT хост-системы, но это можно изменить с помощью альтернативного файла конфигурации APT:
$ hsh --apt-config=~/branch4.1-apt.conf --init ~/hasher
В таком файле конфигурации необходимо укзать расположение файла с APT-источниками:
Dir::Etc::SourceList "/home/USER/sources.list.branch4.1";
После создания сборочной среды (неявного, при сборке пакета, или явного, с помощью --init) параметр --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</tt:
rpm -bs --nodeps foo.spec
Сам hasher, в отличие от gear, не предъявляет никаких требований к разделению сборочных зависимостей на первый и второй тип. Однако для совместимости с gear и для улучшения документируемости spec-файла рекомендуется распределять их так:
- В поле BuildRequires(pre) помещать сборочные завимости, требуемые для сборки src.rpm,
- В поле BuildRequires — все остальные.
Монтирование файловых систем внутри hasher
Некоторым приложениям для сборки требуется смонтированная файловая система (например, /proc). hasher поддерживает монтирование дополнительных файловых систем в сборочную среду.
Монтирование происходит при одновременном выполнении следующих трёх условий:
- Необходимая файловая система указана в файле /etc/hasher-priv/fstab, либо является одной из /proc, /dev/pts, /sys.
- Необходимая файловая система указана в опции --mountpoints при запуске hasher, либо (что то же самое) в ключе known_mountpoints конфигурационного файла hasher.
- Необходимая файловая система укзана сборочной зависимостью (например, BuildReq: /proc) собираемого пакета, прямой или косвенной (через другие сборочные зависимости пакета).
Монтирование /proc
- known_mountpoints=/proc в конфиге hasher,
- BuildRequires: /proc в пакете.
При сборке пакетов в Incoming при наличии /proc в сборочных зависимостях пакета эта файловая система будет смонтирована.
Сборка пакетов на 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 придётся для каждой сборки.
Для сборки чего-нибудь тяжёлого возможно придётся в /etc/fstab увеличить размер tmpfs, смонтированной в /tmp:
tmpfs /tmp tmpfs nosuid,size=1g 0 0
В баге 16706 идёт обсуждение создания более удобного средства для сборки на tmpfs и имеется предварительная реализация.
Примечания
- ↑ Директория ~/hasher используется по умолчанию во всех операциях команды hsh и её можно опустить: hsh --init