Packaging/Vendoring
Многие пакеты (например, на Rust, Go, Node или Java) требуют во время сборки докачивания дополнительных модулей из сети. Так как в Hasher сеть по умолчанию недоступна, требуется заранее загрузить материалы из Интернета и включить их в архив. Это процесс называется «вендоринг» (vendoring).
Шаги сборки
1. Запускаем сборку без сети на существующей версии пакета.
2. После ошибки сборки, вызванной недоступностью сетевого ресурса (например, «Failed to fetch...») необходимо прописать свой DNS во внутрь хешера, для этого сначала можно посмотреть что у Вас за nameserver
- cat /etc/resolv.conf
Далее прописываем его в хешер $ hsh-shell --rooter
- echo nameserver 8.8.8.8 >> /etc/resolv.conf
- 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
hsh-install ca-certificates
Rust
Установить пакет
apt-get install -y cargo-vendor-filterer
Выполнить команду
cargo-vendor-alt
Тем самым по пути будет создан каталог 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