вторник, 17 января 2012 г.

Fabric в помощь при деплое django проекта

Т.к. все (по возможности) проекты я храню в Git то при деплое мне нужно делать pull на удаленном сервере. Также, если кто либо из команды добавил, например картинку или еще чего на сервере то это все нужно добавлять автоматом в коммит и push-ить  в репозиторий.
Для этого я создал такой вот fabfile.py который:

Сохраняет все локальные изменения (если есть в коммит) и пушит в репозиторий
  • Делает дамп удаленной базы и заменяет локальную (на случай добавления/изменения материалов на сайте)
  • Убивает кэш django и *.pyc файлы
  • Сохраняет и пушит удаленные изменения
  • Pullит изменения в локальный репозиторий
 
from fabric.api import *
from fabric.colors import yellow, red, green, blue

HOST = 'root@212.150.40.30:2280'
REMOTE_PATH = '/var/www/sample-python/'
REMOTE_DB_NAME = 'remote_dbname'
REMOTE_DB_USER = 'root'
REMOTE_DB_PASS = '1'

LOCAL_DB_NAME = 'dbname'
LOCAL_DB_USER = 'root'
LOCAL_DB_PASS = '1'

env.hosts = [HOST]
#env.hosts = ['localhost']

def deploy():
    local('git pull')
    #local('python manage.py synccompress --force')
    try:
        local('git commit -am "local autocommit"')
    except:
        print(red('nothing to commit'))
    local('git push')
    with cd(REMOTE_PATH):
        print(blue('dir: ' + REMOTE_PATH))
        run('mysqldump -u%s -p%s %s > db.sql' % (REMOTE_DB_USER, REMOTE_DB_PASS, REMOTE_DB_NAME))
        run('tar zcvf db.tar.gz db.sql')
        print(yellow('bd dumped'))
        get('db.tar.gz', './')
        print(yellow('bd downloaded'))
        run('rm db.tar.gz')
        run('rm db.sql')
        local('tar zxfv db.tar.gz')
        local('rm db.tar.gz')
        local('mysql -u%s -p%s %s < db.sql' % (REMOTE_DB_USER, REMOTE_DB_PASS, REMOTE_DB_NAME))
        print(red('DB imported to a local computer'))
        local('rm db.sql')
        local('git pull')
        run('./killcache')
        print(green('OK'))
    download_media()

def download_media():
    with cd(REMOTE_PATH):
        print(blue('dir: ' + REMOTE_PATH))
        run('git pull')
        run('git add .')
        #run('git checkout js/all_compressed.js')
        try:
            run('git commit -am "deploy media added"')
            run('git push')
            local('git pull')
            print(green('OK'))
        except:
            print(red('already up-to-date')) 
Вот так выглядит мой fabfile.py Записываю его в корневую папку на локальном компьютере где лежит .git, меняю данные в начале файла, выполняю fab deploy и все отлично ;)