블로그 이미지
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' 디렉토리를 자동으로 참고합니다. 
 
신고
IT/Perl 2009.10.02 19:11

[ShipIt] Software Release Tool - ShipIt with CPAN/Git/SVN Commit/Tag/Upload

   WWW::Shorten::Durl 을 업로드하면서 ShipIt 을 사용해봤습니다. ShipIt 은 LiveJournal 등을 만든 Brad Fitzpatrick 씨가 만든 소프트웨어 릴리즈 툴입니다. SVN/SVK/Git 에 자동으로 커밋, 푸시, 배포판을 만들어 태그도 생성해주고, CPAN 도 자동으로 업로드 해줍니다.
  꼭 Perl 에서만 쓸 수 있다는 제약은 없습니다. 하지만 제가 Perl 을 쓰니까 Perl 을 기준으로 설명드리겠습니다.

  우선 제가 WWW::Shorten::Durl 을 다 만들었다고 하고.. 이제 배포판을 만들어서 github 나 SVN 섭, 그리고 PAUSE 로 올리려고 합니다. ShipIt 을 쓰기 이전에는 대략 이런 플로우를 거칩니다.

  1. 배포판 버젼 지정/설정
  2. 신버젼 ChangeLog 기재
  3. 배포판 생성 테스트
  4. 커밋
  5. 태그
  6. 배포판 생성
  7. CPAN 업로드

  자... 그럼 대략 몇 번의 키보드 타이핑과 마우스를 몇번이나 클릭해야할까요? 아무튼 시간과 체력적인 면에서 많은 비용이 드는 것은 당연하겠죠.

  그럼 ShipIt 을 사용한다고 해봅니다. 그 전에 일단 ShipIt 을 실행할 준비를 해야겠죠.

  ShipIt 과 cpan-upload-http 를 설치합니다.

  ShipIt 은 평범하게 CPAN 을 통해서 설치할 수 있지만 cpan-upload-http 는 CPAN 인덱서에 걸리지 않는 듯 하니 직접 페이지에서 다운로드해서 설치합니다.
$ wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/cpan-upload-http-2.4.tar.gz
$ tar zxvf cpan-upload-http-2.4.tar.gz
$ cd cpan-upload-http-2.4
$ perl Makefile.PL
$ make & (sudo) make install   # use local::lib!!
  ShipIt 모듈 페이지에 자세한 설명이 나와있지만 여기서 다시 설명하면... 프로젝트의 루트 디렉토리에서

  1. 설정파일을 만듭니다. (프로젝트 루트 디렉토리에 .shipit 파일이 생성됩니다)
$ shipit --write-config
  2. 설정파일을 자신이 원하는 스텝/액션에 맞게 설정합니다.
# .shipit file
steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN
git.push_to = origin
  3. shipit 커맨드를 실행합니다.
$ shipit
Running step ShipIt::Step::FindVersion=HASH(0x10099c228)
Current version is: 0.04
Next/release version? [0.04]                                                                                                                                                      
Running step ShipIt::Step::ChangeVersion=HASH(0x10099c1f8)
Running step ShipIt::Step::CheckChangeLog=HASH(0x10099c0d8)
No mention of version '0.04' in changelog file 'Changes'
Edit file? [Y/n] y                                                                                                                                                                
Running step ShipIt::Step::DistTest=HASH(0x10099c2e8)
include /Users/jeen/Work/dev/WWW-Shorten-Durl/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/AuthorTests.pm
include inc/Module/Install/TestBase.pm
include inc/Module/Install/Include.pm
include inc/Test/Base.pm
include inc/Test/Base/Filter.pm
include inc/Spiffy.pm
include inc/Test/More.pm
include inc/Test/Builder.pm
include inc/Test/Builder/Module.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Makefile.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Writing Makefile for WWW::Shorten::Durl
Writing META.yml
rm -rf WWW-Shorten-Durl-0.04
/opt/local/bin/perl "-Iinc" "-MExtUtils::Manifest=manicopy,maniread" \
        -e "manicopy(maniread(),'WWW-Shorten-Durl-0.04', 'best');"
