Monthly Archives: Haziran 2014

Genel

Deployment Süreçlerinin Otomatikleştirilmesi

Gelin artık şu FTP istemcisi + rsync ikilisinden bir vazgeçelim.

Neden mi ?

Çünkü sürüm paketi hazırlamaksızın FTP ile değişen dosyaları sunucuya aktarmak, tamamen kullanıcı insiyatifinde olan bir işlem olup eksik veya yanlış dosyaların sunucuya aktarılması muhtemeldir. Üstelik sorun yaşadığınızda değişiklikleri geri almak da son derece güçtür.

Deployment konusuyla ilgili değişik uygulama alternatifleri mevcut. Bazıları biraz sonra anlatacağım araçlardan yararlanırken bazılarıysa sürüm yönetimi yazılımının hook denilen özelliğinden yararlanabiliyorlar.

Ben, bugün konuyla ilgili olarak Fabric isimli pyhon kütüphanesinden biraz sözedeceğim. Fabric, deployment süreçlerinizi otomatize etmeye yarayan bir python kütüphanesi. Fabric kütüphanesinden yararlanarak deployment prosesinizi aynı anda bir veya daha fazla makinede işletebilirsiniz.

Kurulum:

PIP paket yöneticisini kullanarak fabric kütüphanesinin kurulumunu gerçekleştirebilirsiniz.

$ pip install fabric==1.9.0

İlk Adımlar…

Siz de muhteşem bir python bilgisine sahip olmadan, fabric apisini kullanarak basitce kendi deployment scriptinizi geliştirebilirsiniz.

Örnek fabric scriptini kodlamaya başlamadan önce örnek projemizle ilgili apache konfigürasyonunu inceleyelim.

<VirtualHost *:80>
    ServerName myblog.net
    DocumentRoot /var/www/myblog.net/current
    <Directory "/var/www/myblog.net/current/">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/myblog-net-error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/myblog-net-access.log combined
</VirtualHost>

Yukarıdaki konfigürasyondan görüldüğü üzere, uygulamanın yürürlükteki sürümü “/var/www/myblog.net/current/” dizininde barındırılıyor.

Artık myblog.net uygulamasının deployment sürecinde yapılacak işlemleri belirleyebiliriz.

– /var/www/myblog.net/ altında, sürüm yönetimindeki dalın çıktısı oluşturulur. Bu işlem, çıkartılan her dal için /var/www/myblog.net/ altında dalın ismiyle yeni bir klasör oluşturur ve uygulamayı bir klasöre çıkartır.

– apache durdurulur.

– Eğer daha önce deployment yapılmışsa oluşacak olan current sembolik bağlantısı silinir.

– Sürüm yönetiminden çıkartılan dala ait dizin için current isimli yeni sembolik link oluşturulur.

– apache başlatılır.

Artık kodlamaya hazırız. Aşağıdaki python betiği yukarıda belirtilen işlemleri sırasıyla gerçekleştirecektir.
Betiği oluşturup fabfile.py olarak kayıt edelim.

# -*- coding: utf-8 -*-
import os
from fabric.api import env, cd, sudo, run
from fabric.contrib.files import exists


# islemin hangi sunucularda gerceklesecegini belirleyelim.
env.hosts = ['server1.myblog.net', 'server2.myblog.net', ]

INSTALLATION_PATH = '/var/www/myblog.net'

def deploy(branch):
    # /var/www/myblog.net/ altında, sürüm yönetimindeki dalın çıktısı 
    # oluşturulur. Bu işlem, çıkartılan her dal için /var/www/myblog.net/ 
    # altında dalın ismiyle yeni bir klasör oluşturur ve uygulamayı 
    # bir klasöre çıkartır.
    run('git archive --remote=git@github.com:mygithubaccount/myblognet.git '
         '--format=tar --prefix=%(branch)s/ %(branch)s|tar -x -C %(path)s' % {
            'branch': branch,
            'path': INSTALLATION_PATH
         })
    
    # apache durdurulur. 
    sudo('/etc/init.d/apache2 stop')

    # Eğer daha önce deployment yapılmışsa oluşacak olan 
    # current sembolik bağlantısı silinir.
    if exists(os.path.join(INSTALLATION_PATH, 'current')):
        run('rm -rf %s' % os.path.join(INSTALLATION_PATH, 'current'))

    # Sürüm yönetiminden çıkartılan dala ait dizin için current isimli 
    # yeni sembolik link oluşturulur.
    run('ln -s %s /var/www/myblog.net/current' % (
    os.path.join(INSTALLATION_PATH, branch)))

    # apache başlatılır.
    sudo('/etc/init.d/apache2 start')

Örnek deployment scriptimiz kullanıma hazır. Aşağıdaki komutu fabfile.py dosyasıyla aynı dizinde çalıştırarak branch1 isimli dalı server1 ve server2 makinelerine gönderelim.

$ fab deploy:branch1

Gerçek hayatta deployment sürecinde kullanıcıların hata sayfası görmemesi için sitenin bakım moduna alınması, uygulamanın bağlı olduğu bazı servislerin resetlenmesi gibi işlemlerinde deployment sürecine dahil olması gerektiğini unutmayalım :)

Fabric ile ilgili yapılabilecekler elbetteki bunlarla sınırlı değil. Detaylı bilgi almak için bu sayfadaki dökümanı inceleyebilirsiniz.