블로그 이미지
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.08.24 18:54

[ SVN/Perl/Inotify ] 고객 후렌들리하게 SVN 운용법 - 자동커밋/업데이트

  A 라는 회사는 B 사의 웹서비스를 운영하면서 밥벌이를 하고 있다. 그러니 B 회사는 A 회사에게 "너흰 우리때문에 밥먹고 사는 거잖아" 라며 거만해 한다. A 회사는 꾸벅꾸벅 말도 잘 듣고 있다.

  A 회사의 J 군은 최근에 B 회사의 일을 중간에 떠맡았다.
  B 회사의 서비스는 흔히말하는 MVC 구조로 이래저래 잘도 관리되고 있는 형국이다.
  거기에 소스코드 관리도 SVN 을 쓰면서... 코드또한 별시리 문제가 없이 관리되고 있었다.

  어느날 B 사의 디자이너에게 전화가 와서, SSSS 라는 페이지가 이상하다는 얘기를 듣고 원인 파악에 나섰다. SSSS 페이지에 표시되어야 할 배너가 표시되지 않고 있다는 뭐 그런 얘기였다. "단순한 화면 표시 어쩌고 저쩌고 라면 그냥 니가 하면되잖아" 라고 소리치고 싶은 J군은 템플릿 파일을 훑어봤지만 그딴 거 없었다.
 하지만 B 사의 디자이너는 <이제껏 나왔었다. 갑자기 안나온다! 시스템 문제가 있는 거 아니냐?> -- 대략 이런 러쉬를 걸어오기 시작했다.

  이쯤에서 J군은 B 사의 웹서비스의 치명적인 맹점을 알게되었다.

  1. B 사의 디자이너는 PHP 코드따위 만질 일 없다.
  2. 템플릿이라면 때에따라서 유연하게 바뀌어야 하니, 템플릿 파일은 FTP 로 올린다.
  3. FTP 로 올라온 템플릿 파일은 이전 파일이 뭐든 간에 일단 덮어씌우고 본다.
  4. B 사의 디자이너는 가끔 템플릿 파일에 {php} {/php} 라는 것도 해놓았다.
  5. B 사의 디자이너는 SVN 을 모른다.
  6. B 사의 디자이너는 백업이라는 행위의 중요성을 실감하지 못했다.

  즉, 이제껏 B 사의 디자이너가 작업한 것들은 백업/소스코드 관리 가 이뤄지지 않은 상태였다.
  그러니 로고가 어찌되었는지에 대한 상황파악은 어려운 상태!
  SVN 좀 쓰면 안되겠니? 라고 해도... 그런 거 배울 시간이 없다는 적절한 핑계로 넘어가 주신다.

  그래서 서버에서 디자이너가 FTP 로 파일을 올리면, 그대로 커밋 => Product 업데이트 를 자동으로 수행해야 한다.

 ________________________

 미션은 대략 위의 상황과 같습니다.
 FTP 로 올라오는 파일의 변경 이력을 실시간으로 파악해서, 그것을 바로 커밋하고, Product 환경에서 자동으로 업데이트 해주는 것입니다.
  서버의 환경은 Linux(CentOS) 이며, 커널 버젼은 2.6 이상입니다.
  리눅스 커널 2.6 부터는 Inotify 라는 것이 생겼습니다. 시스템 상의 특정 파일/디렉토리의 생성/변경을 파악할 수 있는 기능이죠. :-)

  Perl 구현으로는 Linux::Inotify 가 있습니다. 그리고 이것을 래핑한 File::ChangeNotify 라는 모듈을 사용하기로 했습니다. (Mooose++)

# svn-auto-commit-update.pl
use strict;
use warnings;
use File::ChangeNotify;

my $watcher = File::ChangeNotify->instantiate_watcher(
    directories => [ @ARGV ],
);

while ( my @events = $watcher->wait_for_events() ) {
    my @files;
    for my $event ( @events ) {
        my $path = $event->path;

        # filter 한다면 filter 처리 (.swp 등의 파일은 커밋필요없음. 혹은 디자이너의 파일 백업 스타일(index.html => index.html.090822)를 고려) 
       
        # $event->type 에는 (create/modify/delete/unknown) 이 있으니, 각자 맞는 걸 쓰면 되겠죠?
        if ($event->type eq 'create') {
            system("svn","add", $path);
        }
        # ... delete 라든가의 경우도 삭샥샥
        push @files, $path;
    }
    system("svn","commit",@files,"-m YYMMDD,, fucking designer's templates");
    system("svn", "update", "/path/path2/product/template/");
}

  실행은