mkdir WWW-Shorten-Durl-0.04
mkdir WWW-Shorten-Durl-0.04/inc
mkdir WWW-Shorten-Durl-0.04/inc/Test
mkdir WWW-Shorten-Durl-0.04/inc/Test/Base
mkdir WWW-Shorten-Durl-0.04/inc/Module
mkdir WWW-Shorten-Durl-0.04/inc/Module/Install
mkdir WWW-Shorten-Durl-0.04/xt
mkdir WWW-Shorten-Durl-0.04/inc/Test/Builder
mkdir WWW-Shorten-Durl-0.04/lib
mkdir WWW-Shorten-Durl-0.04/lib/WWW
mkdir WWW-Shorten-Durl-0.04/lib/WWW/Shorten
mkdir WWW-Shorten-Durl-0.04/t
cd WWW-Shorten-Durl-0.04 && /opt/local/bin/perl "-Iinc" Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for WWW::Shorten::Durl
cd WWW-Shorten-Durl-0.04 && make LIBPERL_A="libperl.a" LINKTYPE="dynamic" PREFIX="/Users/jeen/local" INSTALL_BASE="/Users/jeen/local"
cp lib/WWW/Shorten/Durl.pm blib/lib/WWW/Shorten/Durl.pm
Manifying blib/man3/WWW::Shorten::Durl.3pm
cd WWW-Shorten-Durl-0.04 && make test LIBPERL_A="libperl.a" LINKTYPE="dynamic" PREFIX="/Users/jeen/local" INSTALL_BASE="/Users/jeen/local"
PERL_DL_NONLAZY=1 /opt/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/durl.t .. ok  
All tests successful.
Files=1, Tests=4,  1 wallclock secs ( 0.03 usr  0.01 sys +  0.16 cusr  0.03 csys =  0.23 CPU)
Result: PASS
rm -f \
      *.a core \
      core.[0-9] blib/arch/auto/WWW/Shorten/Durl/extralibs.all \
      core.[0-9][0-9] Durl.bso \
      pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \
      Durl.x  \
      perl tmon.out \
      *.o pm_to_blib \
      blib/arch/auto/WWW/Shorten/Durl/extralibs.ld blibdirs.ts \
      core.[0-9][0-9][0-9][0-9][0-9] *perl.core \
      core.*perl.*.? Makefile.aperl \
      perl Durl.def \
      core.[0-9][0-9][0-9] mon.out \
      libDurl.def perlmain.c \
      perl.exe so_locations \
      Durl.exp
rm -rf \
      blib
mv Makefile Makefile.old > /dev/null 2>&1
rm -f \
      Makefile.old Makefile
rm -rf \
      MYMETA.yml WWW-Shorten-Durl-0.04
rm -f WWW-Shorten-Durl-0.04.tar.gz
rm -f MANIFEST.bak _build
/opt/local/bin/perl "-Iinc" "-Ilib" "-MModule::Install::Admin" -e "remove_meta()"
rm -rf inc
/opt/local/bin/perl "-Iinc" "-MExtUtils::Manifest=fullcheck" -e fullcheck
Running step ShipIt::Step::Commit=HASH(0x10099d628)
[master 8a222dc] Checking in changes prior to tagging of version 0.04.  Changelog diff is:
 2 files changed, 6 insertions(+), 2 deletions(-)
Running step ShipIt::Step::Tag=HASH(0x10099f520)
pushing to origin at /Users/jeen/local/lib/perl5/ShipIt/VC/Git.pm line 92.
Counting objects: 14, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 953 bytes, done.
Total 8 (delta 3), reused 0 (delta 0)
To git@github.com:JEEN/WWW-Shorten-Durl.git
 * [new tag]         0.04 -> 0.04
Running step ShipIt::Step::MakeDist=HASH(0x10099f628)
include /Users/jeen/Work/dev/WWW-Shorten-Durl/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/AuthorTests.pm
include inc/Module/Install/TestBase.pm
include inc/Module/Install/Include.pm
include inc/Test/Base.pm
include inc/Test/Base/Filter.pm
include inc/Spiffy.pm
include inc/Test/More.pm
include inc/Test/Builder.pm
include inc/Test/Builder/Module.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Makefile.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Checking if your kit is complete...
Warning: the following files are missing in your kit:
    META.yml
