專案完成後, 第一次就直接 Release 即可, 那之後的版本更新應該怎麼辦?
常見的幾種做法:
- 開發者更新程式是直接修改線上版
- 開發者先在測試環境修改完程式, 再將修改過的程式複製到線上 (或直接 svn release / svn up 蓋掉線上檔案)
- 將舊版的 proejct_name mv 做成 舊版project_name-當天日期, 再將新版程式改成 project_name.
- 不管哪種版本, 總之全都加上日期(ex: prject_name-日期), 然後用 ln 的方式, 將 project_name link 到最新版的程式.
- 最標準的做法: 包裝成 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 流程:
- 將舊版的 Project-Name 改名字成 Project-Name-timestamp
- 然後再將新版的程式搬過去, 改名字叫 Project-Name 即可.
- 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 流程:
- 砍掉現在運行的版本
- 抓取上一版的程式, 改名成 Project-Name 即可.
- 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 流程
- 將 svn release 的目錄名稱, 改為 Project-Name-timestamp
- 再用 ln 去抓取目前最新版的 Project-Name-timestamp, 把他指到 project_name 去.(project_name = Apache 指定的 DocumentRoot)
- 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 流程
- 將現在運行的程式 ln 指到上一版的程式目錄
- 再移除最新版的程式, 這樣子就達到還原為上一版的程式囉~
- 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 上都很方便, 缺點是目錄會留下不少, 可能每年要記得去清清過期已久的程式.
使用方式
- 使用者 ssh 登入主機後
- ./release.sh # Release
- 若有發生異常, 要還原: ./rollback.sh # 還原回上一版.
- 這樣子就可以囉.
上述 Script 整包下載: release-script.tgz
註: 某公司的 Package release 也是採用類似 ln 的做法. 😛