Abstraction

웹 서비스는 하루에도 몇 번씩 끊임없이 수정하고 배포된다. 웹이라는 특수한 환경의 특징 중 하나이며 이 것이 Tim O’Reilly가 주장한 웹 2.0의 주요한 특징 End of the Software Release Cycle 이기도 하다.

끊임없이 여러번 배포하려면 이에 따른 적절한 관리가 필요하다. 따라서 항상 태깅을 통해 히스토리 관리와 롤백을 위한 버전 관리를 병행한다.

버전 관리 규칙

버전 번호는 몇 가지 규칙에 따라 정하기로 한다.

  1. 버전은 네 자리 숫자로 구성한다. 하지만 경우에 따라 세 자리만 사용할때도 있다.
  2. YEAR.MONTH.MAJOR.MINOR 로 구성한다.
  3. YEAR는 MONTH 보다 무조건 우선 순위가 높으며, MONTH는 MAJOR 보다 무조건 우선 순위가 높다. 상위 자리는 하위 자리보다 무조건 우선 순위가 높다.
  4. 각 자리 수는 두 자를 초과하지 않는다. 하루에 99번 이상은 버전을 부여할 수 없다.

YEAR와 MONTH는 각각의 연도 뒷 2자리, 달 [1-2]자리이며 MAJOR는 그 달에 몇 번째 배포인지, MINOR는 그 날에 몇 번째 배포인지를 뜻한다.

즉, 2010년 7월 9일에 처음으로 배포한다면 10.7.1 이 되며 사소한 버그가 발견되어 패치한 버전을 다시 배포하면 10.7.1.1 또 다시 버그가 발견되어 배포 10.7.1.2 가 된다.

7월 10일에 추가 기능을 포함하여 배포한다면 10.7.2 가 된다. MAJOR는 항상 MAJOR + 1이며 MINOR는 그 날 기준으로 [없음,1,2,3 ...]으로 증가한다.

이렇게 규칙을 정하고 버전을 부여하면 문제 없는지 최종 점검 후 실 서비스에 배포를 시도한다.

최근 번호 추출 스크립트

버전이 많아지면 최근 번호를 눈으로 판별하기가 쉽지 않다. 대부분 가장 최근 번호를 배포하게 되므로 따라서 자동으로 최근 번호를 추출하는 PHP CLI 스크립트를 만들어 사용한다.

이 스크립트는 Subversion Repository에서 tags 디렉토리 하위에 버전별 디렉토리를 추출하여 이 중 가장 최근 번호를 추출해 관리자에게 보여주는 역할을 한다.

#!/usr/bin/php -q
<?

if ($argc != 2) {
    echo "0";
    exit;
}

exec ("svn list ${argv[1]}", $retval);

$MAX = array(0, "0");

foreach ($retval as $version) {
    $version = str_replace("/", "", trim($version));
    $versions = explode(".", $version);

    $num = 0;
    foreach ($versions as $key => $val) {
        $seed = pow(100, (3 - $key));
        $num = $num + ($seed * $val);
    }

    if ($num > $MAX[0]) {
        $MAX[0] = $num;
        $MAX[1] = $version;
    }
}

echo ($MAX[1]);
?>

Bash 로 만든 쉘 스크립트에서는 아래 명령으로 최근 번호를 추출해 변수에 담을 수 있다.

local latest_tag=`$SRC/get_latest_tag.php $SVN_TAGS_URL`