perl svn-auto-commit-update.pl [해당 디렉토리]
  로 실행하면 됩니다.

  물론 아직 제대로 안써봤습니다. 그냥 이러면 안될까 해서 그냥 써봤을 뿐입니다;;
  제 맘대로 서비스 정책과 운용룰을 여차저차 할 수 없으니ㅜㅜ
  뭐 권한이 어쩌니, 디렉토리 구성이 어쩌니, 파일 경로가 어쩌니 자질구레한 건 생략합니다.

  Linux Inotify 에 대한 얘기는 좀 오래된 얘기고... 실제로 이것을 어떻게 사용하느냐 하는 건 잘 모르겠지만, 아마 이런 곳에도 사용될 수 있지 않을까 합니다.

  최근 일본의 Fi*** 라는 사진공유 서비스는 디렉토리를 지정해서 거기에 파일을 올리면 자동으로 업로드되는 툴을 만들어 놨습니다. 뭐 위의 코드와는 달리 리눅스 이외의 여러 OS 도 고려한 툴이겠지만요. (Mac 에서 밖에 테스트 안해봤습니다)
   (이것도 Inotify 를 통해서 Flickr 나 Picasa 에 자동으로 올라가도록 해보고 나중에 블로깅을 해볼 수 있다면 해보지요 :-) )

    그리고 rsync 대신에 이렇게 미러링하는 것은 어떠냐? 라는 얘기로 최근에 본 위키페이지도 있습니다.

 - http://trac.mizzy.org/public/wiki/InotifyAndMakuosan

    참고가 되었으면 합니다.
신고
IT/Perl 2008.09.03 11:52

[ Perl ] Offline 에서도 일해야하는 경우?


  Slideshare 를 돌아보던 중에 재미있는 Slide를 보게 되었습니다.

  이번 YAPC::EU 2008 에서의 Slide 인데요. YAPC::Asia 2008 에서도 본 적이 있는 Leon Brocard 의 이 슬라이드 입니다.


Getting things done away from a network
View SlideShare presentation or Upload your own. (tags: perl yapc::eu::2008)

 말 그대로 인터넷이 안되는 곳에서 일을 하는 방법 같은 것인데요.
 
 실제 다음주에 한국갈 즈음에 실제로 하려고 할 내용이라서 반갑기 그지 없다고 할까요?

 현재 SVK 도 사용하고 있고,

2008/07/10 - [IT/Tips] - [ 버젼관리 ] SVK - 로컬에서 맘껏 커밋때리기
2008/08/04 - [IT] - [ 버젼관리 ] 공연히 생각한 개인소스코드 관리

  MiniCPAN 같은 경우도 KPW2008 에서 keedi 님께서 짧게 소개시켜 준 Slide 가 있기 때문에..

  한번 해볼까 하고 생각하고 있습니다. 아니면 Perl Hackathon 같은 경우에도 도움이 될지두요.

  Reference 나 Documentation 들도 전부 휴대용 하드디스크에 몇 기가씩 담아두고 있으니...

  다음주 한국가기 전에 이런 준비를 제대로 해놔야 될 듯 하겠습니다. :-)

  아무튼 SVK, CPAN::Mini .. 생각했던 게 그대로 slide 에 있으니까 반가워서 끄적거려 봤습니다.

신고
IT 2008.08.04 16:05

[ 버젼관리 ] 공연히 생각한 개인소스코드 관리

  Perl로 작업하다 보면(뭐, 굳이 이야기하면 Perl 뿐만 아니라), 단발에 끝나는 작업들이 많이 있습니다.

  주로 데이터 집계나 해석용으로 만드는 간단한 스크립트들인데요. 일때문에 서둘러 만들어서 쓰고는 별도로 관리하지 않고 그대로 놔둡니다. 그리고는 시간이 지나서... "이거 뭐하는 거지?" 라고 물음표를 세 번정도 날리고... "필요없나보다" 하고 지워버립니다.

  그렇게 지우고서, 집계 소스 데이터는 또 덩그러니 놔둡니다. 그것도 나중에는 어디에 쓰는 건지 몰라서 또 지워버리죠.

  (주로 단발에 끝나는 스크립트들은 대개 이름조차도 성의없는  d.pl, e.pl, a.pl, blah.pl 등등등 입니다)

  그리고는 시간이 지나고, 다시 비슷한 작업을 할 때가 오고... "어라 이거 예전에 했던 건데" 하고는 예전에 작업한 곳들을 뒤져봐도 답이 안나옵니다. 그리고 또 다시 만들고... 이렇게 시간을 버리는 것이죠.

  프로젝트 돌아가는 Repo 서버에 집어넣는 것도 좀 그렇다 싶어서...
  요즘에는 아예 개인적인 Repo 를 만들어버렸습니다.

