RPM打包利器RPM_CREATE

Normal
0

7.8 磅
0
2

false
false
false

MicrosoftInternetExplorer4

      
RPM

Redhat Package Manager
的简称,是由

redhat
公司研制,用在

Linux
系统下的系统包管理工具。

RPM
包目的:是使软件包的安装和卸载过程更容易,简化软件包的建立分发过程,并能用于不同的体系结构,

RPM

系统已成为现在

Linux

系统下包管理工具事实上的标准,并且已经移植到很多商业的

unix

系统之下

      
rpm
打包可以通过编写

spec
文件,使用

rpmbuild
来完成一个

rpm
的打包。

      
使用

spec
文件的方式打包,对于初学者最难理解的是

install

file
节点编写的关系,并且复杂的是,还需要学习

spec
语言中特有的语法和环境变量关系。其次是打包过程,打

rpm
包前需要先把打包的内容,打成

tar.gz
的包,然后拷贝到

rpmbuild
的源码目录内,大部分是

/usr/src/redhat/SOURCES
这个目录,之后再把

spec
文件拷贝到

/usr/src/redhat/SPECS
目录,然后执行打包命令

rpmbuild –bb xxx.spec
,到

/usr/src/redhat/rpms/i386(32
位系统

)
找到新打的包。当然整个过程可以编写

shell
脚本来模拟上述步骤,最终得到打包后的文件。但是

shell
脚本必须和每个项目结合起来,也就是每开一个项目,都要编写与之对应的一个

shell
文件,并且一样要编写

spec
文件,这并没有彻底解决使用

spec
打包的繁琐问题。

      
学习使用

rpmbuild
打包,学习曲线比较陡峭,并且整个打包过程比较繁琐,尤其当一个产品上线时,如果发现一个

bug
,需要快速修改调用,那么快速打新包是必须,因为线上环境每晚一刻就可能影响数千人的用户体验,而采用

rpmbuild
的方式整个过程非常繁琐,有没有更好更快的方式,作为参考有

checkinstall

      
checkinstall
是一个能从

tar.gz
类的源代码自动生成

RPM

Debian

Slackware
安装包的程序。通过

checkInstall
,你就能用几乎所有的

tar.gz
类的源代码来生成“干净”的安装或者卸载包。

checkinstall
的使用非常方便,可以从

checkinstall-1.6.1-1.i386.rpm

获取

checkinstall

rpm
包,直接部署到我们的机器上,但是我们要打造自己的

checkinstall
,所以我们最好下载源代码来,

获取源代码

checkinstall
的原理是追踪

makefile
中的

install
操作(其实是

checkinstall
中的

installwatch
完成此项工作),记录下整个文件相关变化,并最终生成

spec
文件,然后执行

rpmbuild
打包操作,完成打包过程。

但是真实使用

checkinstall
打包时,有个难题。

checkinstall
获取版本号默认的是通过目录名获取的,也就是说我们每次更新一下包都需要更改目录名,当然版本号也可以采用手工输入的方式,面临同样问题的还有包的名称,释放版本号,包依赖,打包者,版权,简介等,这些信息每次打包时,都需要重复填写,对于我们偶尔打个包,这种输入是无所谓的,但是如果频繁打包的话,这样的过程会非常繁琐,并且还容易出错。看我们碰到的问题是,

spec
文件难写,打包繁琐;

checkinstall
只需要些

makefile
文件的

install
操作即可打包,脚本编写简单,但是交互太多,所以,我决定开发一种新的打包方式,简化流程,并结合

spec

checkinstall
的优点,这就是

rpm_create

rpm_create
打包时,只需要编写

citb
格式文件,当然你会说,

rpm_create
一样需要些打包的配置文件,并没有简化流程。是的,

rpm_create
一样需要编写打包配置文件,流程似乎没有改变,其实不对。看看

citb
文件格式就知道,下面是

rpm_create
带的实例文件,安装

rpm_create
后,

