Otomatik deployment nasıl yapabilirim sorusunu soruyorsanız, Git aracılığıyla, SSH ile sunucuya bağlanabileceğiniz bir hesabınız olduğu sürece, başka herhangi bir araç kullanmanıza gerek kalmadan kolaylıkla deployment işleminizi gerçekleştirebilirsiniz. Capistrano, Envoyer vb. araçlar burada inceleyeceğimiz kısımları otomatik hale getirerek, daha gelişmiş 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 [email protected] '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 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, eğer sadece dosyaları aktarmak için kullanmak isterseniz direkt alttaki gibi oluşturabilirsiniz.
#!/bin/sh
git --work-tree=/var/www/siteniz.com --git-dir=/var/repositories/siteniz.git checkout -f
Bir başka örnek vermem gerekirse, eğer bir PHP projeniz mevcut ise, her projeyi aktardıktan sonra composer'ı çalıştırmak isteyebilirsiniz.
#!/bin/sh
git --work-tree=/var/www/siteniz.com --git-dir=/var/repositories/siteniz.git checkout -f
cd /var/www/siteniz.com && composer update
--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
Ek 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://[email protected]/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ış.