subversion etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
subversion etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

11 Şubat 2013 Pazartesi

Apache üzerinden SVN erişimi ve yetkilendirmesi

Bu yazıda  RedHat / Centos 6.x Apache üzerinden mod_authz_svn ve mod_dav modüllerini kullanarak svn proje yönetimini anlatacağım.


 # yum install mod_dav_svn subversion httpd

mod_dav_svn paketi ile aşağıdaki dosyalar gelmektedir.

# rpm -ql mod_dav_svn
/etc/httpd/conf.d/subversion.conf
/usr/lib64/httpd/modules/mod_authz_svn.so
/usr/lib64/httpd/modules/mod_dav_svn.so

Öncelikle ana svn dizini olarak bir yer seçilmelidir. Burada tercih tamamen size kalmıştır. Burada örnek olarak /var/svn dizini kullanılacaktır.


Apache ayarlarına geçmeden önce bu dizini oluşturup surgate isimli örnek bir proje açalım.

# mkdir -p /var/svn
# svnadmin create /var/svn/surgate
# chown -R apache.apache  /var/svn
# ls -al /var/svn/surgate/
total 32
drwxr-xr-x 6 apache apache 4096 Feb 12 00:37 .
drwxr-xr-x 3 apache apache 4096 Feb 12 00:37 ..
drwxr-xr-x 2 apache apache 4096 Feb 12 00:37 conf
drwxr-sr-x 6 apache apache 4096 Feb 12 00:37 db
-r--r--r-- 1 apache apache    2 Feb 12 00:37 format
drwxr-xr-x 2 apache apache 4096 Feb 12 00:37 hooks
drwxr-xr-x 2 apache apache 4096 Feb 12 00:37 locks
-rw-r--r-- 1 apache apache  229 Feb 12 00:37 README.txt

İkinci bir proje daha açalım.

# svnadmin create /var/svn/surgategui
 # chown -R apache.apache  /var/svn/surgategui

Sonrasında /etc/httpd/conf.d/subversion.conf dosyası düzenlenir. Dosyada sadece aşağıdaki iki satır aktif durumdadır.

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

Bu satırların altına oluşturulacak her bir proje için aşağıdaki gibi kayıtlar eklenmelidir. Şimdilik sadece tsetproject isimli projemiz olduğu için aşağıdaki gibi kayıt girilir.


Location /svn/surgate>
        DAV svn
        SVNPath /var/svn/surgate
        AuthType Basic
        AuthName "surgatelabs svn surgate project realm"
        AuthUserFile /var/svn/svnpasswd
        Require valid-user
        AuthzSVNAccessFile /var/svn/svnauth.conf
</Location>



Location /svn/surgategui>
        DAV svn
        SVNPath /var/svn/surgategui
        AuthType Basic
        AuthName "surgatelabs svn surgategui project realm"
        AuthUserFile /var/svn/svnpasswd
        Require valid-user
        AuthzSVNAccessFile /var/svn/svnauth.conf
</Location>



Bu ayarları kaydedip apache servisini yeniden başlattığınızda web sunucu tarafında işlemler tamamlanmış oluyor.

# /etc/init.d/httpd restart

Sonrasında web tarayıcınızda http://sunucuIP/svn/surgate yazdığında karşınıza aşağıdaki gibi
parola soran bir ekran gelecektir.



















Bundan sonraki süreçte projeye erişecek kulanıcıları tanımlama ve kullanıcılara yetkileri verme işlemi yapılacak.


subversion.conf dosyasında tanımlanan   AuthUserFile /var/svn/svnpasswd parametre ile kullanıcı adı ve parolanın /var/svn/svnpasswd dizininde tutulacağı kabul ediliyor. Bu dosyanın yolunu siz istediğiniz şekilde değiştirebilirsiniz. apache ile birlkte gelen htpasswd komutu ile dosyayı oluşturup ilk kullanıcıyı tanımlayabiliriz

# htpasswd -c -m  /var/svn/svnpasswd ismail
New password:
Re-type new password:
Adding password for user ismail


Buradaki -c ile dosyayı oluşturulur, -m ile de md5 parola kullanılacağı belirtilir. Dosyanın içeriği aşağıdaki gibidir.

 # cat  /var/svn/svnpasswd
ismail:$apr1$b7j98L3C$nTsiexkt.WGEaB2.PqeOv0



Bundan sonra yeni kullanıcı eklenecekse -c parametresi kullanılmamalıdır.
# htpasswd  -m  /var/svn/svnpasswd yusuf
# cat  /var/svn/svnpasswd
ismail:$apr1$b7j98L3C$nTsiexkt.WGEaB2.PqeOv0
yusuf:$apr1$H3Opz/q9$wr8JrJNBGDVRKYvLAdoWJ0


Son olarak  AuthzSVNAccessFile /var/svn/svnauth.conf parametresi ile belirtilen SVN yetkilendirme dosyası tanımlanmalıdır.

# vi /var/svn/svnauth.conf 

[groups]
yoneticiler =  ismail,murat
testgrubu = salih,selcuk
arayuzekibi = erman,emin
[/]
@yoneticiler = rw

@testgrubu = r

[surgate:/]
hasan = rw
mustfa = r


[surgategui:/]
@arayuzekibi = rwilhami = r

Yukaridaki tanımlara göre iki kullanıcı grubu oluşturduk. yöneticiler ve testgrubu.
Bu iki gruptan yönetici grubu tüm projelere rw(okuma,yazma) hakları ile erişiyorken, testgrubu sadece okuma olarak erişmektedir. Bu iki grupta alttaki surgate ve surgategui projelerine erişim hakkı vardır. Ek bir tanım yapmaya gerek yok bunlar için.

surgate projesine hasan okuma yazma hakkı ile erişiyorken, mustafa sadece okuma hakkına sahip.

surgategui projesinde ise arayuzgrubundaki kullanıcılar(erman,emin) okuma yazmak hakkı ile erişiyorken, ilhami sadece okuma erişimine sahiptir.

Bu kayıtları girdikten sonra artık svn projemize apache üzerinden erişebiliriz.

Not: /var/svn/svnpasswd ve /var/svn/svnauth.conf  dosyalarında kayıt güncellemeleri yapıldıktan sonra apache servisinin yeniden başlatılmasına gerek yoktur. svnauth.conf dosyasındaki bir yazım hatasından dolayı tüm kullanıcılar giriş yapamayabilir. Bu durumda apache hata logları incelenmelidir.





Sunucu tarafında bir işimiz kalmadı. Şimdi istemci tarafında yetkili bir svn kullanıcısı ile gerekli alt svn dizinlerini oluşturalım. Bunlar trunk,branches ve tag dizini oalcak.



#  svn mkdir --message "Initial trunk"     --username=ismail    http://192.168.1.100/svn/surgate/trunk
Authentication realm: <http://172.16.45.90:80> surgatelabs svn surgate project realm
Password for 'ismail':

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <http://192.168.1.100:80> surgatelabs svn surgate project realm

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes

Committed revision 1.

Burada parolanızı şifresiz olarak saklamak isteyip istemediğinz soruluyor. Tercih size kalmış. Hayır derseniz her svn işleminde parola girmeniz gerekir. Burada uğraşmamak için yes cevabı veriyoruz.

Aynı şekilde diğer dizinlerde oluşturulur.
#  svn mkdir --message "Initial branches"     --username=ismail    http://192.168.1.100/svn/surgate/branches
#  svn mkdir --message "Initial tags"     --username=ismail    http://192.168.1.100/svn/surgate/tags

  

Son olarak proje artık checkout yapılıp kullanılabilir.

# svn co  --username=ismail http://192.168.1.100/svn/surgate/trunk surgate-trunk
Checked out revision 3.
# cd surgate-trunk/
# touch test.txt
# svn add test.txt
A         test.txt
# svn ci -m "ilk commit"
Adding         test.txt
Transmitting file data .
Committed revision 4.

 

















27 Ocak 2013 Pazar

SVN trunk,branch,tag hakkında

Sürüm kontrol yazılımı kullanılan yazılım projelerinde çokca trunk,branch ve tag ifadelerini duyarsınız. Burada kısaca aralarındaki farklarından bahsedeceğim.

trunk:

Ana geliştirme alanıdır. Bu alan bir sonraki sürümde yapılacak geliştirmeleri içerir.Buradaki kod alfa seviyesinde bile olmayabilir. Bu yüzden trunk'daki kodlara unstable/karr

branch:

Türkçe olarak çatallama/dallanma/ayrılma anlamlarına gelir.trunk'da geliştirilen kod belli bir seviyeye geldiğinde bir sürüm olarak belirlenir. Sürüm olgunluğuna gelmiş kodun ana geliştirme alanından ayrılması işlemine branch adı verilir. Branch svn deposunda trunk'ın belli bir anına kadarki geliştirmeyi içeren kopyası denilebilir. Genelde branch alma, bir sürüm numarası verilerek yapılır.Örneğin  SurGATE 4.0 sürümü geliştirmesi trunk'da bitti ise aşağıdaki gibi bir komut ile trunk'daki kod SURGATE_4_0_RELEASE olarak ana koldan ayrılmış olur.

$ svn copy https://192.168.0.100/svn/surgate/trunk https://192.168.0.100/svn/surgate/branches/SURGATE_4_0_RELEASE -m "SurGATE 4.0 RELEASE branch" 

Yazılımcılar hiç beklemeden trunk'da yeni özellik geliştirmeye devam ederler.
Bu sayede eğer 4.0 sürümünde bir hata çıkarsa  kolayca  SURGATE_4_0_RELEASE branch'da düzeltilebilir. Branch olmasa idi dosyaların trunk'da 4.0 sürümün çıktığı tarihteki revision numarasına dönmek gerekecekti. Çok fazla dosyanın değiştiği bir projede böyle bir süreci yönetmek imkansız olacaktır.

SURGATE_4_0_RELEASE branch'de düzeltilmiş bir kodu da trunk'a aktarabilirsiniz. Buna merge adı veriliyor. Detaylarına başka bir yazıda değineceğim.

tags

Branch ile benzer özelliklere sahip diyebiliriz. Projenin branch kısmında gerektiğinde bugfix yapılabiliyorken, tag projenin o andaki halinin imajının(snapshot) alınması diyebiliriz. Oluşturulan tag'da hiç bir değişiklik yapılamaz. Tag oluşturmanın amacı projenin belirli bir tarihteki kodlarına erişmektir. Tag = salt okunur, etiketleme

SVN tarafında tag alma ile branch alma aynı şekilde svn copy komutu ile yapılır.

Örnek bir tag alma komutu:


$ svn copy https://192.168.0.100/svn/surgate/trunk https://192.168.0.100/svn/surgate/tags/SURGATE_4_0_RELEASE_TAG -m "SurGATE 4.0 RELEASE Tag" 

Özetle branch'de geliştirme devam edebilir. Fakat tag'da böyle birşey söz konusu değildir.

Ama bir dakika! Hem tag hem de branch alırken svn copy komutunu kullandım. Bu durumda svn hangisinin tag, hangisinin branch olduğunu nasıl ayırt edecek?

Aslında ayırt etmeyecek. Size "yalan" söyledim. svn için branch ve tag aynı şeydir.

http://svnbook.red-bean.com/en/1.7/svn.branchmerge.tags.html adresinden alıntı:

"But wait a moment: isn't this tag creation procedure the same procedure we used to create a branch? Yes, in fact, it is. In Subversion, there's no difference between a tag and a branch. Both are just ordinary directories that are created by copying. Just as with branches, the only reason a copied directory is a “tag” is because humans have decided to treat it that way: as long as nobody ever commits to the directory, it forever remains a snapshot. If people start committing to it, it becomes a branch."

Yani svn derki. tag ve branch insanların kafasındaki bir olgudur. Benim için farketmez. Eğer birisi gider tag'ı checkout edip orada geliştirme yapmaya kalkarsa yapabilir. Ama bu artık tag olmaktan çıkar, branch olur ;)

Peki ne diye tags ve branch tanımları var diyeceksiniz? Var çünkü CVS denilen eski sürüm kontrol sisteminde bu iki farklı anlama geliyordu. SVN(Subversion) da ise durum yukarıdaki gibi değişti.