3

我对 RPM 相当陌生,但我一直在玩它,需要做一些事情。

我必须遵守规定我必须在每个环境中使用相同的 rpm 包,我不能使用 %pre 和 %post 来修改文件。

问题是我的安装没有进行制作,事实上我正在复制文本文件和 xml 文件的文件结构。然而,这些文件包含特定于环境的代码,但遗憾的是我必须遵循这些准则。

我考虑过的“解决方案”是使用几个源文件,source0 是 dev,source1 是 test,source2 是生产,而 source3 是灾难恢复。每个源都提取到具有环境名称的文件夹(这是需要的!)

$deploy_folder/dev_code

$deploy_folder/test_code

$deploy_folder/prd_code

我将获得一个环境变量,它告诉我环境。

到目前为止,我已经部署了所有源,然后使用条件删除了不必要的文件夹

如果 [[ $env_variable == "PRD" ]] ; 然后

rm -rf $buildroot/install/$deploy_folder/dev_code

rm -rf $buildroot/install/$deploy_folder/test_code

*我已经稍微简化了上面的变量

这似乎在构建时起作用,但是当我执行 rpm -i 时,它不会部署所有代码然后删除最终目的地的其他文件夹。

显然,我可能没有以正确的精神使用 RPM,所以我这样做的方式是否正确?鉴于我的文件基本上都是特定于环境的,有没有更好的方法?

如何访问部署到最终目的地的代码?

谢谢

4

1 回答 1

2

您要问的是用于开发、测试和生产环境的单个 rpm。在构建时,您显然需要构建所有文件。我假设您正在构建一切正常,即在 %build 部分中您已将文件复制到

$RPM_BUILD_ROOT/$deploy_folder/dev_code
$RPM_BUILD_ROOT/$deploy_folder/test_code
$RPM_BUILD_ROOT/$deploy_folder/prd_code

之后将这些文件包含在使用 %files 部分生成的 rpm(s) 中。

您始终可以使用以下命令检查 build rpm 是否在正确位置包含文件:

rpm -qpl <rpm file.rpm>

因为您希望在安装时基于环境变量的存在进行安装,所以可以使用 %post。这是安装 rpm 后使用的部分。如果您想在卸载期间进行一些清理,您可以使用 %postun(或 %preun)部分。假设 $TESTENV 是环境变量,其中 PRD 用于生产,DEV 用于开发,TEST 用于测试,可以使用 %post 部分中的以下部分:

if if [ "$TESTENV" = "PRD" ]; then
    rm -rf $deploy_folder/dev_code
    rm -rf $deploy_folder/test_code
fi
if [ "$TESTENV" = "DEV" ]; then
    rm -rf $deploy_folder/prd_code
    rm -rf $deploy_folder/test_code
fi
if [ "$TESTENV" = "TEST" ]; then
    rm -rf $deploy_folder/dev_code
    rm -rf $deploy_folder/prd_code
fi

不推荐为 PRD、TEST、DEV 创建单个 rpm,但如果您的要求是这样,您的方法似乎没问题。

%pre、%post、%preun、%postun 是安装时使用的部分,可以在安装时检查环境变量。显然,您不能在构建时执行此操作,因此您必须使用这些部分。如果您必须避免使用它们,那么您可能希望放弃对所有产品、开发和测试使用单一 rpm 的想法。降低单个 rpm 是一个更好的主意。单个规范文件可以为 prod、test 和 devel 创建三个不同的 rpm,也可以作为 syb 包。另一种方法是为所有三个产品生成单独的 rpm,并从单个规范进行测试和开发(这不会区分不同的环境,并且 rpm 中没有类似文件的 3 个副本。

于 2012-10-20T09:37:31.367 回答