Please inform the author.
Writing Makefile for WWW::Shorten::Durl
Writing META.yml
rm -rf WWW-Shorten-Durl-0.04
/opt/local/bin/perl "-Iinc" "-MExtUtils::Manifest=manicopy,maniread" \
        -e "manicopy(maniread(),'WWW-Shorten-Durl-0.04', 'best');"
mkdir WWW-Shorten-Durl-0.04
mkdir WWW-Shorten-Durl-0.04/inc
mkdir WWW-Shorten-Durl-0.04/inc/Test
mkdir WWW-Shorten-Durl-0.04/inc/Test/Base
mkdir WWW-Shorten-Durl-0.04/inc/Module
mkdir WWW-Shorten-Durl-0.04/inc/Module/Install
mkdir WWW-Shorten-Durl-0.04/xt
mkdir WWW-Shorten-Durl-0.04/inc/Test/Builder
mkdir WWW-Shorten-Durl-0.04/lib
mkdir WWW-Shorten-Durl-0.04/lib/WWW
mkdir WWW-Shorten-Durl-0.04/lib/WWW/Shorten
mkdir WWW-Shorten-Durl-0.04/t
/opt/local/bin/perl "-Iinc" -I. "-MModule::Install::Admin" -e "dist_preop(q(WWW-Shorten-Durl-0.04))"
COPY_EXTENDED_ATTRIBUTES_DISABLE=1 COPYFILE_DISABLE=1 tar cvf WWW-Shorten-Durl-0.04.tar WWW-Shorten-Durl-0.04
a WWW-Shorten-Durl-0.04
a WWW-Shorten-Durl-0.04/.gitignore
a WWW-Shorten-Durl-0.04/Changes
a WWW-Shorten-Durl-0.04/inc
a WWW-Shorten-Durl-0.04/lib
a WWW-Shorten-Durl-0.04/Makefile.PL
a WWW-Shorten-Durl-0.04/MANIFEST
a WWW-Shorten-Durl-0.04/META.yml
a WWW-Shorten-Durl-0.04/README
a WWW-Shorten-Durl-0.04/t
a WWW-Shorten-Durl-0.04/xt
a WWW-Shorten-Durl-0.04/xt/01_podspell.t
a WWW-Shorten-Durl-0.04/xt/02_perlcritic.t
a WWW-Shorten-Durl-0.04/xt/03_pod.t
a WWW-Shorten-Durl-0.04/xt/perlcriticrc
a WWW-Shorten-Durl-0.04/t/durl.t
a WWW-Shorten-Durl-0.04/lib/WWW
a WWW-Shorten-Durl-0.04/lib/WWW/Shorten
a WWW-Shorten-Durl-0.04/lib/WWW/Shorten/Durl.pm
a WWW-Shorten-Durl-0.04/inc/Module
a WWW-Shorten-Durl-0.04/inc/Spiffy.pm
a WWW-Shorten-Durl-0.04/inc/Test
a WWW-Shorten-Durl-0.04/inc/Test/Base
a WWW-Shorten-Durl-0.04/inc/Test/Base.pm
a WWW-Shorten-Durl-0.04/inc/Test/Builder
a WWW-Shorten-Durl-0.04/inc/Test/Builder.pm
a WWW-Shorten-Durl-0.04/inc/Test/More.pm
a WWW-Shorten-Durl-0.04/inc/Test/Builder/Module.pm
a WWW-Shorten-Durl-0.04/inc/Test/Base/Filter.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install
a WWW-Shorten-Durl-0.04/inc/Module/Install.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/AuthorTests.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Base.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Can.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Fetch.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Include.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Makefile.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Metadata.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/TestBase.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Win32.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/WriteAll.pm
rm -rf WWW-Shorten-Durl-0.04
gzip --best WWW-Shorten-Durl-0.04.tar
Distfile now at /Users/jeen/shipit-dist/WWW-Shorten-Durl-0.04.tar.gz
Running step ShipIt::Step::UploadCPAN=HASH(0x10099f580)
Upload to CPAN? [Y/n] Y                                                                                                                                                           
$
 이걸로 끝입니다.

 아, 여기에서의 Step 중에 마지막에 UploadCPAN 이 있는데, 이 경우에는 홈 디렉토리에 .pause 파일을 필요로 합니다.
 물론 PAUSE 계정이 있어야 되겠죠.
