#r2113:A:sub_dir/test/kkk2/tt2.txt
r2124:A:sub_dir/conf/log4j.properties
#r2197:A:sub_dir/conf
#r2197:A:sub_dir/conf/config.conf
xxxxx:A:sub_dir/db/patch.sql
xxxxx:C:patch_script/demo_custom_script.sh:sub_dir/autoscript
這里分幾點來解釋一下這個清單文件:
1. 行首帶#號的為注釋行,gen_patch.sh不會解析。由于有些配置文件(如這里的config.conf)我們在版本庫上雖做了修改,但我們不能更新到線上應用去,畢竟配置不一樣,故直接把相應的行注釋掉即可(注意記得把相應的目錄也注釋掉,如這里的”#r2197:A:sub_dir/conf “行)。
2. 第一行是一個樣例,標識每行記錄需遵守的格式,一行最多只有4項,每項用冒號分隔。revision為版本號;A/D/C分別表示為“添加或修改 (Add)/刪除(Delete)/自定義命令(Comand)“;src_file為涉及文件在版本庫中的目錄結構;dest_dir(這里是目錄,而不是文件)為src_file在發布包中的目錄結構,如果沒指定則表示涉及的文件在版本庫和發布包中的目錄結構一樣。
3.后面的版本號為xxxxx的行是一些自定義操作行,這些操作并沒有或者無法在版本庫中體現。如
xxxxx:A:sub_dir/db/patch.sql ===> patch.sql文件在指定的版本號范圍內并沒有相應的更改歷史,也許它根本就不在版本庫內,但我們又想讓它隨本次的增量包拷貝到線上應用去,所以采用這種定制的方式委婉的將它納入增量包中。
4.值得注意的是操作為"C"的行,如這里的最后一行:
xxxxx:C:patch_script/demo_custom_script.sh:sub_dir/autoscript ===>C操作的行并非簡單的表示將src_file拷貝到dest_dir,事實上它并沒有被拷貝到線上應用中去,而只是僅僅打進增量包中,然后作為一種自動化的程序,在運維人員執行升級(patch.sh)操作時被自動執行的程序,有點被回調的味道。該程序一般需要開發人員根據實際需要編寫,一般是一些執行服務的操作,如重啟某些服務。如這里提到的demo_custom_script.sh:
自定義升級腳本demo_custom_script.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/env bash src_dir=$1 ### 由升級程序patch.sh傳遞進來,表示增量包在線上被解壓的臨時目錄 dest_dir=$2 ### 由升級程序patch.sh傳遞進來,表示線上應用所在的目錄(即patch.sh所在的目錄) export LANG=en_US.UTF-8 target_dir=my_target/bin target_proc=my_service function err_out() { echo "Reload my_service failed" >&2 exit 1 } cd $dest_dir/$target_dir && \ ./my_service reload ### 升級時(一般是執行完增量清單中的其它操作之后)重啟我的服務 if [ $? -ne 0 ]; then err_out fi exit 0 |
生成增量包gen_patch.sh:
$ ./gen_patch.sh
Usage: ./gen_patch.sh
Attention: a manifest file named 'PATCH_MANIFEST' is needed under current directory
gen_patch.sh的功能很簡單,就是根據之前生成的清單文件PATCH_MANIFEST生成增量包,所以前提是確保清單文件是準確的,當然也可以通過查看生成后的增量包是否符合實際要求來進一步確認。
執行升級操作patch.sh:
$ ./patch.sh
Usage: ./patch.sh patch.tar.gz
顧名思義,該腳本的作用就是用于給當前的應用打上補丁,一般由線上的運維人員執行。該腳本應該在程序第一次發布的時候包含進去,且應該與放置應用代碼的根目錄同級。如下
myapp-1.1.0-rc5-bin-x86_64
|- approot
|- app-patch20130624.tar.gz
|- patch.sh
|- patch_recover_20130613182709 ===> 升級時生成的增量回滾快照
|- patch_20130626.log ===> 升級時執行的日志
其中的app-patch20130624.tar.gz即為前面通過gen_patch.sh生成的增量升級包,而 patch_recover_20130613182709目錄是執行升級前自動生成的增量備份,如果發現升級有誤的話,可立即通過將該備份目錄下的內容拷回原來的位置,即可完成回滾。
結束:
雖然前面洋洋灑灑寫了好多,感覺好像很復雜的樣子,其實想要表達意思的很簡單,就下面三個步驟:
生成增量包:
$ ./gen_manifest.sh 2061 >PATCH_MANIFEST
$ ./gen_patch.sh app ===>生成app-patch20130624.tar.gz
執行升級:
$ ./patch.sh app-patch20130624.tar.gz
原文轉自:http://blogread.cn/it/article/6550?f=wb