블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2010.01.14 18:43

[ Perl -> 펄 ->뻘짓 ] SVN 커밋 전후처리 with ShipIt

  잠깐 회사 업무차 어떻게 하면 사용자가 가장 저렴한 행동으로 클라이언트 쪽에서 Hook 처리를 하느냐 하는 고뇌에 빠졌습니다. 애시당초 SVN Client 에서 Hook 이 뭐 없는 것 같아서 어떻게 전후처리를 어떻게 만들어볼까 생각해보다가 ShipIt 을 써보기로 했습니다. 
    ShipIt 은 예전에 블로그에서 소개한 적이 있었으니, 자세한 설명은 아래의 링크를 참고하세요.


  할 일은 아래와 같습니다.
 * 커밋 대상 파일들의 유효성 체크
 * 커밋될 파일들의 경로에 따라 각각 다른 서버로 파일 전송 ( 사내 서버에 Repository Server 를 두고 있기에 외부에서 접속 불가)
 * 그외 기타등등
 
.shipit
Steps = PreCommit, Commit, PostCommit

PreCommit.tmpfile   = .recent_files
PostCommit.domain = 192.*.*.*
PostCommit.path      =  /home/blah/path/

ShipIt::Step::PreCommit
package ShipIt::Step::PreCommit;
use strict;
use base qw(ShipIt::Step);

sub init {
  my ($self, $conf) = @_;
  
  $self->{tmpfile} = $conf->val('PreCommit.tmpfile');
}

sub run {
  my ($self, $state) = @_;
   
  # PreCommit Work 
  # 유효성 체크
  # 기타 등등
  # 안좋으면 die
}

1;

ShipIt::Step::PostCommit
package ShipIt::Step::PostCommit;
use strict;
use base qw(ShipIt::Step);

sub init {
  my ($self, $conf) = @_;
  
  $self->{domain} = $conf->val('PostCommit.domain');
  $self->{path} = $conf->val('PostCommit.path');
}

sub run {
  my ($self, $state) = @_;
   
  # PostCommit Work 
   # 파일전송 등등등
}

1;

work $ shipit
Running step ShipIt::Step::PreCommit=HASH(0x8d0995c)
Done PreCommit work
Running step ShipIt::Step::Commit=HASH(0x8d099bc)
sending              external/README
sending              internal/README1
sending              internal/README2
Transmitting file data ...
Committed revision xxx.
Running step ShipIt::Step::PostCommit=HASH(0x8d16d34)
transfer Committed Files:
 to x.x.x.x:
   external/README
 to x.x.x.y:
   internal/README1
   internal/README2

  음.. 당장 생각난 게 ShipIt 이어서 ShipIt 으로 했습니다. ;;;
  근데 뭐 달랑 저걸 위해서 Makefile.PL 하고 make 하고 make install (PreCommit.pm / PostCommit.pm) 해주는 게 너무 아깝습니다. ;ㅁ; 
  +PreCommit 으로 자신이 쉽게 커스터마이즈한 스텝을 추가할 수 있었으면 좋지 않을까 하는 생각을 해봤는데... 나중에 함 파봐야 되겠습니다. 

** 추기
 생각해보니 Makefile.PL 같은 거 만들 필요는 없습니다; +Step 해서 뭐 커스터마이즈 어쩌고 개드립을 쳤지만, 사실 perl 의 PERL5LIB 환경변수에 등록된 참조 라이브러리 디렉토리들을 참고하기 때문에,
 shipit 을 실행하는 디렉토리에서 'lib/ShipIt/Step/[StepName].pm' 을 만들어서 ...
 거기에 자신의 Step 을 구현해버리면 됩니다.  
 => shipit 커맨드는 use lib 'lib' 이 지정되어 있기때문에, 'lib' 디렉토리를 자동으로 참고합니다. 
 
신고
TOTAL 486,420 TODAY 35

티스토리 툴바