/usr/local/lib/checkinstall/example.citb
既是文件。

###############################################################
# author: ugg
# mail: ugg.xchj@gmail.com
# url: http://code.google.com/p/rpmcreate/
###############################################################
# 需要包的名称
Name: tpm_create_test
# 包的版本信息
Version: 1.0.0
# 释放版本号
Release: 1
# 依赖包
Requires: php , httpd
# 创建者
Packager: ugg
# 摘要信息
Summary: by ugg test
# 版权
copyright: company
# 指定包目标环境平台( i386 对应 32 系统, x86_64 对应 64 系统, noarch 不区分系统)
Architecture: noarch

PEARPATH=/usr/lib/php/pear/tbs/apps/customhtml
HTDOCSPATH=/var/www/htdocs/apps/customhtml

# 安装脚本开始命令 , 以下部分可以从和 Makefile 中的内容相同即可
install:
        mkdir -p $(PEARPATH)
        mkdir -p $(HTDOCSPATH)
        cp -r ../../src/htdocs/*.php $(PEARPATH)/customhtml
        cp -r ../../src/pear/*.php $($HTDOCSPATH)/customhtml

# 以下 shell 命令,要以 TAB 开始每一行
pre:
# 每行命令以 TAB 开始 , 安装包前执行命令
#       sudo apachectl restart

preun:
# 每行命令以 TAB 开始 , 卸载包前执行命令
#       sudo apachectl restart

postun:
# 每行命令以 TAB 开始 , 卸载包后前执行命令
#       sudo apachectl restart

post:
# 每行命令以 TAB 开始 , 删除目录机上的 .svn 目录,安装包后执行
# 注意 find 命令后面的路径必须为目录机上的全路径,不能用其他变量替换全路径
#       find /usr/lib/php/pear/tbs/apps/customhtml  -type d -name ".svn"|xargs rm -rf 
#       find /var/www/htdocs/apps/customhtml  -type d -name ".svn"|xargs rm -rf

# 打包日志,同 rpm 中的 %changelog
changelog:
# 每行日志以 TAB 开始
        * Wed May 20 2009 changjing.xu  %{Version}

 

整个打包配置文件就是如此简单,需要打包时。您只需要更改包的名称,版本号,文件拷贝工作通过

install
节点完成。

Install
里面的操作很简单,就是写

shell
基本即可

比方说,我们和

.citb
文件同级目录下的

test.php
文件,打包安装目标机的

/var/www/htdocs
目录下,那么我就可以这样写

cp ./test.php
/var/www/htdocs/

看见了,就这么简单。具体例子可以参考

例子

好了,写完

citb
文件后,接下来就执行打包命令了

rpm_create
[-citb] xxx.citb
    打包完成后,包自动放到与

citb
同级目录下,

-citb
参数可以省略,

rpm_create
一样支持

spec
打包方式,也可以

rpm_create –spec xxx.spec
打包

spec
格式文件。

rpm_create
还有如下特点如下

      * 打包命令简单,所需要操作就是指定要打包的 citb 文件。
      * 目录随意, citb 可以放置在任意目录内。
      * 打包后的文件,放在和 citb 同级目录内。
      * 相对于 spec ,更简单的 citb 格式文件编写。只要您会写 shell ,就会写 citb 文件。
      * 支持多个 citb 文件同时打包 rpm *.citb 。
      * 支持 spec 格式文件打包。
      * 项目开源,可以随意修改使用。
      * 支持 32-64 系统(已经经过测试)

其实

rpm_create
并没有多高深技术原理在里面,其实我也是在

checkinstall
之上做的封装。简单的说,我修改了原

checkinstall
脚本,为

checkinstall
脚本增加了解析

citb
文件的格式,这个

checkinstall
就可以解析

citb
格式文件中的

Name

Version

Release
等信息,然后

checkinstall

citb
格式文件最终转化为

spec
格式文件,然后调用

rpmbuild
进行打包操作,打包完成后,把

rpm
包拷贝到

citb
格式目录,而

rpm_create
的作用,就是实现检测

citb
的后缀格式是否正确,用来支持同时打多个包操作,我们用一幅图描述上面的关系

rpm_create
来打包原理和

rpmbuild
打包原理是不同的。使用

rpmbuild
打包时,可以直接打源代码包,而

rpm_create
不能打;也就是说

rpm_create
打包时,需要指定源到目的关系,这时候的源是必须存在的文件,而不能是编译后产生的。比如说我们打包一个

C/C++
语言编写的包。

使用

rpmbuild
打包时,我们可以在

spec
指定编译操作,然后把编译后的

.so
文件拷贝到指定目录下,来完成打包。而使用

rpm_create
,您需要自己先手工完成

C/C++
语言的编译工作,产生

.so
文件,然后在

citb
文件中指定这种对应关系。根据我们的经验,这种源代码类型的包,在企业中应用场景比较少的,企业对源代码的管理,基本都是通过

SVN
来管理,真正在生产环境部署时,还是以直接的二进制包为主。对于像

php
这种语言的包来说,根本就无需编译过程的,所以也是不需要编译的,所以这个问题对

rpm
打包并不会有太大影响,但是如果确实需要打源代码包,那么需要您写

spec
文件了。

我们在扩展

rpm_create
时,还需要满足另外一种需求。我们在开发环境下开发完成,并打包后,然后把这个包部署到测试环境上进行测试,测试没有问题后,直接上生产环境,在开发,测试,生产环境上的包应该是一致的。这里就有一个问题,如果我们的产品有连接数据库等设置,那么我们在不同的环境下安装完成包后,需要修改配置文件,更改不同的数据库连接主机,部署包后,直接修改配置文件,这是很危险的操作,有可能造成修改错误,影响产品发布。而在整个打包过程只有开发人员熟悉自己代码结构,了解在开发,测试,生产数据库的

host
,如果开发人员不在的话,

appops
就不会修改配置文件,所以这些都是很危险的,为此我为

citb
新增

3
个节点,

dev,tst,prd

# dev 环境下执行的 shell 命令
       dev:
#       echo "dev"
# tst 环境下执行的 shell 命令
tst:
#       echo "tst"
# prd 环境下执行的 shell 命令
prd:
#       echo "prd"

dev-
表示在开发环境下,执行的

shell
命令,同理

tst
是测试环境,

prd
是生产环境。当然,

rpm
包本身是没有方法可以判断一台服务器是开发,还是测试的。所以,我们的办法是创建

/var/tpm/create/tpm
文件,如果在开发服务器创建,就在里面写

dev
,同理在测试服务器上就写

tst
,生产服务器上写

prd
,按照这样的约定,只需要我们在打包的过程,在

citb
的相关节点上写明在不同环境下的操作,那么安装这个包时,我们就无需手工更改配置文件了。这种方式,也可以通过

spec
方式来支持,如果感兴趣可以联系我。

rpm_create
开源链接

http://code.google.com/p/rpmcreate

rpm
包直接下载

http://code.google.com/p/rpmcreate/downloads/list

相关资料链接:

checkinstall
http://asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.1.tgz

rpm_create
地址

http://code.google.com/p/rpmcreate

时间: 2024-08-03 09:04:36

RPM打包利器RPM_CREATE的相关文章

Centos6_64 rpm打包实践

安装rpmbuild sudo yum install rpm-build 普通用户的配置 /home/you/rpmbuild/ 假设是要构建rpm的目录   先说说rpmbuild有什么用,给一个例子: echo "%  _topdir/home/you/rpmbuild" > ~/.rpmmacros mkdir -p /home/you/rpmbuild/{SPECS,BUILD,SRPMS,RPMS,SOURCES}   /usr/lib/rpm/macros 中配置可

rpm打包和yum安装,以及安装后自启动

rpmbuild 可以把源文件或者二进制文件打包成rpm包,rpm包可以放到源上进行分发. 执行rpmbuild --showrc  |grep topdir,可以找到rpmbuild 执行的根目录, 如果仅仅希望给把二进制文件打包成rpm包,那么把二进制文件放到  $topdir/BUILD/ 目录下. 编写${binary}.spec Summary: client Name: client Version: 0.6 Release: 1 Vendor: company License: c

[坑]打rpm包时,注意%post和%postun的执行顺序

问题 掉进坑里面了.最近完成了阿里PHP5.5.25的rpm打包.今天在升级其中一个扩展的时候发现,只要升级成功之后,扩展在配置文件中相关配置项就会被注释掉.最终定位到是spec文件中%postun段写的有问题. spec文件中%postun段的代码示例如下: %postun conf_path="/php-fpm/lib/php.ini" sed -i 's/^\[tclip\]/;\[tclip\]/g' $conf_path sed -i 's/^extension=tclip.

Linux源码包制作RPM包之Apache

公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能节约不少的时间. 有关内网yum源的搭建,可以参考<烂泥:yum的使用及配置>这篇文章. 一.安装rpm-build 查阅相关资料得知,要把源码包制作成rpm包需要使用rpm打包工具rpm-build. rpm-build通过rpmbuild命令根据本地源码包,通过spec文件中的规则就可以把源码包制作成rpm包. 现在我们来安装rpm-bu

centos 6.5系统下使用rpmbuild打包包含共享库的软件

问题描述 centos 6.5系统下使用rpmbuild打包包含共享库的软件 目的:项目组的一个跨平台软件,现在需要生成xxxx.rpm软件包,以便可以直接使用系统自带的命令安装(rpm和yum等),及后期加补丁和升级. 进展: 1. 本人使用的是rpm打包工具,其中的spec文件内容如下: Name: ads Version: 1.0.0 Release: 1 Summary: GNU hello test for rpm building Group: Development/Tools L

CentOS 6.6 x86_64 RPM包制作教程

一.RPM包介绍 对RPM包有五种基本的操作功能:安装.卸载.升级.查询和验证.linux软件包分为两大类:    1. 二进制类包:包括rpm安装包(一般分为i386和x86_64这几种)     2. 源码类包:源码包和开发包(.src.rpm)都是属于此类 有时候为了方便源码包的安装,和我们自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有源码包就可以直接编译得到二进制安装和其他任意包,另外,我们也可以使用rpm包来打包一些文件或者自己开发的一套软件,使用rpm有数

Linux系统下软件包的制作方法和过程

  总的情况下Linux下软件安装主要有三种方式: 一种是源码安装,需要用户自己手动编译 另一种是RPM包(RedHat Linux Packet Manager),通过RPM命令就可以实现安装 还有一种为*.bin文件,安装方法与Windows下的安装过程类似 通常情况下Linux 安装软件主要通过以下两种方式 ① 文件名形如xxx.i386.rpm ,软件包以二进制形式发布. ② 文件名形如xxx.tar.gz ,软件包多以源码的形式发布. Linux软件包管理可以分为三类:二进制包的管理,

PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户)

标签 PostgreSQL , Linux , CentOS 背景 新用户部署PostgreSQL以及空间数据库插件PostGIS的指南. 内网环境RPM打包(可选项) 如果是内网环境,可以将包全部下载到本地再用rpm安装. 安装epel和postgresql yum rpm两个包后再执行: 1.使用yum-utils的yumdownloader下载需要的安装包,包括依赖包. yum install -y yum-utils yumdownloader --resolve --destdir=/

rhel源更换为centos源

1 删除rhel自带的yum包: rpm -aq | grep yum |xargs rpm -e --nodeps 2 安装yum: [china~/yum_64#]rpm -ivh python-iniparse-0.3.1-2.1.el6.noarch.rpm warning:python-iniparse-0.3.1-2.1.el6.noarch.rpm: Header V3 RSA/SHA256 Signature, keyID c105b9de: NOKEY Preparing...