İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Burak Bayramlı
bayramli@bilisimcumhuriyeti.com

CVS ile Yazılım Geliştirme Metodu

CVS en cok kullanilan Kaynak Kod Idare programlarindan birisidir. "Acik Yazilim" (Open Source) projeleri surekli CVS kullanirlar.

Kitleme usulu calisan KKI sistemlerinde, kayitlar once kitlenir, baska kimse erisemez, sadece tek bir kisi degisim yapip kayidi depoya geri verir.

Dalli/Budakli Kod Agaci metodu kullanan KKI sistemleri, ana kod agacindan, bir dal yaratip onun uzerinde calismaya imkan verir, ve gerektiginde bu daldan ana koda 'birlestirme' yapilabilir. Cakismalarin mutlaka cozulmesi gerekir. CVS dallanmaya izin verir. Fakat bizim tavsiyemiz, CVS ile dallanma kullanilmamasi.

Proje tecrubemizde karsimiza bir cok KKI sistemi cikti. PVCS (kitlemeli), ClearCase (dallama/budaklama sistemi cok rahattir) adli programlari kullandik. Bunlarin icinden ClearCase, bazi isleri rahat yapmanizi saglasa da, genelde butun duzeninizi zorlastiracaktir, ve kurmasi ve idaresi muthis zor bir programdir. PVCS'in durumu rezalet otesidir, o yuzden kategoriye alinmasina bile gerek yok.

CVS kullanmaya karar verdiyseniz, isabet ettiniz. Ayni sirkette ve projede 40 kadar programcinin CVS'i basari ile kullandigini duyduk. CVS kullanirken dikkat etmeniz gereken husus sudur:

Butun programcilar, ana depoya kendileri 'birlestirme' yaptiklari icin, bazen butun kaynak kodunuzda hatalar artabilir. Yani, birbirinden habersiz yapilan degisiklikler, ana kod agacini hasta bir hale getirebilir. Bazi gordugumuz KKI duzenlerinde, tek bir kisi butun programci dallarindan ana agaca birlestirmeyi yapiyordu. (CVS'te herkes kendi yapar). Bu kisi her degisime bakabildigi icin (ve gorevi uzere), birbirine uymayan degisiklikleri iptal edebiliyor. Fakat bizce bu tek kisilik gorev cok zor, ve bir insana cok yukleniyor.

Onun yerine, kontrolu herkese geri veriyoruz. Fakat, ana agacin durumunu surekli kontrol etmemiz gerekiyor. Bunun cok basit bir yolu var. Otomatik bir sekilde, her saatte bir, butun kaynak kodunu derleyip, testlerden gecirirsiniz. Eger yanlislar bulunursa, otomatik olarak bu yanlisler e-mail ile herkese gonderilir.

Once yeni bir Unix kullanicisi yaratin. Adi 'canavar' olsun mesela. Canavar her saatte bir, Unix cron kontrolunde uyanir. Uyaninca ilk yapacagi sey cvs co komutunu isletmek olacak. Boylece depodan en yeni kaynak kodlar alinir.

Bundan sonra canavar, ant, make ile butun kaynak kodu derleyecek. Sonra JUnit testlerini isletecek. Butun bunlari bir "takip dosyasinda" (log file) gorunmesi lazim. Is bittikten sonra bir grep komutu ile 'Syntax error', TEST FAILED gibi cumleler aranir. Bulunursa, e-mail, takip kayidi ile postalanir. Suclu programcilar bulunup falakaya yatirilir. ($aka $aka..)

Asagidaki script bizim son projemizde benim yazdigim script. Sizin projenizin derleme komutu degisik olabilir, onu degistirin. Unutmayin, derleme ile testleri mutlaka isletin. Sonuclarin ayni takip dosyasinda olmasina ozen gosteren.

#!/usr/local/bin/perl

chdir ($ENV{'HOME'});

$cvs_command = "cvs co sizinprojeniz > /tmp/co_out.txt 2<&1";
system($cvs_command);

$lines_1 = 0;
$lines_2 = 0;
$lines_1 = system("grep \'^U \' /tmp/co_out.txt");
$lines_2 = system("grep \'^A \' /tmp/co_out.txt"); 
exit if ($lines_1 != 0 && $lines_2 != 0);


$curr_date = `date '+%m/%d/%y-%M'`; chomp($curr_date);
$curr_date =~ s/\//\-/g;

$log_name = $ENV{'HOME'} . "/logs/build_log_" . $curr_date;

system("derle.sh > $log_name 2<&1");

$cmd = "grep \'BUILD_FAILED\' $log_name";
#print $cmd . "\n";

$lines = system("grep \'BUILD FAILED\' $log_name");    

send_mail ("***Hata Bulundu***", $log_name)  if ($lines == 0);

send_mail ("Basari!", $log_name)  if ($lines != 0);

exit;

sub send_mail {
    $note = shift;
    $log = shift;

    @lines = `cat $log`;
    open (MESSAGE, "| /usr/lib/sendmail -t");
    print MESSAGE "To: ali\@falan.com,veli\@falan.com\n";
    print MESSAGE "From: Canavar\n";
    print MESSAGE "Subject: Derleme-Testler: $note\n";
    print MESSAGE "\n";
    print MESSAGE "\n";
    print MESSAGE "Takip dosyasi $log notu var $note\n";
    print MESSAGE "\n";
    print MESSAGE "@lines" . "\n";
    print MESSAGE "\n";
    close (MESSAGE);
}

Ve asagidaki satirlari cron icin girin.

0 10,11,12,13,14,15,16,17,18,19,20,21,22 * * 1-5 /falan/filan/derle.pl > /dev/null 2<&1

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır