• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 自動增量升級方案的設計及實現

    發表于:2013-08-29來源:IT博客大學習作者:zhengzn點擊數: 標簽:增量
    問題背景: 1. 能否以某種簡便甚至自動化的方式,將修改過的文件以增量的方式同步到線上而不影響應用的正常運行。 2. 除了文件同步外,能否自定義某些腳本,在升級時自動執行。

      問題背景:

      1. 能否以某種簡便甚至自動化的方式,將修改過的文件以增量的方式同步到線上而不影響應用的正常運行。

      2. 除了文件同步外,能否自定義某些腳本,在升級時自動執行。

      3. 如果發現升級后的版本有問題,能否快速回滾到原來的版本。

      寫作目的:

      1. 以SVN為例子,學會基于版本庫的自動增量升級。

      2. 無需依賴任何文件同步工具,只需簡單的幾個shell腳本便可完成從自動增量打包到自動增量升級的整個過程。

      適合閱讀對象:

      1. 想從繁瑣乏味的升級工作中解放出來的運維人員。

      2. 擔心因修改文件數目多而可能導致升級遺漏的開發人員(尤其是web項目開發者)。

      3. 想了解自動增量升級設計思想的人員。

      不涉及的內容:

      1. 暫未包含基于hg或git版本庫的增量升級的實現,但思路與SVN是類似的。

      2. 本文側重業務應用的增量升級,不涉及個人軟件或者系統軟件的增量升級,盡管這兩者存在一些相似的地方。

      腳本下載地址:

      https://github.com/joerong666/auto_patch.git

      正文:

      增量升級這個名詞相信已經不是什么新鮮事物了,甚至我們每天在不經意間也已經做了該事。比如windows的自動更新,就是增量更新的一種。先撇開系統軟件的升級不說,作為一個業務應用開發者,筆者這里就自己所了解,介紹一下業務應用在做增量升級方面都采用哪些方法。

      升級方法比較:

      方法一:逐個文件拷貝覆蓋

      這個是最原始的增量升級方式,雖然簡單,但繁瑣且易漏易錯,相信稍有點規模的應用都不會采用這種方式。想想如果有分布在不同子目錄中的上百個文件被修改過了,你得執行拷貝覆蓋多少次,更悲催的是,你花了九牛二虎之力才把文件拷貝好,結果卻發現覆蓋錯了。

      方法二:使用類似rsync的文件同步服務器

      相對來說,使用rsync可以確保文件不會被誤覆蓋,也能保持目錄結構的一致性。但個人覺得這只是一種文件同步,跟升級還是有一定的區別,如果我們的升級僅僅是涉及文件的覆蓋或刪除,或許采用rsync是一個不錯的選擇。但如果想在升級的同時自動執行某些定制的程序或腳本,那么rsync就顯得有點愛莫能助了。另外rsync的引入,也需要額外的成本去搭建和監控它,自然也就需要額外的維護成本。而且rsync與版本庫的無縫結合也是個值得考驗的問題,能否由rsync直接從版本庫中獲取增量的部分,還是得額外寫個腳本將增量部分寫到rsync的同步目錄中,再由rsync客戶端來獲取?

      方法三:由開發人員手工編寫升級腳本

      一般來說,采用這種方法,首先需要開發人員記錄下哪些文件涉及改動,當然可通過查看版本歷史的方式來判斷哪些文件需要做更新;然后再針對這些文件,逐條編寫相應的用于覆蓋或刪除線上應用的copy或rm語句;最后將包含這些語句的腳本隨增量文件一起打包給運維人員,讓運維人員到線上執行。從可靠性的方面考慮,這種方式還不如第二種方法,但相對來說,這種方式的可控性比較靈活,可以靈活自定義升級腳本,而不是簡單的同步文件。比如可以定義在升級的同時執行某個特定的程序,最常見的就是在升級的同時重啟原來的某些服務。

      方法四:自動增量升級

      該方法是對方法三的一種增強,一方面是升級腳本是根據版本歷史自動生成的,不再需要人工編寫;另一方面,支持自定義升級擴展,也就說除了生成簡單的增量覆蓋升級腳本外,還支持以可插拔式的方式將自定制的程序讓升級腳本自動執行。這是筆者選擇的升級方法,也是本文的講述重點。下面針對這種方法具體展開描述。

      自動增量升級:

      下面先從流程方面來大概介紹一下自動增量升級的整個思路,然后再從程序的角度解釋一下本文中所涉及的腳本的作用。

      升級流程:

      升級流程分兩個階段,第一階段為增量打包操作,一般由開發人員執行;第二階段為升級操作,可由運維人員執行。

      增量打包流程:

      流程描述:更新版本庫 ===> 生成增量清單文件 ===> 檢查并修剪清單文件(以及編寫自定義升級程序) ===> 生成增量補丁包

      對應命令或腳本:svn update ===> gen_manifest.sh(需將結果重定向到PATCH_MANIFEST清單文件) ===> 添加或刪除清單文件(PATCH_MANIFEST)中無需做更新的記錄(同時根據需要編寫想讓升級程序自動執行的腳本,如 demo_custom_script.sh) ===> gen_patch.sh

      升級流程:

      流程描述:獲取增量包 ===> 執行升級操作并生成增量包的回滾備份包

      對應命令或腳本:可通過wget獲取增量包 ===> patch.sh(執行完后會生成增量回滾包,如patch_recover_20130626113450)

      程序解釋:

      生成清單文件gen_manifest.sh:

      $ ./gen_manifest.sh

      Usage: ./gen_manifest.sh revision1[:revision2] [sub_dir]

      該腳本用于生成增量清單文件,既然是增量,就需要有一個相對版本,所以至少需要傳入revision1這個版本參數,其值為上次程序發布時的版本庫版本號加 1。默認情況,該腳本會生成當前目錄及其所有子目錄下(遞歸)的增量清單,如果只需要針對某個子目錄,則可指定sub_dir。因一般情況下該腳本生成出來的清單都需做一定的修剪,為了可直接供管道使用,這里并沒有讓它輸出到文件,而是直接輸出到標準輸出,使用者可根據需要直接重定向到 PATCH_MANIFEST(這個文件名是gen_patch.sh腳本約定好使用的,不能為其它名字)文件。

      清單文件PATCH_MANIFEST,大體如下:

      #revision:A/D/C:src_file[:dest_dir]

      r2061:A:sub_dir/dir1/a.java

      r2065:A:sub_dir/dir2/b.sh

      r2069:A:script/dir3/c.ini:sub_dir/script/dir3

      #r2111:D:sub_dir/test/kkk/tt.txt

      #r2112:A:sub_dir/test/kkk2

      #r2112:D:sub_dir/test/kkk

    原文轉自:http://blogread.cn/it/article/6550?f=wb

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>