사용자 삽입 이미지

  (근 1년새에 Google Code 에 만든 Project 들인데요... 대부분 Ownership 이 되어있어서;; Project Owner 아니면 참가도 안하는 놈으로 낙인이 찍혀버렸습니다)

  일단 적당한 분류법도 정해놓지 않았습니다. 일단 코드가 있다면 적당한 주석을 집어넣고 일단 닥치는 대로 커밋해버립니다. 분류는 자료가 모인다음에 해도 늦지 않을 거라고 생각해서 입니다.
 
  커밋을 위한 어떤 기준도 없습니다. 그냥 10줄 이상의 코드라면 일단 커밋하고 본다는 것이죠. 기준같은 것이야, 어느 정도의 규모가 되고나서 생각해도 된다고 생각해서 입니다.

  사실 이런식으로 일단 커밋하고 보자는 게 일본의 Repository 공유 Project 인 CodeRepos 인데요.
  CodeRepos 를 보고 있으면 사람이 많아질 수록 어떤 기준과 분류가 생겨서 자유로움이 없어지는 경향이 있어서요. 거기에 여러 사람이 있으면 지켜야할 룰이 있어야 하는 것은 당연하게 되죠.

  그래서 다른 사람 눈치볼 필요도 없고, 룰따위도 전혀없이 제 맘대로하는  순전 100% 개인용 Repository라는 겁니다.(사실 개인 서버를 Repo 서버로 할 수도 있지만 Trac 같은 서비스 올리는 것도 싫고 해서.. Google Code 를 골랐습니다)

  그리고는 하루에 두서너개씩 커밋을 합니다. 개인용 스크립 뿐 아니라, 업무에서 사용하는 다른 사람들 스크립트도 마구잡이로 끌어들이고 있고... 웹에서 줏어들은 스크립트도 모으고 있습니다.

  뭐, 그냥 이러다가보면 언젠가 도움되겠지 하는 막연한 생각이 드는 것이라고 할까요?

  (근데 Google Code 에서 자기 Project 의 소스검색이 안되네요? -- 안된다기 보다는 일반적인 검색방법과 다른걸까나.. 사용법을 잘 모르겠네요. 이러면 Gonzui 같은 소스검색기를 도입해야 되는건가?)

  (결국은 혼자서 중얼중얼 이었습니다)
신고
IT/Tips 2008.07.11 09:07

[ 버젼관리 ] SVK - 로컬에서 맘껏 커밋때리기

 올해 초(2008. 2. 22)부터 perldoc 의 번역을 계속 해오고 있습니다.
 구글코드에서 저장소 하나 받아가지고 거기에다가 열심히 커밋을 하고 있구요.
 현재 리비젼이 300번을 돌파하는 기염을 토하고 있습니다(Ownership 가진 제가 이런 말해도 될런지..;;).

 번역은 주로 지하철을 타고 오고가는 출퇴근 시간에 하고 있습니다. 한번 타면 20분 정도 운좋으면 앉아서 열심히 키보드 두드릴 수 있죠. emacs 에서 열심히 두드리고, 회사에서 인터넷 선 꼽자마자 일단은 커밋을 하고는 합니다.

 여기서 제가 든 생각이...

  "인터넷 안들어와도 로컬에서 작업하고 커밋할 수는 없을까?"

 그래서 눈을 뜬 것이 SVK 였습니다.
 (사실 집의 서버에 SVK 를 깔려다가 삑사리 맞아서 그냥 놔두고 있고, 사실 항상 인터넷 선이 꼽힌 서버에게 SVK 의 필요성은 그리 없었습니다.)

 Mac 용 SVK 패키지를 제공해주기 때문에 간단하게 인스톨할 수 있었습니다.

 그리고 구글의 저장소를 제 MacBook 에 미러링하고...
 
svk mirror http://perldoc-kr.googlecode.com/perldoc-kr/trunk //mirror/perldoc-kr/trunk
svk sync


 그 미러링한 것을 브랜치만들어서...
svk cp //mirror/perldoc-kr/trunk //mirror/perldoc-kr/branches/local/
svk checkout //mirror/perldoc-kr/branches/local perldoc-kr


 그 브랜치에서 작업하고, 작업한 것은 인터넷이 안들어와도 차곡차곡 커밋되게 된다는 것입니다.
 svk ci blahblah

 대량 커밋도 순식간에 슥삭 끝나곤 하니까 참 좋더군요(어차피 로컬 미러에 대고 하니까요...)

 그렇게 차곡차곡 쌓인 분량을 또 한번에 밀어넣는 재미도 쏠쏠하더군요.
 svk push --verbatim

 거기에 브랜치에서 저장소의 최근 리비젼도 그대로 받아올 수 있으니...
svk pull


 안그래도 올 9월에 한국에 갈텐데... 그때가 아마 회사가 바쁠 시점이라 일을 들고 갈 듯 싶어서...
 집에 인터넷이 끊겼는데 어쩜 좋지... 하는 마당에 이런 수단이 생겨서 기쁩니다(기쁜 일인지 모르겠지만;;).

 SVK 를 만든 C.L.Kao 도 지난 YAPC::Asia 2008 에서 봤었고, 그때 했던
 "Your Freesoft will be running at our company" 라고 했던 약속도 지키게 되는 것이죠.
 (사실은 슬라이드에 대고 했지만..;;)

사용자 삽입 이미지
( 근데 svk 로 커밋했을 때-- 사실은 svk push--는 저렇게 별표가 쳐지는데... 왜 그럴까요?)
신고
TOTAL 464,269 TODAY 44

티스토리 툴바