Project release 的 更新/還原 控制 Script

專案完成後, 第一次就直接 Release 即可, 那之後的版本更新應該怎麼辦?

常見的幾種做法:

  1. 開發者更新程式是直接修改線上版
  2. 開發者先在測試環境修改完程式, 再將修改過的程式複製到線上 (或直接 svn release / svn up 蓋掉線上檔案)
  3. 將舊版的 proejct_name mv 做成 舊版project_name-當天日期, 再將新版程式改成 project_name.
  4. 不管哪種版本, 總之全都加上日期(ex: prject_name-日期), 然後用 ln 的方式, 將 project_name link 到最新版的程式.
  5. 最標準的做法: 包裝成 Package, 然後去做 Release, 當有問題時, 可再馬上還原回舊版的程式.

前面兩種做法 和 包 Package 的做法, 在此就不討論:

  • 前兩種做法 都是開發者操作, 有什麼問題應該都會想辦法解決.
  • 包 Package 的做法, 只要會推 Package 即可. (當然前題是 Package 要包的好.. XD)

現在的狀況是, 希望能用 svn release, 但是若出問題時, 又想要能快速的 rollback, 不過問題是出在做這件事的人, 是一般使用者, 所以要考慮讓他能用最簡單的指令讓他完成這件事. (暫時先不考慮 包 Package 的做法)

目前預計是使用 3 和 4 的做法:(下述 Script 在 Debian/Ubuntu Linux 可正確執行, BSD 等沒測試過)

採用 將舊版的 proejct_name mv 做成 舊版 project_name-當天日期, 再將新版程式改成 project_name.

Release 流程:
  1. 將舊版的 Project-Name 改名字成 Project-Name-timestamp
  2. 然後再將新版的程式搬過去, 改名字叫 Project-Name 即可.
  3. Script(release.sh) 範例:(假設 DocumentRoot = /var/www/project_name)
    #!/bin/sh
    # 從 svn checkout release version
    #svn release http://hostname/project_name
    svn export http://hostname/project_name
    # 將現在的版本加上 timestamp 搬到舊版本去
    mv /var/www/project_name /var/www/project_name-`date "+%s"`
    # 將 release 的版本搬到預定位置
    mv project_name /var/www/
Rollback 流程:
  1. 砍掉現在運行的版本
  2. 抓取上一版的程式, 改名成 Project-Name 即可.
  3. Script(rollback.sh) 範例:
    #!/bin/sh
    # 砍掉現在版本
    rm -fr /var/www/project_name
    # 取出上一版的程式
    ROLLBACK_VERSION=`ls /var/www | sort | tail -1`
    echo "use this version: $ROLLBACK_VERSION"
    # 將上一版的程式搬回去, 還原當最新版本
    mv /var/www/$ROLLBACK_VERSION /var/www/project_name

但是這種做法有個缺點, 刪除/搬移 時或許會有個 1~2秒的時間會有問題, 特別是當你的原始碼檔案越多時, 刪除所需時間就會越久.

由於上述缺點, 所以來想改善措施, 所以就採用第 4 種的方法, 如下述:

不管哪種版本, 總之全都加上日期(ex: prject_name-日期), 然後用 ln 的方式, 將 project_name link 到最新版的程式.

Release 流程
  1. 將 svn release 的目錄名稱, 改為 Project-Name-timestamp
  2. 再用 ln 去抓取目前最新版的 Project-Name-timestamp, 把他指到 project_name 去.(project_name = Apache 指定的 DocumentRoot)
  3. Script(release-ln.sh) 範例:
    #!/bin/sh
    # 從 svn checkout release version, 目錄產生為 project_name + timestamp
    #svn release http://hostname/project_name project_name
    svn export http://hostname/project_name project_name
    # 現在的 timestamp
    TIMESTAMP=`date "+%s"`
    # 將 release 的版本加上 timestamp 搬到網頁存放目錄去.
    mv project_name /var/www/project_name-$TIMESTAMP
    # 將 ln 指到新的網頁存放目錄
    ln -fsn /var/www/project_name-$TIMESTAMP /var/www/project_name
Rollback 流程
  1. 將現在運行的程式 ln 指到上一版的程式目錄
  2. 再移除最新版的程式, 這樣子就達到還原為上一版的程式囉~
  3. Script(rollback-ln.sh) 範例:
    #!/bin/sh
    # 抓上一版的程式版本
    PRE_VERSION=`ls /var/www | sort | tail -2 | head -1`
    # 現在這版的程式版本
    NOW_VERSION=`ls /var/www | sort | tail -1`
    
    # 如果只剩一個版本, 不能移除
    if [ "$PRE_VERSION" == "$NOW_VERSION" ]; then
    exit
    fi
    
    # ln 將上一版的指到現在該執行的網頁存放目錄
    ln -fsn /var/www/project_name-$PRE_VERSION /var/www/project
    # 砍掉現在版本
    rm -fr /var/www/project_name-$NOW_VERSION
    echo "use this version: $PRE_VERSION"

這種在速度上, Release/Rollback 上都很方便, 缺點是目錄會留下不少, 可能每年要記得去清清過期已久的程式.

使用方式

  1. 使用者 ssh 登入主機後
  2. ./release.sh # Release
  3. 若有發生異常, 要還原: ./rollback.sh # 還原回上一版.
  4. 這樣子就可以囉.

上述 Script 整包下載: release-script.tgz

註: 某公司的 Package release 也是採用類似 ln 的做法. 😛

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料