Packaging/Vendoring

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

Многие пакеты (например, на Rust, Go, Node или Java) требуют во время сборки докачивания дополнительных модулей из сети. Так как в Hasher сеть по умолчанию недоступна, требуется заранее загрузить материалы из Интернета и включить их в архив. Это процесс называется «вендоринг» (vendoring).

Шаги сборки

1. Запускаем сборку без сети на существующей версии пакета.

2. После ошибки сборки, вызванной недоступностью сетевого ресурса (например, «Failed to fetch...») необходимо прописать свой DNS во внутрь хешера, для этого сначала можно посмотреть что у Вас за nameserver

  1. cat /etc/resolv.conf

Далее прописываем его в хешер $ hsh-shell --rooter

  1. echo nameserver 8.8.8.8 >> /etc/resolv.conf
  2. exit

Где 8.8.8.8 = вашему DNS, который вы увидели командой выше.

3. Далее заходим в хешер с параметрами разрешающими доступ в сеть Интернет

$ share_ipc=yes share_network=yes hsh-shell --mount=/dev/pts,/proc

4. Выкачиваем нужные модули (для Rust, Go или Node) или начинаем сборку из хэшерницы с доступным Интернетом:

4.1 Для начала сборки достаточно запустить RPM с указанием файла *.spec

Файл спек проекта расположен в каталоге cd /usr/src/RPM/SPECS/

Для запуска сборки внутри хешера запускаем rpm -ba *.spec

4.2 Для выкачивания нужных модулей необходимо зайти в каталог проекта

cd /usr/src/RPM/BUILD/ИМЯ_ПРОЕКТА

Далее выполнить

для Go

Выполняем команду

go mod vendor

Rust

Выполняем команду

cargo vendor

Тем самым по пути будет создан каталог vendor в который будут сложены все необходимые модули

информация по Java и Node оставлена из изначальной инструкции, возможно может не работать

Java

Запускаем сборку через

mvn

и сохраняем каталог ~/.m2/repository. (обратите внимание, не в текущем каталоге, а в домашнем). Можно в подкаталоге:

mvn -Dmaven.repo.local=${PWD}/m2/repository -DskipTests install

Node

Выполняем команду

yarn install

и сохраняем каталог node_modules.

5. В результате скачивания или непосредственно сборки образуются каталоги с модулями. Для Go и Rust как описано выше это будет каталог vendor внутри проекта.

Для maven модули складываются в ~/.m2/repository. информация из изначальной инструкции

Далее, для работы вне хешера, копируем каталог с модулями в изначальный каталог репозиторий и добавляем его в gear-репозиторий, либо собираем внутри хешера

ниже информация из изначальной инструкции, за ней будет информация по сборке вне хешера

Эти каталоги добавляем в gear-репозиторий и прописываем базовый путь в .gear/rules:

tar: m2 name=m2 base=.m2/repository
tar: pnpm name=pnpm base=.local/share/pnpm
tar: node name=node base=node

7. В спеке делаем распаковку:

Source1: m2.tar
Source2: pnpm.tar
Source3: node.tar
...
%prep
%setup
test -d ~/.m2 && rm -rf ~/.m2
tar xf %SOURCE1 -C ~
test -d ~/.local/share/pnpm && rm -rf ~/.local/share/pnpm
tar xf %SOURCE2 -C ~
tar xf %SOURCE3

8. Собираем штатным обазом.

Cборка вне хешера

Ниже информация о сборке вне хешера

После копирования из хешера каталога vender добавляем его в gear-репозиторий

Сделать можно двумя способами:

git add .

Но иногда gear-hsh может не увидить каталоги, для этого логично сделать описанные выше шаги по созданию rules и добавления распаковки внутри спека.

Однако, можно просто добавить полностью со всем содержимым каталог внутрь gear, и тогда не нужно прописывать отдельные правила по созданию второго tar и распаковки внутри спека, для это выполняется команда

$ git add --all -f vendor

А дальше нюанс:

Для GO этого будет вполне достаточно, можно просто начать собирать пакет, он подхватит модули с vendor

Для Rust необходимо еще прописать config.toml

Создаём каталог .cargo и добавляем файл config.toml где будут прописаны связи, чтобы при сборке сборщик понимал, что ему нужно брать файлы не с сети Интернет, а с каталога vendor.

$ mkdir .cargo $ cd .cargo $ touch config.toml

Далее вписываем в config.toml необходимую информацию, которая была указана в терминале после выполнения команды carogo vendor, обычно это

[source.crates-io] replace-with = "vendored-sources"

[source.vendored-sources] directory = "vendor"

Далее добавляем файл config.toml в git

$ git add .cargo/config.toml

После этого можно запускать сборку

Примеры пакетов

  • scratch-desktop
  • keycloak
  • jicofo
  • jitsi-videobridge