閱讀603 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 修改DB2控製中心的字體
  下一篇:go 鍵盤失靈事件