....

SVN 후킹을 이용해서 리비젼 별로 압축 파일 생성시키기 본문

Linux

SVN 후킹을 이용해서 리비젼 별로 압축 파일 생성시키기

idkook 2009. 11. 21. 00:36

나로 하여금 궁극적으로 윈도우에서 리눅스로 다시 형상관리 서버를 설치하게 했던 목적인 스크립트이다.

물론 TortoiseSVN을 이용하면 이런 작업이 필요없을지도 모르지만... 
  참고 : (TortoiseSVN에서 특정 리비전 영역만 추출하기)
TortoiseSVN을 가능하면 설치하고 싶지도 않고... (탐색기가 느려진다.....)
다른 사람에게 해당 리비젼을 가져다가 배포하라고 알려줄때는??? 기타등등...
이래 저래 클라이언트의 특정한 툴에 의존하는걸 좋아하지 않는다.

SVN에 커밋이 일어난 후에 자동으로 실행되는 post-commit 스크립트를 만들었다.
  참고 : (자바지기님 SVN의 hooks 기능 활용)
오늘 삘 받았나보다.. 퇴근하려다가 조금만 더~ 하고는 뚝딱 뚝딱 만들어버린 스크립트... 

우선 스크립트 내용을 보면...

#!/bin/sh

# 한글로 된 파일명 Export 누락을 발견 하고 추가한 한줄입니다.
# 애초에.. 한글로 된 소스는 처리 하지 않는게 제일 좋겠지만... 현실은 냉정한 법이니.....
# 한글로된 소스가 제대로 Export가 안될때.. 시스템의 로케일 설정등을 먼저 Import.
# 단, SVN후킹은 UTF-8로 파일명을 내뱉는거 같으며, 현재 시스템 로케일 또한 ko_KR.UTF-8이다.
# EUC-KR을 기본적으로 사용하는 시스템에서의 한글 소스파일은 export에서 누락될지도...
# (만약 svnlookup 이 출력해주는 *.list의 파일에서 한글이 정상적으로 나온다면 문제 없을 것이다.)
source /etc/profile
# 혹은 . /etc/profile


# REPOS에 전체 URL을 가져와도 되나 SSL과 같은 환경에서는 손도장을 확인하라는 경고로 인해
# 정상 작동하지 않을 수 있다.

# 그냥 프로젝트 이름을 가져오고 svn://이나 file:// url로 접근하도록 처리한다.
# REPO_NAME도 마찮가지..
REPO_NAME=$1
REPOS=svn://localhost/$REPO_NAME

#svn에서 hooking할 때 같이 넘겨주는 두번째 파라매터는 커밋된 리비젼 번호이다.
TXN=$2

#인증 사용자만 checkout이 가능할 경우에는 인정 정보 커맨드도 생성해야 한다.
AUTH_CMD="--username [사용자ID] --password [사용자암호]"

#AUTH_CMD=""  <- 인증정보가 필요없다면..

#실제 Parent SVN 리포지토리 경로를 지정.
SVN_REPOS=/var/svn

#SVN 후킹시 결과 파일을 출력할 경로.
#아래 경로상에 [프로젝트명]-r[리비젼번호].zip 이 이쁘게 차곡차곡 쌓일 것이다...
SVN_EXP=/var/export_svn/$REPO_NAME

#------- 사용자마다 틀린 설정은 이 위까지만 보면 된다.

# 만약 프로젝트 Export대상 경로가 없다면 만들어준다.
if [ ! -d $SVN_EXP ]; then

 mkdir -p $SVN_EXP
fi

#커밋된 내용을 리스트 파일로 만든다.
svnlook changed $SVN_REPOS/$REPO_NAME > $SVN_EXP/$REPO_NAME-r$TXN.list


