如何(强制)在Centos

时间:2017-11-01 10:03:07

标签: continuous-integration centos7 yum continuous-deployment

在ci / cd环境中,我希望能够将软件包更新或降级到特定版本。要使用yum执行此操作,需要知道已安装的packge版本,例如,可以使用yum install安装新软件包或更新到更新版本。 yum downgrade可用于将其替换为早期版本。

有没有办法使用一个命令来安装特定版本的软件包?

背景:我们不断在神圣通道中添加新的包版本,因此我们的yum通道并不真正反映stable状态。一个人应该能够安装或降级一个yum install <package_name>-<package_version>

的特定包

2 个答案:

答案 0 :(得分:1)

  

应该能够使用一个yum install <package_name>-<package_version>

安装特定的包

事实上。你试过吗?因为这是用于安装具有yum的特定包的确切命令。

答案 1 :(得分:0)

更新#2 (请参阅下面的旧答案)

现在采用以下方法:

  1. 检查已安装的版本
  2. 如果已安装指定版本,则不执行任何操作
  3. 如果安装了较新版本,请执行yum downgrade
  4. 否则,执行yum install(也会更新)
  5. 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'(其中architectureepoch可能会被省略),而只是指定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"