Соберите все зависимости rpm для развертывания проекта

Мне нужно развернуть программный проект (упакованный как rpm) с компьютера разработчика на сервер. Я использую Fedora 23 вместе с менеджером пакетов dnf. Я должен собрать все зависимости моего rpm перед развертыванием на сервере. Сервер не может быть подключен к Интернету из-за внутренних правил (но я могу подключиться к нему по ssh). Запуск зеркал репозитория и т. Д. Не вариант. Боюсь, мне просто нужно собрать все зависимости на компьютере разработчика, скопировать (или ответить) их на сервер и установить на сервере.

Я надеялся что --installroot опция в dnf может быть очень полезна, так как я могу получить все rpms, которые будут установлены в то, что dnf считает пустой системой. Это, однако, не работает.

mkdir foo && sudo dnf install --installroot=$PWD/foo golang

выдает ошибку:

Failed to synchronize cache for repo 'fedora'

Почему это не удается? Какие у меня варианты?

Я хотел бы видеть элегантное и надежное решение. Я бы предпочел не устанавливать что-либо на сервер (я был бы очень рад сделать один scp, а затем одну или две команды через ssh). Было бы неплохо сочетание магии rpm + yum / dnf, но интерес представляют и другие решения, в том числе apt + deb. Я бы предпочел не использовать docker, и я категорически против запуска какой-либо дополнительной инфраструктуры (реестра Docker, зеркала rpm и т. Д.)

1 ответ

Решение

Вот скрипт (ad hoc, слегка протестированный) (при условии, что у вас уже установлена ​​система rpm) для генерации списка всех имен пакетов rpm, необходимых для установки данного пакета (скрипт предполагает target ="bash", отредактируйте по вкусу).

Подайте выходные имена в dnf/yum для установки.

#!/bin/sh
goal=bash
deps=$(rpm -q --qf '[%{REQUIRENAME}\n]'  $goal | egrep -v '^(rpmlib|rtld|config|/)')
goals=
while true; do
  subs=$(rpm -q --qf '%{NAME}\n' --whatprovides $deps | sort -u | tr '\n' ' ')
  if [ ."$subs" = ."$goals" ]; then
    echo "--- packages needed"
    echo "$goals" | tr ' ' '\n'
    exit 0
  fi
  goals=$(echo $goals $subs | tr ' ' '\n' | sort -u | tr '\n' ' ')
  for sub in $subs; do
    subdeps=$(rpm -q --qf '[%{REQUIRENAME}\n]' $sub | egrep -v '^(rpmlib|rtld|config|/)')
    deps=$(echo $deps $subdeps | sort -u)
  done
done
Другие вопросы по тегам