組內準備搭建內部yum源,在這之前需要規範軟體的安裝目錄,並把現有的應用打包。目前接觸兩種rpm打包工具,rpmbuild和fpm。-rpmbuild rpmbuild關鍵是spec文件編寫。 環境搭建yum -y install rpm-build rpmdevtoolsuseradd rpm;....
組內準備搭建內部yum源,在這之前需要規範軟體的安裝目錄,並把現有的應用打包。
目前接觸兩種rpm打包工具,rpmbuild和fpm。
- rpmbuild
rpmbuild關鍵是spec文件編寫。
環境搭建
yum -y install rpm-build rpmdevtools
useradd rpm; su rpm
註: rpm打包需要特定目錄下,在近期版本下rpmbuild可以在非root賬號家目錄下創建打包目錄:
rpmdev-setuptree
[rpm@vm-1-lz rpmbuild]$ ll
total 20
drwxrwxr-x. 2 rpm rpm 4096 Dec 22 14:46 BUILD
drwxrwxr-x. 2 rpm rpm 4096 Dec 22 14:46 RPMS
drwxrwxr-x. 2 rpm rpm 4096 Dec 22 15:06 SOURCES
drwxrwxr-x. 2 rpm rpm 4096 Dec 22 16:07 SPECS
drwxrwxr-x. 2 rpm rpm 4096 Dec 22 14:46 SRPMS
[rpm@vm-1-lz rpmbuild]$
註:這裡是/home/rpm/rpmbuild, 這個預設目錄可以修改,可以修改巨集定義:
/usr/lib/rpm/macros:
_topdir %{getenv:HOME}/rpmbuild
然後在rpmbuild/SPECS 目錄下創建spec文件:
cd ~/rpmbuild/SPECS
rpmdev-newspec -o example.spec
SPEC文件
打包過程是
1. %prep 解壓source部分定義的壓縮包到 %build目錄下
註:Source需要是tar格式壓縮文件,這樣setup才能調用 (source 跟setup可以多條記錄,並依序對應)
2 %build 可以調用%configure巨集變數或是直接調用configure命令直接配置
3 %install 安裝文件到%buildroot下 (rpmbuild/BUILDROOT), 在這部分,需要確保目錄已經存在不然會報錯,比如拷貝配置文件到/etc/下,需要建立%buildroot/etc 目錄
註:%install 部分是用絕對路徑的,所以最好引用%buildroot
4 %file 部分定義那些文件將被打包進rpm包里
註:%file部分是用相對路徑,我們可以用巨集變數 比如%_prefix 代表/usr 其絕對路徑就是%buildroot/usr
參考 http://fedoraproject.org/wiki/Packaging:RPMMacros
- fpm 打包
這是一個開源的項目 https://github.com/jordansissel/fpm
環境搭建:
yum -y ruby ruby-devel rubygems rpm-build
gem install fpm
註: 這裡有個坑。如果正常按照gem去安裝 我們是沒辦法調用 fpm成功的,因為 cabin的版本有問題:
[root@vm-1-lz RPMS]# fpm
/usr/lib/ruby/gems/1.8/gems/cabin-0.8.0/lib/cabin/mixins/logger.rb:12:in `included': undefined method `options' for #<Cabin::Subscriber:0x7fad75e31b90> (NoMethodError)
from /usr/lib/ruby/gems/1.8/gems/cabin-0.8.0/lib/cabin/channel.rb:105:in `call'
....
因此, 卸載當前cabin版本:
gem uninstall cabin
....
gem install cabin -v 0.7.2
用前一個版本的cabin才能正確啟動fpm
構建rpm包
把之前編譯好的nginx打包:
nginx 目錄: /usr/local/nginx
fpm命令:
fpm -e -s dir -t rpm -n nginx -v 1.8.0 -C /usr/local/nginx --prefix=/opt/nginx
註: -e 可以讓我們看到具體的spec文件, 如果沒問題,保存退出就能在當前目錄創建一個rpm包
但是fpm不能友好的按照規範路徑打包
- SPEC例子
Name: tengine Version: 1.5.2 Release: 1%{?dist} Summary: tengine-1.5.2 Group: Application/System License: GPL URL: http://tengine.taobao.org/ Source0: tengine-1.5.2.tar.gz Source1: LuaJIT-2.0.4.tar.gz Source2: pcre-8.34.tar.gz Source3: openssl-1.0.2e.tar.gz Source4: zlib-1.2.8.tar.gz Source5: ngx_devel_kit-0.2.18.tar.gz Source6: jemalloc-3.4.0.tar.bz2 Source7: nginx-bb-1.8.0.tar.gz Requires: zlib,pcre,openssl,LuaJIT %description tengine-1.5.2 %prep %setup -b 0 %setup -b 1 %setup -b 2 %setup -b 3 %setup -b 4 %setup -b 5 %setup -b 6 %setup -b 7 %build CFLAGS="${CFLAGS:--O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic}" ; export CFLAGS ; CXXFLAGS="${CXXFLAGS:--O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic}" ; export CXXFLAGS ; FFLAGS="${FFLAGS:--O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -I/usr/lib64/gfortran/modules}" ; export FFLAGS ; ./configure \ --with-http_ssl_module \ --prefix=/opt/nginx \ --error-log-path=/opt/nginx/logs/ \ --http-log-path=/opt/nginx/logs/ \ --pid-path=/opt/nginx/run/ \ --lock-path=/opt/nginx/lock/ \ --user=www \ --group=www \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_lua_module \ --with-luajit-inc=/usr/local/include/luajit-2.0 \ --with-luajit-lib=/usr/local/lib \ --with-pcre=%{_builddir}/pcre-8.34 \ --with-openssl=%{_builddir}/openssl-1.0.2e \ --with-zlib=%{_builddir}/zlib-1.2.8 \ --with-http_concat_module \ --with-http_sysguard_module \ --with-http_realip_module \ --without-syslog \ --with-jemalloc \ --add-module=%{_builddir}/ngx_devel_kit-0.2.18 make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT mv %{buildroot}/opt/nginx/conf %{buildroot}/opt/nginx/conf.default install -d %{buildroot}/opt/nginx/conf cp -r %{_builddir}/nginx-bb-1.8.0/conf/* %{buildroot}/opt/nginx/conf %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %doc /opt/nginx/* %changelog