RPM打包利器RPM_CREATE
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: https://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
開源鏈接
https://code.google.com/p/rpmcreate
rpm
包直接下載
https://code.google.com/p/rpmcreate/downloads/list
相關資料鏈接:
checkinstall
https://asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.1.tgz
rpm_create
地址
https://code.google.com/p/rpmcreate
。
最後更新:2017-04-02 04:01:44