# .pause in your home directory
user JEEN
password ********
mailto [YOUR EMAIL]
 .pause 파일을 생성했으면 chmod 600 으로 설정해서 다른 사람이 읽지 못하도록 합니다 (이것도 ShipIt 에서 체크되며, 다른 사람이 읽을 수 있다면 자동으로 처리를 중단시켜버립니다).

 .shipit 에서 자신이 원하는 스텝을 추가해주기만 하면 됩니다. 이것도 확장성을 고려해서 설계되어 있기 때문에... ShipIt::Step::* 의 네임스페이스를 통해서 자신만의 스텝을 만들어 나갈 수 있습니다.
  현재 다른 CPAN 모듈 제작자들이 Twitter  에 릴리즈 정보를 트윗한다든가 하는 스텝 모듈이 있기는 합니다. 그걸 참고하면 쉽게 만들 수 있을 겁니다. (저도 뭐 생각나면 만들어 볼까 생각하고 있습니다)

  그외 자세한 내용은 ShipIt 모듈 페이지를 참고하면 도움이 될 겁니다.

   http://search.cpan.org/perldoc?ShipIt

  혹시 모르시는 것이 있다면 저도 같이 노력해서 궁리해보고자 합니다. :-)
  ShipIt 으로 이제 마구마구 만들고 배포를 해보도록 합시다!
신고
IT/Perl 2009.10.02 18:05

[CPAN] 거저 먹는 CPAN 모듈 만들기 - WWW::Shorten::Durl

  Daum 에서 만든 Durl 이라는 서비스가 있습니다. Twitter 하시는 분이라면 누구나 알고 있는 흔하디 흔한 짧은 URL 로 바꿔주는 서비스입니다. Durl 의 경우는 여기에 지정한 url 을 캡쳐뜨는 기능을 덧붙여서 다른 서비스들과 차별화를 뒀는데요.
  최근에 커뮤니티 부흥을 위한 웹 서비스 개발을 위해서 TinyURL 을 써야되는데... 캡쳐도 된다고 하니.. 이번기회에 Durl 을 써보기로 했습니다(왠지 캡쳐된 이미지를 따로 보여줄 수 있다면 좀 짱일 것 같다는 생각때문에)..

  Durl 의 OpenAPI 문서는 아주 요점만 간단하게 설명되어 있습니다.

  http://durl.me/doc/OpenAPI.html

  XML이 뭔지 JSON이 뭔지 알고 있으며, API 를 어떻게 쓰는 지 알고, 간단한 프로그래밍 언어만 알면 누구나 구현할 수 있는 모듈을 CPAN 에 올렸습니다.

  이름하야 WWW::Shorten::Durl.

  http://search.cpan.org/perldoc?WWW::Shorten::Durl

  대개의 URL 을 줄여주는 서비스들의 네임스페이스가 WWW::Shorten 을 기반으로 하고 있기 때문에 저도 이것을 사용했습니다. WWW::Shorten 자체가 확장성을 고려된 형태였었지요.  Durl 뿐만 아니라 십수가지 서비스들의 모듈이 저 네임스페이스(WWW::Shorten::*) 을 쓰고 있습니다.

  사용법도 간단합니다.

  makealongerlink(URL), makeashorterlink(URL)

  이걸로 끝이죠.
  이런 간단한 기능에 객체지향이니 뭐니 하기도 그렇고...

  아, github 를 레포지트리로 놔두고 작업했습니다. 사실 펄 커뮤니티용 git repository 가 있기는 한데... 뭐 외부에서는 접근하기는 힘들기도 하고, 공개하기 쉬운 방향으로 가기 위해서!

  http://github.com/JEEN/WWW-Shorten-Durl

  이상으로 아무튼 쉽게쉽게 물타기 해서 만들 수 있는 CPAN 모듈의 얘기였습니다.

  이번 CPAN 모듈 작성에 있어서 도움이 된 ShipIt 등에 대한 이야기는 별도로 포스팅하도록 하겠습니다.
신고
TOTAL 462,194 TODAY 45

티스토리 툴바