rpmbuild spec文件的编写,以及rpm包的打包

我这边主要是将java编写的程序打包为rpm包, 然后让用户使用这个rpm包进行安装, 因此本篇文章就主要说一下
如何使用rpmbuildspec文件对java程序进行打包.

java程序目录如何组织

关于java程序目录如何组织, 其实要求并没有太多, 因为我是使用maven-assembly-plugin插件对java程序进行打包的. 关于如何使用
maven-assembly-plugin插件因为涉及的内容比较多, 我专门写了一篇文章: 使用maven-assembly-plugin打包java
只说一点就是最终需要打出一个tar.gz的文件. 比如我打出来的agentDemo-1.0.0-bin.tar.gz文件. 打包出类似的这个文件以后就可以
编写spec文件了.

spec 文件的编写

说话是说如果想完整的学习spec文件的编写的话, 那么强烈推荐看看本文参考文章的第一篇: How to create an RPM package/zh-cn – FedoraProject
我当时也是看着这篇文章, 真正的零基础开始进行spec文件的编写. 只是对于其中的一些参数了解的不清楚, 然后参看了一下参考资料中
给出的第二篇文章使用rpm-build制作nginx的rpm包, 算是对spec文件的编写
有了一个七七八八的了解了.
当时话说回来, 如果你跟我当时一样, 不想完整的了解spec文件的方方面面, 仅仅是想非常快速的编写出可以正常使用的spec文件的话,
那么你看这篇文章就够了.

spec 模板

一个比较标准的spec文件的模板如下:

Name:
Version:
Release:	1%{?dist}
Summary:
Group:
License:
URL:
Source0:
BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires:
Requires:
%description
%prep
%setup -q
%build
%configure
make %{?_smp_mflags}
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%doc
%changelog

