Dev Note/Environment 2010.11.29 21:11

SVN (1), (2) 를 통해서 SVN 설치 및 설정까지는 알아봤다.
이번에는 SVN 저장소와 사용자 설정 후 사용자들이 commit 한 내용을 메일로 발송하는 것에 대해 간략하게 알아본다.
SVN 설치를 Window에 하였기때문에 commit에 대한 메일발송도 Window 기반으로 설정한다.

SVN의 commit 메일발송은 SVN에 있는 Hooks라는 것으로 처리하면 된다. 여기서 Hooks는 SVN의 기본적인 이벤트에 대해 스트립트를 연결해주는 기능이다.
Hooks 중 Commit에 대한 부분 중 Post-commit hook 부분에 사용자의 commit 내용을 메일로 발송하는 스트립트를 연결해주면 된다.

* PowerShell 설치 & 실행 정책
일단 먼저 메일을 발송하기 위해 Window의 PowerShell을 사용할 것이다. 먼저 PowerShell이 설치가 되어 있지 않다면 설치하면 된다. (PowerShell의 설치는 Google에게 물어보면 친철히 알려준다. ^^)

PowerShell 사용하면서 외부의 스크립트를 실행하거나, 로컬에서 스크립트를 실행해야 하는 경우가 발생하게 되는데, 이때 대부분 실행정책(Execution_Policy) 인하여 정상적인 실행이 되지 않는 경우가 발생 합니다. 

 문제를 해결하기 위해서는 Execution Policy RemoteSigned 수정하거나, 인증서를 생성하여 인증 절차를 진행해야 하는데, 여기서는 가장 간단한 RemoteSigned를 이용했다.

PowerShell RemoteSigned 실행 정책 변경 방법
    1. 시작, 프로그램, 보조프로그램, Windows PowerShell 폴더를 차례로 클릭합니다.
    2. Windows PowerShell 항목을 마우스 오른쪽 클릭한 다음 관리자 권한으로 실행을 클릭합니다.
    3. PowerShell Command 창에서 powershell -executionPolicy RemoteSigned 입력

그러면 PowerShell이 RemoteSigned 실행 정책으러 설정 된다.

인증서 생성 및 PowerShell 관련 문서 : http://technet.microsoft.com/ko-kr/library/dd347649.aspx

* SVN commit 메일 발송하기
commit 메일 발송은 두가지 설정으로 진행이 되는데
    1. SVN 저장소의 Hooks 중 Post-commit hook에 스크립트 생성
    2. 실제 hook에서 실행 할 PowerShell 스크립트 작성

생성 된 저장소를 선택하고 마우스 오른쪽 클릭한 다름 Properties를 선택한다.


Hooks 텝에서 위에 선택되어 있는 것처럼 Post-commit hook을 선택하고 Edit 한다.

Edit 할 내용은 아래와 같다. (Sample 임)
    SET SITENAME=[ basket android ]
    SET SMTP_SERVER=127.0.0.1
    SET REPOS=%1
    SET REV=%2
    SET EMAIL_TO=to@gmail.com
    SET EMAIL_FROM=svn@gmail.com
    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe [commit powershell path] '%SMTP_SERVER%' '%EMAIL_TO%' '%EMAIL_FROM%' '%SITENAME%' 'REPOS' 'REV'

SMTP_SERVER : 메일을 발송 할 SMTP 서버
%1, %2의 값은 SVN에서 hook을 실행할 때 넘어오는 값으로 저장소 이름과 버전 값
EMAIL_TO, EMAIL_FROM은 메일 받는사람, 보내는 사람으로 ","를 이용하여 멀티 가능 함.
[commit powershell path] : 실제적으로 메일을 발송하는 PowerShell 스크립트의 경로 값

위에서 설정한 commit powershell 파일만 생성은 아래와 같다. (이것도 물론 Sample 임, 그냥 써도 무방함.)
스크립트의 전체적인 내용은 사용자가 commit 한 Log 내용과 commit 된 파일들의 정보를 메일로 발송하는 것이다.

    $server = $args[0]

    $to = $args[1]
    $from = $args[2]
    $sitename = $args[3]
    $svn_repos = $args[4]
    $svn_rev = $args[5]
    $subject = ""
    $body = ""

    $author = &"[SVN Install Path]\bin\svnlook.exe" author $svn_repos --revision $svn_rev


    $subject = "Committed By : ($author) To $sitename Revision Number ($svn_rev)"

    $body += "$sitename Comments for this Revision ($svn_rev) : `n"

    $svnlook_log_line = ""
    foreach($svnlook_log_line in &"[SVN Install Path]\bin\svnlook.exe" log $svn_repos --revision $svn_rev) { 
         $body += $svnlook_log_line + "`n" 
    }


    $body += "`n`n"

    $svnlook_changed_line = ""
    foreach($svnlook_changed_line in &"[SVN Install Path]\bin\svnlook.exe" changed $svn_repos --revision $svn_rev) { 
         $body += $svnlook_changed_line + "`n" 
    }


    $smtpClient = new-object system.net.mail.smtpClient 

    $smtpClient.Host = $server
    $smtpClient.Port = 25
    $smtpClient.Send($from, $to, $subject, $body)

여기까지 하고 해당 저장소로 commit을 하면 메일이 발송되는 것을 확인 할 수 있을 것이다.

저작자 표시 비영리 변경 금지
신고