构建RPM包以选择性地部署源

时间:2012-10-19 17:50:00

标签: packaging redhat rpm rhel

我是RPM的新手,但我一直在玩它,需要做一些左侧的事情。

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

问题是我的安装没有做make,事实上我正在复制文本文件和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,所以我这样做是正确的吗?是否有更好的方法,因为我的文件基本上都是特定于环境的?

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

由于

1 个答案:

答案 0 :(得分:2)

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

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

之后包含使用%files部分生成的rpm文件。

您始终可以使用以下方法检查构建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创建单个rpm,TEST,DEV不是推荐的做事方式,但如果您的要求是这样,您的方法似乎没问题。

%pre,%post,%preun,%postun是在安装时使用的部分,可以在安装时检查环境变量。你不能在构建时明确地做到这一点,所以你必须使用这些部分。如果你必须避免它们,那么你可能想要放弃所有prod,devel和test的单个rpm的想法。降低单个转速是一个更好的主意。单个spec文件也可以为prod,test和devel创建三个不同的rpms作为sybpackages。其他方法是为所有三个prod生成单独的rpms,并从单个规范进行测试和开发(它不区分不同的环境,并且在rpms中没有3个类似文件的副本。