Subversion Versiyon Kontrol Sisteminin Kurulumu ve Apache Üzerinden Kullanımı

Yazan: Ulath AKA: Murat HAZER

<murathazer (at) gmail.com>
<http://www.projedunyasi.org>

Günümüzde açık kod camiası tarafından en çok tercih edilen versiyon yönetim sistemleri (VYS) Concurrent Versions System (CVS) ve CVS'in yeni ve geliştirilmiş hali olan Subversion(SVN)'dir. Versiyon yönetim sistemleri sadece programların kaynak kodlarını yönetmek için değil çok çeşitli işler için kullanılabilmektedir. Örnek vermek gerekirse, herhangi bir GNU/Linux makinede kendi ev dizinimizi (home directory) VYS yardımıyla yönetebiliriz. (http://linuxjournal.com/article/5976). Kısacası kaybetmek istemediğimiz ve ileri bir tarihte eski hallerini görmek isteyeceğimiz veya aynı anda birden fazla kişinin düzenlediği herhangi bir dosya için VYS kullanabiliriz. CVS hakkında daha fazla bilgi edinmek istiyorsanız CVS Açık Kod Yazılım Geliştirme dökümanına bakabilirsiniz.

Bu dökümanda üzerinde GNU/Linux çalışan bir makineye nasıl SVN-Apache kurulacağını, bu programların nasıl yapılandırılacağını, nasıl SVN kaynak deposu oluşturulup, kullanılacağını, oluşturduğumuz SVN kaynak depolarının nasıl test edileceğini ve dökümanın en sonunda elimizde bulunan CVS kaynak kodlarını nasıl SVN kaynak kodlarına çevirebileceğimizi kısaca anlatmaya çalışacağım.

Öncelikle kısaca SVN'e değinelim;

SVN bir önceki nesli olan CVS'in hemen hemen bütün özelliklerini içermektedir, bu ikisi arasındaki farklılıklara kısaca;

ve bunlara ek olarak SVN yeni bir çok özellik daha barındırmaktadır. SVN'nin diğer özelliklerini, gelişmeleri ve detaylı açıklamaları http://subversion.tigris.org/ adresinden öğrenebilirsiniz.

Bu dökümanı hazırlarken SVN sunucusunun çalışacağı platform olarak SUSE 9.3 kullandım fakat yeri geldiğinde aynı işlemleri Debian ve türevlerinde nasıl yapabileceğinizi de anlatmaya çalışacağım. SUSE'yi http://www.opensuse.org, Debian'ı http://www.debian.org, Ubuntu'yu http://www.ubuntulinux.org adreslerinden temin edebilirsiniz.

1- SVN ve APACHE Kurulumu:

SVN sunucuyu kullanmanın tavsiye edilen yöntemi SVN-Apache entegrasyonudur, diğer yöntem ise svnserve programını kullanmaktır. İkinci yöntemi bu dökümanda anlatmayacağım, detaylı bilgi almak isteyen arkadaşlar var ise http://svnbook.red-bean.com/en/1.1/ch06s03.html adresindeki dökümandan istedikleri bilgiye ulaşabilirler.

SUSE'ye SVN ve Apache kurmak için YAST'ı konsoldan veya grafiksel arayüzden çalıştırıp aşağıdaki paketleri kurmamız gerekmektedir.

Debian için ise;

2- SVN'de bir kaynak deposu oluşturulması:

İlk olarak bütün kaynak depolarımızın tutulacağı bir klasör belirleyelim (/subversion/depo) ve bu klasörün sahipliğini wwwrun kullanıcısına (Apache tarafından kullanılan kullanıcı) verelim. Daha sonra ise wwwrun kullanıcısına geçip svnadmin komutunu kullanarak bir svn deposu oluşturalım. (SUSE'de sistem kullanıcılarına bir kabuk programı atanmadığından bu kullanıcıya su - wwwrun komutuyla geçmeye çalıştığınızda başarısız olacaksınızdır. Bundan dolayı bu şu komutları sırasıyla root olarak çalıştırmak gerekmektedir)

linux: # mkdir /subversion
linux: # mkdir /subversion/depo
linux: # chown wwwrun:www /subversion/depo
linux: # su --shell=/bin/sh -c "svnadmin create /subversion/depo/projem" wwwrun

Aynı işlemleri Debian'da yapmak için ise;

linux: # sudo su
linux: # mkdir /subversion
linux: # mkdir /subversion/depo
linux: # chown www-data:www-data /subversion/depo
linux: # su - www-data
linux: # svnadmin create /subversion/depo/projem
linux: # exit

3- APACHE yapılandırması:

Birinci adımın başında da belirttiğim üzere SVN'nin tavsiye edilen sunucu kullanımı SVN-Apache entegrasyonudur. Apache'yi SVN kullanmak üzere yapılandırmak SVN kaynak deposu oluşturmak kadar kolaydır. Tabii ki Apache yönetimi ve kullanımı oldukça detaylı bir konu burada bu detaylara inemeyeceğim, sadece SNV-Apache entegrasyonu için nerede ne yapmamız gerektiğini adım adım anlatmaya çalışacağım.

Apache yapılandırması için;

SUSE'de /etc/apache2/vhosts.d klasörü altına subversion.config isimli bir dosya oluşturup ve bu dosyayı aşağıdaki şekilde düzenleyelim.

<VirtualHost *:80>                                      ............... 1
    ServerAdmin siteyoneticisi@email.com                ............... 2
    ServerName svn.sitemiz.com                          ............... 3
    LoadModule dav_module /usr/lib/apache2/mod_dav.so   ............... 4
    LoadModule dav_svn_module /usr/lib/apache2/mod_dav_svn.so ......... 5
    LoadModule authz_svn_module /usr/lib/apache2/mod_authz_svn.so ..... 6

    ErrorLog /var/log/apache2/svn-server-error_log      ............... 7
    LogLevel warn                                       ............... 8
    CustomLog /var/log/apache2/access_log combined      ............... 9

    HostnameLookups Off                                 ............... 10

    UseCanonicalName Off                                ............... 11

    ServerSignature On                                  ............... 12

   <Location /projem>                                   ............... 13
        Order allow,deny                                ............... 14
        Allow from all                                  ............... 15
        DAV svn                                         ............... 16
        SVNPath /subversion/depo/projem                 ............... 17
        Satisfy any                                     ............... 18
        Require valid-user                              ............... 19
        AuthType Basic                                  ............... 20
        AuthName "Projem icin SVN by ULATH"             ............... 21
        AuthUserFile /subversion/.dav_svn.passwd        ............... 22
        AuthzSVNAccessFile /subversion/.svn_access_file ............... 23
   </Location>
</VirtualHost>

1. satırda apache'de 80 nolu porttan gelen istekleri kabul edecek bir VirtualHost çalışacağını belirtiyoruz. 4,5 ve 6. satırlarda SVN ve Apache'nin birlikte çalışabilmesi için sistemimizde bulunması gereken modüllerin yüklenmesini istiyoruz. (Bu modüller 1. adımda yüklediğimiz programlarla beraber geliyor.) 7,8,9,10,11 ve 12. satırlar klasik Apache yapılandırma satırları, bunlarla ilgili detaylı bilgileri apache dökümanlarından elde edilebilir. SVN'in çalışması için önemli yapılandırmalar 13. ve sonraki satırlar.

13. satırda depoya erişim isminin projem olmasını istiyoruz. (örnek, http://server_ip_no/projem)

14 ve 15. satırlarda apache'nin her bağlantıyı kabul etmesini istiyoruz.

16. satırda SVN kurulumu ile birlikte gelen ve 4,5,6. satırlarda yüklediğimiz modüllerin DAV sağlayıcı olarak çalışmasını istiyoruz.

17. satırda oluşturduğumuz SVN deposunun yerel diskimizdeki konumunu veriyoruz.

18,19,20. satırlarda SVN'e bağlanılırken kullanılacak kullanıcı doğrulama yöntemlerini belirliyoruz.

21. satırda kullanıcı adı ve şifre sorulan ekranda gösterilecek bilgiyi belirliyoruz.

22. satırda SVN deposunu kullanabilecek kullanıcıların kullanıcı adı ve şifrelerinin bulunduğu dosyanın yerel

diskimizdeki yerini belirtiyoruz. (Bu dosyayı biraz sonra daha detaylı açıklamaya çalışacağım)

23. satırda ise hangi kullanıcının hangi depolara erişip, erişemeyeceğini ve bu depolar üzerindeki erişim

haklarını belirleyen dosyanın yerel diskimizdeki yerini belirtiyoruz. (Bu dosyası da biraz sonra detaylı olarak açıklamaya çalışacağım)

Debian'da ise, yukarıdaki VirtualHost tanımlamasını /etc/apache2/sites-available/ klasörü altında subversion isimli yeni bir dosya oluşturup, bu dosyanın içine eklemeliyiz. Ayrıca 4, 5 ve 6. satırlarda yüklenmesini istediğimiz modüller Debian'da /usr/lib/apache2/modules/ klasörü altındadır, bu satırları bu farklılığı göz önünde bulundurarak yeniden düzenlememiz gerekmektedir. (Yukarıda yazdığımız Virtualhost tanımlaması debian ile beraber gelen default konfigurasyon ile çakışacaktır bundan dolayı /etc/apache2/sites-enabled klasörü altındaki 000-default isimli linki silmemiz gerekecektir). Son olarak,

linux: # ln /etc/apache2/sites-available/subversion /etc/apache2/sites-enabled/subversion

komutu ile sites-enabled klasörü altında sites-available/subversion dosyasına bir link oluşturmamız gerekmekte.

4- SVN kullanıcılarının ve kullanıcıların kaynak depolarına erişim haklarının belirlenmesi:

Apache yapılandırmasından sonra yapmamız gereken, bir önceki aşamadaki 23. ve 23. satırlarda belirtilen dosyaların tanımlanması ve yapılandırılmasıdır.

Kullanıcı tanımları için /subversion klasörü altında .dav_svn.passwd isimli bir dosya oluşturup, bu dosyaya htpasswd2 yardımıyla kullanıcı eklemeliyiz,

linux: # htpasswd2 -cm /subversion/.dav_svn.passwd ulath

bu komut size bir şifre soracaktır, bu şifreyi girdikten sonra kullanıcımızın oluştulması işlemi tamamlanacaktır. Yeni bir kullanıcı eklemek için yukarıdaki komutu htpasswd2 -m kullanıcı_adı şeklinde değiştirmek gerekecektir. İlk komutdaki -c parametresi kullanıcı adı ve şifrelerin tutulacağı dosyayı oluşturmak içindir. Örnek olması için bir tane daha kullanıcı ekleyelim,

linux: # htpasswd2 -m mhazer

Kullanıcıların erişebileceği depoları belirlemek, ve bu depolar üzerindeki haklarını belirlemek için ise /subversion klasörü altında .svn_access_file isimli bir dosya oluşturup,

linux: # vi /subversion/.svn_access_file

daha sonra bu dosyayı aşağıdaki şekilde düzenlememiz gerekmektedir.


[projem:/]
ulath = rw
mhazer=r
            

Bu dosyada, projem isimli deponun ulath isimli kullanıcının okuma ve yazma yetkisi ile, mhazer isimli kullanıcının ise sadece okuma yetkisi ile kullanabileceği belirtilmektedir. Eğer ikinci bir projemiz olsaydı ve bu projenin her iki kullanıcı tarafından okuma ve yazma yetkisi ile kullanılmasını ve herhangi bir kullanıcı tarafından sadece okuma yetkisi ile kullanmasını isteseydik bu dosyanın içeriği aşağıdaki şekilde olacaktı;


[projem:/]
ulath = rw
mhazer=r
[projem2:/]
ulath = rw
mhazer=rw
*=r
            

Bu dosyada yapılabilecek tanımlamalar ve daha detaylı açıklamalar için http://svnbook.red-bean.com/en/1.1/ch06s04.html adresini ziyaret edebilirsiniz.

Bu işlemler bittikten sonra SVN'i kullanmaya geçmeden önce tek yapmamız gereken Apache'yi restart etmek.

linux: # apache2ctl restart

5- Kurulumun Test Edilmesi

Buraya kadar yaptıklarımızla SVN-Apache kurulumunu ve entegrasyonunu tamamlamış olduk, kurduğumuz sistemi test etmeye geçebiliriz. Internet tarayımızın adres satırına http://svn_sunucu_ip/projem yazdığımızda karşımıza kullanıcı adı ve şifre soran bir ekran gelmesi ve 5. adımda belirlediğimiz kullanıcı adımızı ve şifremizi girdiğimizde projemize ait Subversion sayfasının açılması gerekmektedir. Bu bize SVN deposunun başarıyla oluşturulduğunu ve Apache'nin wwwrun veya www-data kullanıcısının bu SVN kaynak deposuna başarıyla eriştiğini gösterir. Test aşamasının son adımı olarak svn sunucusuna bir dosya eklemeyi deneyebiliriz. Bu test aşaması için eclipse (http://www.eclipse.org) ve subclipse (http://subclipse.tigris.org/) plugin'inini kullanabilirsiniz veya tercih ettiğiniz SVN desteği olan diğer bir IDE (Integrated Development Environment) veya tortoisesvn (http://tortoisesvn.tigris.org/) gibi bir yazılım kullanabilirsiniz, biz bu aşamada testi konsoldan SVN komutlarını kullanarak yapacağız.

linux: # svn --username mhazer checkout http://svn_sunucu_ip/projem

komutuyla SVN kaynak deposundaki dosyaları çalışmakta olduğumuz klasöre alalım. Daha sonra,

linux: # vi Deneme.java

komutuyla bir dosya oluşturalım ve kaydederek vi'dan çıkalım. Bu dosyayı SVN'e eklemek için,


linux: # svn add Deneme.java
linux: # svn commit Deneme.java -m "Sadece deneme yapiyoruz!"

eğer tarayıcımızın adres satırına http://svn_sunucu_ip/projem yazarsak Deneme.java dosyasını açılan sayfada görmemiz gerekmektedir. SVN komutları ve daha detaylı açıklamaları için http://svnbook.red-bean.com/en/1.1/ web sayfasını mutlaka ziyaret etmelisiniz.

6- CVS'den SVN'e geçiş (isteğe bağlı)

Eğer sizde benim gibi projelerinizde CVS kullanıyorsanız, bir an önce bu projelerinizi SVN'e taşımak isteyeceksinizdir. CVS kaynak depolarının SVN'e tarihsel veriyle birlikte taşınması için cvs2svn isimli yazılımı kullanabilirsiniz. Bu yazılımı YAST kullanarak veya Debian'da

linux: # sudo apt-get install cvs2svn

komutuyla kurabilirsiniz.

Kaynak depolarınızı CVS'den SVN'e dönüştürmeden önce karar vermeniz gereken en önemli adım CVS'den SVN'e ne kadarlık tarihsel veri taşımak istediğinizdir. Bu dökümanda biz elimizde bulunan CVS deposunu bütün tarihsel verisiyle beraber SVN deposuna dönüştüreceğiz. Diğer dönüştürme alternatifleri için CVS2SVN dökümanına bakabilirsiniz.

Yeni oluşturacağımız SVN kaynak depomuzun yerel diskimizdeki yerinin /subversion/depo/projem olacağını varsayalım. Dönüştüreceğimiz CVS kaynak deposunun bir kopyasını (cvs2svn CVS kaynak deposu üzerinde hiç bir değişiklik yapmamaktadır ama biz her ihtimale karşın kopyası üzerinde çalışağız) /subversion/gecici klasörü altına koplayalım. Kopyalama işlemi bittikten sonra SVN deposunun oluşturulması için;

linux: # cvs2svn -v -s --username=ulath --trunk=projem-devel /subversion/depo/projem /subversion/gecici

komutunu çalıştırmak yeterli olacaktır.(Eğer co command not found gibi bir hata alırsanız, ki ben aldım, sisteminizde RCS (Revision Control System) kurulu değildir. Bu sorunun iki çözümü var, birincisi yukarıdaki komuta --use-cvs parametresini vermek (çok yavaş çalışıyor), ikincisi ise sisteme RCS'yi kurmak) Yukarıdaki komut eğer hata vermeden biterse eski CVS kaynak deponuz başarıyla SVN'e dönüştürülmüş olacaktır. 3. adımdan sonraki adımlarda anlatılan Apache konfigurasyonlarını yaparak yeni SVN kaynak deponuzu kullanmaya başlayabilirsiniz.

Son söz

Eğer bütün adımları sırayla yapıp test aşamasınıda başarıyla geçmişseniz tebrikler SVN kullanmaya başlayabilirsiniz. Dökümanın en başında da belirtildiği üzere SVN'i çok çeşitli alanlarda kullanabilirsiniz, artık SVN'i kullanacağınız alan sizin ihtiyacınıza ve hayal gücünüze kalmış.

Bu kısa dökümanda SVN'nin bütün özelliklerinin detaylıca anlatılması oldukça zor, daha detaylı bilgiler için referanslar mutlaka detaylı olarak incelenmeli. Bu döküman hakkındaki her türlü düşüncelerinizi ve düzeltmeleri bana iletebilirsiniz. (murathazer (at) gmail.com)

Döküman güncellemeleri ve yeni bilgiler için http://www.projedunyasi.org web sitesini ziyaret edebilirsiniz.

Herkese iyi çalışmalar.

Referanslar:

1- Version Control with Subversion (http://svnbook.red-bean.com/en/1.1/)
2- Running Subversion on Debian Sarge and Apache 2 (http://blog.odonnell.nu/32.html)
3- A Novices Tutorial on Subversion (http://www.germane-software.com/%7Eser/R_n_R/subversion.html)
4- Apache 2.0 documentation Apache Docs