背景
应用程序写好了以后,需要分发给其他人,这时就需要控制启动脚本啊、配置管理啊,这些事情其实还是需要操作系统提供的rpm、deb、pkg来完成,但是要写rpm-build, dpkg-config。之前写过rpm打包过程,要有自动构建等操作,还需要对文件attr进行控制,各种细节都要写。 累都累死了。
包对安装者很方便,对写包的人太蛋疼,而这就是我们今天的主角要解决的问题。
fpm @Github
真不是php-fpm模块
fpm官方号称支持以下类型打包
- deb
- rpm
- solaris
- freebsd
- tar
- directories
- Mac OS X .pkg files (osxpkg)
- pacman (ArchLinux) packages
太赞了!我的主机是Ubuntu(deb),那这次我们的目标就是Redhat的rpm好了!
安装fpm
首先安装fpm,这货依赖ruby的gem,所以
sudo apt-get install ruby ruby-dev rubygems gcc make
sudo gem install --no-ri --no-rdoc fpm
这些都安装好了以后,我们就可以开始打包了。
打包方式
推荐直接构建文件目录的方式,因为这样很简单。简单到你怎么安排文件目录结构,fpm就忠实地从根目录开始还原。例如下面这个结构
$ mkdir test && cd test && mkdir -p usr/bin && mkdir -p var/log/dummy
$ cd .. && tree test
.
├── usr
│ └── bin
└── var
└── log
└── dummy
执行
fpm -s dir -C test
就是把test当成根目录/ , test/var 就会变成/var
简单吧!
目标包确定
我们这次选择的是rpm,所以-t (type)就指定rpm了。
fpm -s dir -C test -t rpm
接下来要确定包的名字,例如我们这次叫hi,所以-n (name) 就是 hi
$ fpm -s dir -C test -t rpm -n hi
Created package {:path=>"hi-1.0-1.x86_64.rpm"}
执行完了以后,就自动出了一个rpm包。
看看里面有什么
rpm -qlp hi-1.0-1.x86_64.rpm
/usr/bin
/var/log/dummy
Bingo!这样就做好rpm包了。
高级用法
脚本
某些包需要执行一些脚本, 可以通过--after-install --before-install
等参数指定.需要注意的是, fpm会自动读取并放在包中.
配置文件
rpm和deb都有自动配置文件管理(自动diff等功能)所以最好一开始就加上所有的配置文件. --config--files
就可以指定了. 不过,deb会默认/etc下的所有文件都是配置.
一些小tips
- git自动生成版本号
git describe --tags
- rpm 查询包内容
rpm -qlp *.rpm
- deb 查询包内容
dpkg -c *.deb
- logrotate是个好功能
fpm -d logrotate会自动更新配置