在ci / cd环境中,我希望能够将软件包更新或降级到特定版本。要使用yum执行此操作,需要知道已安装的packge版本,例如,可以使用yum install
安装新软件包或更新到更新版本。 yum downgrade
可用于将其替换为早期版本。
有没有办法使用一个命令来安装特定版本的软件包?
背景:我们不断在神圣通道中添加新的包版本,因此我们的yum通道并不真正反映stable
状态。一个人应该能够安装或降级一个yum install <package_name>-<package_version>
答案 0 :(得分:1)
应该能够使用一个
安装特定的包yum install <package_name>-<package_version>
事实上。你试过吗?因为这是用于安装具有yum
的特定包的确切命令。
答案 1 :(得分:0)
更新#2 (请参阅下面的旧答案)
现在采用以下方法:
yum downgrade
yum install
(也会更新)install-utils.sh:
#!/usr/bin/env bash
EXIT_FAILURE=1
function get_installed_version() {
pkg_name=$("rpm -q --queryformat \
'%{NAME}-%{VERSION}-%{RELEASE}' ${pkg_name}" | tail -1)
[ $? -ne 0 ] && pkg_name=""
echo ${pkg_name}
}
function is_version_newer() {
[[ $1 != $(echo -e "$1\n$2" | sort -V | head -1) ]]
}
function install_package(){
local pkg_name="$1"
local pkg_ver_rel="$2"
local pkg_full_name="${pkg_name}-${pkg_ver_rel}"
echo "Package to install: $pkg_full_name"
installed_pkg="$(get_installed_version $pkg_name)"
echo "Package version installed: $installed_pkg"
if [[ "$installed_pkg" == "$pkg_full_name" ]]; then
echo "Requested package version '$pkg_full_name' is " \
"already installed. Nothing to do."
elif is_version_newer "$installed_pkg" "$pkg_full_name"; then
echo "Downgrading to $pkg_full_name ..."
yum -y downgrade $pkg_full_name \
&& echo "Successfully downgraded to $pkg_full_name" \
|| { echo "Failed to downgrade to $pkg_full_name"; exit $EXIT_FAILURE; }
else
echo "Installing $pkg_full_name ..."
yum -y install $pkg_full_name \
&& echo "Successfully installed package $pkg_full_name" \
|| { echo "Failed to install $pkg_full_name"; exit $EXIT_FAILURE; }
fi
}
OLDER UPDATE :(以下答案)不是一个好方法。原因:通常,未完全指定要安装的版本。因此,不是提供“version
- release
- architecture
- epoch
'(其中architecture
和epoch
可能会被省略),而只是指定version
,意思是:应使用version
的最新可用包。 (例如,请参阅此answer以“RPM的名称版本发布的规则是什么?”)。这里给出的方法将导致隐式降级到最后一个可用版本。
例如,要安装版本:'0.11.1',已安装版本:0.11.1-1。上游可用的是'0.11.1-SNAPSHOT20171030093532'和'0.11.1-2'。安装将更新到最新的'0.11.1-2',但这与pkg_full_name
不匹配,因此执行yum downgrade
,让包管理器选择要安装的快照版本
INITIAL ANSWER
目前,我最好的猜测是使用yum install
,'(检查已安装的版本)'和yum downgrade
的某种组合,如果它不是指定的版本。
例如:
pkg_name="somepackage"
pkg_full_name="somepackage-1.0.4-SNAPSHOT20171027143208"
echo "Installing $pkg_full_name ..."
yum -y install $pkg_full_name || \
{ echo "Failed to install $pkg_full_name"; exit 1; }
installed_package=$(rpm -q --queryformat '%{NAME}-%{VERSION}-%{RELEASE}' ${pkg_name})
if [ "${installed_package}" != "${pkg_full_name}" ]; then
sudo yum -y downgrade $pkg_full_name || \
{ echo "Failed to downgrade to $pkg_full_name"; exit 1; }
fi
echo "Successfully installed package $pkg_full_name"