当时往往很多时候我们并不会非常完完整整的按照这个模板来, 可能会根据自己的一些需要删减一些信息, 那么我们只需要移除对应的部
分就好了. 下面我们详细的介绍一些这个模板的内容:

  • Name: 软件包名,应与 SPEC 文件名一致。命名必须符合软件包命名规定
  • Version: 上游版本号。如果包含非数字字符,您可能需要将它们包含在 Release 标签中。如果上游采用日期作为版本号,请考虑以:yy.mm[dd] (例如 2008-05-01 可变为 8.05) 格式作为版本号。
  • Release: 发行编号。初始值为 1%{?dist}。每次制作新包时,请递增该数字。当上游发布新版本时,请修改 Version 标签并重置 Release 的数字为 1。具体参考打包规定中的 Release 标签部分,以及 Dist tag。
  • Summary: 一行简短的软件包介绍。请使用美式英语。请勿在结尾添加标点!
  • License: 授权协议,必须是开源许可证
  • URL: 该软件包的项目主页。注意:源码包 URL 请使用 Source0 指定。
  • Source0: 软件源码包的 URL 地址。"Source""Source0" 相同。强烈建议提供完整 URL 地址,文件名用于查找 SOURCES 目录。如果可能,建议使用 %{name}%{version} 替换 URL 中的名称/版本,这样更新时就会自动对应。下载源码包时,需要 保留时间戳。如果有多个源码包,请用 Source1Source2 等依次列出。如果你需要添加额外文件,请将它们列在后面。
  • BuildRoot: 在 %install 阶段(%build 阶段后)文件需要安装至此位置。Fedora 不需要此标签,只有 EPEL5 还需要它。默认情况下,根目录为 "%{_topdir}/BUILDROOT/"
  • BuildRequires: 编译软件包所需的依赖包列表,以逗号分隔。此标签可以多次指定。编译依赖 不会 自动判断,所以需要列出编译所需的所有依赖包。常见的软件包可省略,例如 gcc。如果有必要,你可以指定需要的最低版本(例:"ocaml >= 3.08")。如果你需要找到包含 /EGGS文件的软件包,可执行 "rpm -qf /EGGS"。如果你需要找到包含 EGGS 程序的软件包,可执行 "rpm -qfwhich EGGS"。请保持最小依赖(例如,如果你不需要 perl 的功能,可使用 sed 代替),但请注意,如果不包含相关依赖,某些程序会禁用一些功能;此时,你需要添加这些依赖。auto-buildrequires 软件包可能会有帮助。
  • Requires: 安装软件包时所需的依赖包列表,以逗号分隔。请注意, BuildRequires 标签是编译所需的依赖,而 Requires 标签是安装/运行程序所需的依赖。大多数情况下,rpmbuild 会自动探测依赖,所以可能不需要 Requires 标签。然而,你也可以明确标明需要哪些软件包,或由于未自动探测所需依赖而需要手动标明。
  • %description: 程序的详细/多行描述,请使用美式英语。每行必须小于等于 80 个字符。空行表示开始新段落。使用图形安装软件时会重新格式化段落;以空格开头的行被视为已格式化的格式,一般使用等宽字体显示。
  • %prep: 打包准备阶段执行一些命令(如,解压源码包,打补丁等),以便开始编译。一般仅包含 "%autosetup";如果源码包需要解压并切换至 NAME 目录,则输入 "%autosetup -n NAME"
  • %build: 包含构建阶段执行的命令,构建完成后便开始后续安装。程序应该包含有如何编译的介绍。
  • %install: 包含安装阶段执行的命令。命令将文件从%{_builddir} 目录安装至 %{buildroot} 目录。
  • %check: 包含测试阶段执行的命令。此阶段在 %install 之后执行,通常包含 "make test""make check" 命令。此阶段要与 %build 分开,以便在需要时忽略测试。
  • `%clean:z 清理安装目录的命令。此阶段在 Fedora 中是多余的,仅针对 EPEL。一般只包含:
    rm -rf %{buildroot}
    
  • %files: 需要被打包/安装的文件列表。
  • %changelog: RPM 包变更日志。请使用示例中的格式。注意,不是软件本身的变更日志。

如果有时候想在安装rpm包之前自动安装一些需要的前置依赖, 或者在安装完成以后自己启动, 那么可以使用Scriptlets

SPEC Scriptlets

当用户安装 RPM 时,您可能想要执行一些命令。这可以通过 scriptlets 完成。请查看 Packaging/ScriptletSnippets
脚本片段可以:

  • 在软体包安装之前 (%pre) 或之后 (%post) 执行
  • 在软体包卸载之前 (%preun) 或之后 (%postun) 执行
  • 在事务开始 (%pretrans) 或结束 (%posttrans) 时执行

我的示例spec文件

Name:       agentDemo
Version:    1.0.0
Release:    1%{?dist}
Summary:    agent demo
Group:        Applications/Communications
License:    None
Source:        source.tar.gz
BuildRoot:   %{_topdir}/BUILDROOT/
%define prefix /home/q/agentDemo/
Requires: gcc,glibc-static,glibc-utils,wget,unzip
%description
my agent demo
%prep
%setup
%build
%install
sudo mkdir -p /home/q/agentDemo
rm -rf $RPM_BUILD_ROOT/*
sudo mkdir -p $RPM_BUILD_ROOT%{prefix}
sudo mkdir -p $RPM_BUILD_ROOT%{prefix}/bin
sudo mkdir -p $RPM_BUILD_ROOT%{prefix}/default
sudo mkdir -p $RPM_BUILD_ROOT%{prefix}/java
sudo mkdir -p $RPM_BUILD_ROOT%{prefix}/runit
cp -R * $RPM_BUILD_ROOT%{prefix}
%post
sudo /home/q/agentDemo/bin/agent.sh start
%preun
sudo /home/q/agentDemo/bin/agent.sh stop
%postun
sudo /bin/rm -rf /home/q/agentDemo
sudo /bin/rm -rf /etc/agentDemo_runit
%clean
rm -rf %{buildroot}
%files
%defattr(-, root, root, 0755)
/%{prefix}
%changelog
*  Wed Feb  8 2017 first Release <me@wenchao.ren>
- first Release

使用rpm进行打包

将编写的agentDemo.spec文件放在某个目录下面, 比如build目录下面:

sudo mkdir build
sudo chmod -R a+rwx build
sudo cp agentDemo.spec build/
cd build
sudo mkdir SOURCES
## 需要确保agentDemo-1.0.0.tar.gz文件存在
## 并且需要确保这个tar.gz包解压以后的目录名格式为:agentDemo-[version],而且version不能带-SNAPSHOT,
## 因为spec文件中的Version值不能不能带-。 一个可用的格式为:agentDemo-1.0.0
sudo ln -s SOURCES/agentDemo-1.0.0.tar.gz SOURCES/source.tar.gz
sudo yum install rpm-build -y
sudo rm -rf BUILD BUILDROOT RPMS SPECS SRPMS && sudo rpmbuild --define "_topdir `pwd`" -bb agentDemo.spec
## 执行完成以后打的rpm包在 RPMS/x86_64/目录下, 可以使用下面的shell直接安装
#sudo rpm -ivh  RPMS/x86_64/agentDemo-1.0.0-1.el6.x86_64.rpm

参考资料

本文版权归作者所有,禁止一切形式的转载,复制等操作
赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注