用fpm便捷地打RPM包

来源:互联网 发布:怎么上传压缩包到淘宝 编辑:程序博客网 时间:2024/04/29 06:31

        在日常的开发中,经常需要把二进制执行文件部署到线上机上,一两台机器可以直接打个tar.gz包,rz 或scp到线上机解压即可,但是目标代码需要部署在N多线上机时,这种做法就力不从心了,特别是目标代码分布在多个文件夹下时,更是耗时耗力。我们一般的做法是打个RPM包,把它放在yum源上,ssh到线上机就可以yum install *.rpm,或者更方便地通过salt stack 之类的批量命令执行工具进行批量yum install ,真是太爽歪歪了!

         但是一想到要编写各种规则的SPEC文件,就开始头大,我Y的就为了安装一个简单的程序还需要去了解你这so复杂的SPEC规则吗?还好最近发现了一个叫fpm的开源软件,可以让我不在畏惧打包了。下面我们就说说fpm是怎么帮助我搞定工作的。

1、安装fpm

$ yum -y install ruby rubygems ruby-devel  $ gem sources --remove https://rubygems.org/  $ gem sources -a http://ruby.taobao.org/  $ gem sources -l    *** CURRENT SOURCES ***      http://ruby.taobao.org  # 请确保只有 ruby.taobao.org,如有其它url则gem sources --remove掉  $ gem install fpm    # 安装fpm,-V是显示安装细节,不会一直没反应
安装好了就可以正式开始打包了。

2、fpm主要参数介绍

-s   输入文件的类型,dir 表示输入是文件或文件夹,其他可取值gem, rpm, python等
-t   fpm输出格式类型,通常可取cpan, deb, dir, empty, gem, npm, osxpkg, pear, puppet, python, rpm, solaris, tar 等
-n  安装包的名字
-v  安装包的版本号
-d 安装包所依赖的库
-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
-p 输出的安装包的目录,不想放在当前目录下就需要指定

3、实战

通常在安装开源软件时,都会通过 --prefix 的指定安装路径,我们以安装tcpcopy为例来讨论fpm的用法。
$ ./configure --prefix=/tmp/tcpcopy &&make && make install
3.1 安装完后我们在/tmp/tcpcopy目录下得到了所有的可执行文件,把它们打成rpm包,如下:
$ fpm -s dir -t rpm -n tcpcopy -v 0.8.0 /tmp/tcpcopy$ Created rpm {:path=>"tcpcopy-0.8.0-1.x86_64.rpm"}
查看rpm包中文件信息
$ rpm -qpl tcpcopy-0.8.0-1.x86_64.rpm$ /tmp/tcpcopy/bin/intercept$ /tmp/tcpcopy/tmp/tcpcopy/bin/tcpcopy
3.2 我们可以看到路径前面多了/tmp/tcpcopy,这不是我们想要安装的目标路径,所有需要进行改进。如下:
$ fpm -s dir -t rpm -n tcpcopy -v 0.8.0 -C /tmp/tcpcopy bin   # -C表示在打包前转到/tmp/tcpcopy$ /bin/intercept$ /bin/tcpcopy 
这样就满足了我们的要求。
3.3 假设tcpcopy依赖一个通用的so文件,我们希望这个so文件在目标机上的路径为/usr/lib64,这样就有了第三版fpm:
$ fpm -s dir -t rpm -n tcpcopy -v 0.8.0 -C /tmp/tcpcopy bin  /usr/lib64/libsoftokn3.so $ /bin/intercept$ /bin/tcpcopy$ /usr/lib64/libsoftokn3.so
完成!
本文只起个抛砖引玉的作用,更高级的应用fpm --help。

4、问题

在打包过程中遇到的两个问题:
1、gem install fpm 过程中提示需要ruby版本大于1.8.7,因为对ruby还不是很了解,只有下源码包安装了。
http://ruby.taobao.org/ 上下载,安装完成继续安装rubygems http://rubygems.org/ 下载最新版安装成功。

2、再次gem install fpm,报cannot load such file --openssl错误,
这是由于openssl开发包不存在,导致安装ruby时没安装openssl,
安装openssl-devel.x86_64  进入ruby源码目录ext/openssl ruby extconf.rb &&make && make install。

5、参考文献

[1] http://my.oschina.net/lxcong/blog/143855
[2] http://blog.chinaunix.net/uid-405749-id-3475251.html

原创粉丝点击