#출력한 파일을 줄단위로 파일을 읽어서 처리한다.
while read STATE TARGET
do
    # 삭제된 파일은 별도로 [프로젝트이름]-r[리비젼번호].rm.sh 파일에 삭제 명령을 만들어준다.
    # 바로 사용하긴 힘들더라도 삭제작업을 훨씬 수월하게 할수 있다.
    if [ $STATE = "D" -o $STATE = "_D" ]; then
        echo "rm -rf $TARGET" >> $SVN_EXP/$REPO_NAME-r$TXN.rm.sh
    else
        #export할 파일의 경로만을 추출해서 디렉토리를 만들어준다.
        #svn export는 출력할 대상 파일의 경로가 없으면 오류만 뱉어내므로 디랙토리 구조를
        #그대로 유지하기 위한 작업이다. (-p 는 여러 경로를 한꺼번에 생성)
        TARGET_PATH=`echo $TARGET | sed 's|\(.*\)/.*|\1|'`
        if [ ! -d $SVN_EXP/$REPO_NAME-r$TXN/$TARGET_PATH ]; then
            mkdir -p $SVN_EXP/$REPO_NAME-r$TXN/$TARGET_PATH
        fi
   
        #svn export를 실행해서 파일단위로 export시킨다.
        # -r HEAD는 -r $TXN으로 바꿔도 되며 생략해도 된다.
        svn export -r HEAD $REPOS/$TARGET \
                $SVN_EXP/$REPO_NAME-r$TXN/$TARGET $AUTH_CMD

    fi
done < $SVN_EXP/$REPO_NAME-r$TXN.list
### 여기까지 while 반복처리문

# 이곳에 개발자들에게 변경된 list를 메일로 보낸다거나...
# 운영서버에 결과 파일을 동기화 시켜버린다거나... 기타등등의 처리도 가능하다..

# 상대경로로 최종 zip파일을 생성하면서 만들어진 파일을 삭제한다.
# 삭제하기 싫다면 -m (move) 옵션을 빼버리면 된다.
cd $SVN_EXP

zip -r -m $REPO_NAME-r$TXN.zip $REPO_NAME-r$TXN*


위 스크립트를 실행가능한 경로에  post-commit.sh 로 실행가능한 경로에 둔다.

 #!/bin/sh

REPOS="$1"
REV="$2"

# URL에서 프로젝트의 이름을 추출한다.
REPOS_NAME=`echo $REPOS | awk 'BEGIN {FS="/"} {print $NF}'`

# 추출한 프로젝트 이름과 리비젼 번호로 post-commit.sh를 실행한다.
[실행경로]/post_commit.sh $REPOS_NAME $REV


이 스크립트를 [SVN 리포지토리]/hooks/post-commit  으로 두고 실행권한을 주고나면...


매번 커밋이 이뤄질때마다.. 커밋된 소스를 따로 export해서 아래 경로에 차곡차곡 zip파일로 쌓아줄 것이다.
[SVN_EXP에서 지정한 경로]/[프로젝트이름]/[프로젝트이름]-r[리비젼번호].zip

이제 이 SVN_EXP로 지정한 경로를 Apache의 dir_mod로 접근할 수 있게 해놓으면...

아주 긋~. 작업한 소스를 커밋하고 난뒤 FTP도 필요없이 브라우져로 모든 소스에 접근이 가능하다...

<VirtualHost _default_:443>
 ....
 Alias /export /var/export_svn
 <Directory /var/export_svn>
    Options +Indexes
    AuthType Basic
    AuthName "Subversion Export Files"
    AuthUserFile /etc/httpd/conf/htpasswd
    Require valid-user
 </Directory>
 ....
</VirtualHost>

위의 설정의 http.conf에 추가하고 나면.... https://서버주소/export 에서 아주 간편하게 리비젼별 압축파일을 겟~! 할 수 있다..

당연한 예기지만 AuthType Basic 은 Apache에서도 HTTPS에서만 사용하길 권장하는 모듈이다.
당연히 80번 포트로 서비스할 생각일랑 아예 접어버려야 한다.
(이것때문에 일부러 <VirtualHost _default_:443> 에 마구마구 우겨넣는것이기도 하다...)

P.S :
보통 작업된 소스를 운영서버에 배포하기 위한 자동화 방법은 많이 있지만.. 그 방법을 모든 사이트에 적용할 수 있는건 아니다..
그리고 나처럼 막 굴러먹던 개발자는.. 그런 정형화된 빌드툴을 어떻게 사용하는지조차도 감이 잘 안온다.
Maven에 Ant에 이것저것 공부는 하지만.. 실제로 현재 사이트에 어떻게 적용 시킬지는 정말 막막하다.

매번 변경된 소스를 일일히 찾아서 반영시키다 보면 꼭 뭐 하나씩 빼먹기 마련이고.. 그로 인한 사고는 고스란히 신뢰도 하락으로 이어진다.

그냥 나처럼 막 굴려지는 개발자는 이런식으로 눈앞에 정말정말 하기 싫은 실수하기 쉬운 반복작업을 조금씩 자동화 시키는 맛에 일한다고 해야 할까.... (정말 이런 반복 작업을 수동으로 하라고 하는게 제일 싫다....)
Comments