Skip to content

Instantly share code, notes, and snippets.

@artofhuman
Created January 28, 2013 18:18
Show Gist options
  • Save artofhuman/4657781 to your computer and use it in GitHub Desktop.
Save artofhuman/4657781 to your computer and use it in GitHub Desktop.
example fabfile.py
# -*- coding: utf-8 -*-
from fabric.api import task
from fabric.api import run
from fabric.api import local
from fabric.api import env
from fabric.api import cd
from fabric.api import prefix
from fabric.api import hide
# Расположение зависимостей для проекта
REQUIREMENTS_NAME = 'reqs.txt'
# Расположение FastCGI скрипта для запуска и его перезапуска сервера
DJANGO_WSGI_NAME = 'django-wrapper.fcgi'
# Расположение внешнего репозитория для верстки, если отсуствует в False
MARKUP_DIRECTORY = "./rikitavi/static/markup"
ENVIRONMENT = {
# Окружение тестового сервера
'staging': {
# Хосты на которых расположен проект.
'host': ['dev@u24163.netangels.ru'],
# Папка в котором располагается проект
'branch': 'master',
# Ветка по умолчанию для
'root_dir': '/home/dev/test.rikitavi.ru/rikitavi',
# Путь до virtualenv директории на серверах
'venv': 'source /home/dev/python/bin/activate',
},
# Окружение рабочего сервера
'production': {
'user': 'u24163',
# Хосты на которых расположен проект.
'host': ['u24163@u24163.netangels.ru'],
# Папка в котором располагается проект
'branch': 'master',
# Ветка по умолчанию для
'root_dir': '/home/u24163/u24163.netangels.ru/rikitavi',
# Путь до virtualenv директории на серверах
'venv': 'source /home/u24163/python/bin/activate',
},
}
def active_env(name):
"""
Подготовка окружения
"""
local_env = ENVIRONMENT.get(name, None)
if not local_env:
raise RuntimeError("Не найдено окружение")
# env.user = local_env['user']
env.hosts = local_env['host']
env.root = local_env['root_dir']
env.branch = local_env['branch']
env.activate = local_env['venv']
@task
def staging():
"""
Подготовка окружения тестового сервера
"""
active_env('staging')
@task
def production():
"""
Подготовка окружения рабочего сервера
"""
active_env('production')
@task
def update(branch=None):
"""
Обновление исходного кода из ветки
Аргументы:
- :branch: Ветка из которой берутся изменения, по умолчанию текущий для окружения
"""
if branch is None:
branch = env.branch
# Отправляем локальные изменения в приложении на сервер
local("git push origin " + branch)
# Отправляем локальные изменения в верстке на сервер
if MARKUP_DIRECTORY:
with cd(MARKUP_DIRECTORY):
local("git push origin master")
with cd(env.root):
# Обновляем бранчи если надо
if branch != env.branch:
run('git fetch --all')
run('git checkout ' + branch)
# Перемещаем изменения из репозитория в локальную папку
run('git pull origin ' + branch)
# Обновляем исходный код для статических файлов
run('git submodule update --init')
if MARKUP_DIRECTORY:
with cd(MARKUP_DIRECTORY):
run('git pull origin master')
@task
def install(branch=None):
"""
Установка зависимостей
Аргументы:
- :branch: Ветка из которой берутся изменения, по умолчанию текущий для окружения
"""
with cd(env.root):
# Обновляем зависимости для проекта
with prefix(env.activate):
run('pip install -r ' + REQUIREMENTS_NAME)
@task
def migrate():
"""
Миграция изменений схемы в БД
"""
with cd(env.root):
with prefix(env.activate):
# Обновления БД в соответствии с джанго
run('python manage.py syncdb')
# Мигрируем изменения в БД
run('python manage.py migrate')
@task
def collect():
"""
Сборка и обновление статических файлов проекта
"""
# Собираем статические файлы
with cd(env.root):
with prefix(env.activate):
run('python manage.py collectstatic --noinput')
@task
def restart():
"""
Перезапуск приложения
"""
with cd(env.root):
with prefix(env.activate):
# Перезапуск приложения Django
run('killall ' + DJANGO_WSGI_NAME)
@task
def flush_cache():
"""
Сбросить кэш Reddis'а
"""
run("echo 'FLUSHALL' | redis-cli")
@task
def deploy(branch=None, flush=False):
"""
Выполнить полное развертывание приложения на сервере
Аргументы:
- :branch: Ветка из которой берутся изменения, по умолчанию текущий для окружения
- :flush: Сбросить кэш Reddis'а
"""
update(branch)
install()
migrate()
collect()
restart()
if flush:
flush_cache()
@task
def import_xml():
"""
Import Goods.xml
"""
with cd(env.root):
with prefix(env.activate):
run('python manage.py import_xml Goods.xml')
@task(default=True)
def help():
"""
Выводит эту справку
"""
print """
Основные команды:
fab --list список всех команд
fab -d <команда> информация о команде
fab staging <команда> выполнение команды на тестовом сервере
fab production <команда> выполнение команды на рабочем сервере
Обновить полностью тестовый сервер без сброса кэша:
fab staging deploy:production
Обновить полностью тестовый сервер со сбросом кэша:
fab staging deploy:production,flush:1
"""
with hide('status', 'aborts', 'warnings', 'running', 'stderr', 'user'):
local("fab --list")
import fabric.state
fabric.state.output.status = False
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment