Git ile Otomatik ve Basit Deployment

SSH ile sunucuya bağlanabileceğiniz bir hesabınız olduğu sürece, Git ile, herhangi bir araç kullanmanıza gerek kalmadan, kolaylıkla deployment işleminizi gerçekleştirebilirsiniz. Diğer araçlar daha çok, burada inceleyeceğimiz kısımları otomatik hale getirerek, çeşitli kolaylıklar sağlasa da, herhangi birini kullanmadan da, temel Git ve sunucu yönetimi bilgisiyle deployment işlemini otomatize edebilirsiniz.

Not: Bu yazıda, deployer hesabınızın hazır olduğunu, ayrıca SSH ile, public key doğrulamasıyla sunucuya bağlanabildiğinizi varsayıyorum. Eğer nasıl yapılacağını bilmiyorsanız, Linux Sunucularda Temel Güvenlik Önlemleri yazımı okumanızı öneririm. Ancak, kendi bilgisayarınızda SSH keylerinizi daha önceden oluşturmuş ve sunucuda şifre gereksinimini nasıl ortadan kaldıracağınızı unuttuysanız, çok kısaca, alttaki komut ile, kendi bilgisayarınızdaki public key'i, sunucuya tanıtabilirsiniz.
$ ssh user@hostname 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
Eğer üstteki komut sonucunda, hala sunucu sizden şifre istiyorsa, sunucuda, gerekli izinleri düzenlemeniz gerekebilir,
$ chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
Devamında, siteniz.com adinda bir domaininiz olduğunu, ve de bu domaini /var/www/siteniz.com lokasyonunda barındırdığınızı, git repository'sini de /var/repositories/siteniz.git lokasyonunda barındıracağımızı varsayalım.
$ sudo apt-get install git
$ mkdir -p /var/repositories/siteniz.git && cd /var/repositories/siteniz.git
$ mkdir -p /var/www/siteniz.com
$ sudo chmod -R ug+w /var/repositories/
$ git init --bare
--bare ile belirtilen kısım, git repository'sinde, versiyon kontrolü dışında herhangi bir amacın olmadığını, dosyaların buradan servis edilmeyeceğini belirtiyor.

Sonrasında, sunucuda oluşturduğumuz git repository'si içerisinde hooks adında bir klasör olduğunu göreceksiniz. Git dökümantasyonunu incelerseniz, sunucu push komutunu alır almaz işleme giren pre-receive, sunucu push komutunu işledikten sonra devreye giren post-receive ve pre-receive ile tek farkı her bir branch için aynı işlemi yapmak olan update adlı üç sunucu hook'unun geçerli olacağını göreceksiniz. Biz de, push işlendikten sonra, değişiklikleri iletmesi için post-receive hook'unu kullanacağız.
$ cd hooks # veya /var/repositories/siteniz.git/hooks
$ nano post-receive
Bu dosyanın içeriğini direkt alttaki gibi oluşturabilirsiniz.
#!/bin/sh
git --work-tree=/var/www/siteniz.com --git-dir=/var/repositories/siteniz.git checkout -f
--work-tree ile belirtilen, dosyaların nereye transfer edildiği ve servis edildiği iken, --git-dir de isminden anlaşılabileceği gibi, git repository'sinin olduğu klasörü belirtmekte. Son olarak da hook'un çalıştırılabilir olmasını sağladığınızda, herhangi bir problem ile karşılaşma ihtimaliniz kalmaz.
$ chmod +x post-receive
Son olarak ufak bir not, deployer kullanıcınızın sunucuya aktarım yapabilmesi için gerekli izinlere sahip olduğuna emin olmayı unutmayın, örneğin aşağıdaki örnekte, deployer kullanıcısı www-data grubunun bir parçası ve /var/repositories ile /var/www klasörleri, root kullanıcısına ait, www-data grubu tarafından yönetilebilir halde.
$ sudo usermod -a -G www-data deployer
$ sudo chown -R deployer:www-data /var/repositories/
$ sudo chown -R deployer:www-data /var/www/
Sunucu tarafındaki bu işlemleri tamamlandıktan sonra, kendi bilgisayarınızda, projenizin olduğu klasörde yapmanız gerekenler ise,
$ git init
$ git remote add live ssh://user@siteniz.com/var/repositories/siteniz.git
Herhangi bir değişiklik yaptıktan sonra da, sunucuya dosyalarınızı yüklemek için de,
$ git commit -am 'yaptiginiz degisikligi aciklayan mesaj'
$ git push live master
Kısacası, git ve SSH ile sunucunuzu yönetmek kolay olduğu gibi, yukarıdaki işlemleri, beta, staging vb. farklı adlarla da yapabilirsiniz,her şey size kalmış.