收集所有rpm依赖项以部署项目

时间:2016-06-20 16:05:31

标签: deployment rpm yum

我需要将一个软件项目(打包为rpm)从开发人员机器部署到服务器中。我正在使用Fedora 23和dnf包管理器。在部署到服务器之前,我必须收集rpm的所有依赖项。由于内部监管,服务器无法连接到互联网(但我可以将其连接到网上)。运行存储库镜像等不是一种选择。我担心我只需要收集开发人员机器上的所有依赖项,scp(或ansible)它们到服务器并将它们安装在服务器上。

我希望dnf中的--installroot选项可以提供很多帮助,因为我可以检索所有将被安装到dnf认为是空系统的rpms。然而,这不起作用。

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 个答案:

答案 0 :(得分:2)

这是一个(临时的,经过轻微测试的)脚本(假设你已经安装了rpm系统)来生成安装给定包所需的所有rpm包名称的列表(该脚本假设goal =" 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