Skip to content

Instantly share code, notes, and snippets.

@rafaelnovello
Created September 25, 2012 20:15
Show Gist options
  • Save rafaelnovello/3784168 to your computer and use it in GitHub Desktop.
Save rafaelnovello/3784168 to your computer and use it in GitHub Desktop.
Template de fabfile a ser usado/desenvolvido para automação de deploys.
# -*- coding: utf-8 -*-
import os
from fabric.api import local, env, abort, cd, sudo
env.hosts = ['IP OU DOMINIO PARA O SERVIDOR']
env.user = 'ubuntu' # UBUNTU É O USUÁRIO PADRÃO DOS NOSSOS SERVIDORES.
HOME = os.environ.get("HOME")
env.key_filename = os.path.join(HOME, 'CAMINHO PARA A CHAVE PEM')
ROOT_FOLDER = os.path.abspath(os.path.dirname(__file__))
REMOTE_USER = 'NOME DO USUÁRIO DA APLICAÇÃO'
REMOTE_HOME = 'HOME DO USUÁRIO DA APLICAÇÃO'
REMOTE_APP_DIR = 'PATH PARA APLICAÇÃO APÓS DEFINIÇÃO DO AMBIENTE'
GIT_CLONE = 'COMANDO DE CLONE DO GIT'
django_wsgi_template = """import os
import sys
path = '/home/cubocc/{0}/web_app'
if path not in sys.path:
sys.path.append(path)
sys.path.append(path + '/cubocc')
sys.path.append(path + '/cubocc/cubecc/')
sys.path.append(path + '/cubocc/cubecc/cubecc')
sys.path.append(path + '/cubocc/cubecc/cubecc/settings')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cubecc.settings')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
"""
def _django_command(cmd, environment='tests'):
cmd_template = "python manage.py {0} --pythonpath='%s%s/%s'" % (REMOTE_HOME, environment, REMOTE_APP_DIR)
return cmd_template.format(cmd, environment)
def collectstatic(environment='tests'):
project_dir = os.path.join(REMOTE_HOME, os.path.join(environment, REMOTE_APP_DIR))
with cd(project_dir):
sudo(_django_command('collectstatic', environment), user=REMOTE_USER)
def syncdb(environment='tests'):
project_dir = os.path.join(REMOTE_HOME, os.path.join(environment, REMOTE_APP_DIR))
with cd(project_dir):
sudo(_django_command('syncdb', environment), user=REMOTE_USER)
def migrate(environment='tests'):
project_dir = os.path.join(REMOTE_HOME, os.path.join(environment, REMOTE_APP_DIR))
with cd(project_dir):
sudo(_django_command('migrate', environment), user=REMOTE_USER)
def run_tests():
with cd(ROOT_FOLDER):
local("python manage.py test")
def install_requirements(environment='tests'):
project_dir = os.path.join(REMOTE_HOME, os.path.join(environment, REMOTE_APP_DIR))
with cd(project_dir):
sudo("pip install -r requirements.txt")
def create_tag(version=None, comment=None):
if version is None:
abort("Obrigatorio um nome para a versao")
if comment is None:
comment = 'Creating tag %s' % version
local("git checkout master")
local("git merge development")
local("git push")
local("git tag -a {0} -m '{1}'".format(version, comment))
local("git push --tags")
def create_wsgi(environment='tests'):
project_dir = os.path.join(REMOTE_HOME, os.path.join(environment, REMOTE_APP_DIR))
with cd(project_dir):
django_wsgi = django_wsgi_template.format(environment)
sudo('echo "%s" > django.wsgi' % django_wsgi)
def deploy(version=None, environment='tests'):
if environment not in ['tests', 'staging', 'production']:
abort("Ambiente escolhido invalido.")
project_dir = os.path.join(REMOTE_HOME, os.path.join(environment, REMOTE_APP_DIR))
try:
with cd(project_dir):
sudo("git checkout master", user=REMOTE_USER)
sudo("git pull --all", user=REMOTE_USER)
sudo("git checkout %s" % version, user=REMOTE_USER)
create_wsgi(environment)
except:
project_dir = os.path.join(REMOTE_HOME, os.path.join(environment, "web_app/"))
with cd(project_dir):
sudo(GIT_CLONE, user=REMOTE_USER)
install_requirements(environment)
syncdb(environment)
migrate(environment)
collectstatic(environment)
create_wsgi(environment)
sudo("service apache2 reload")
def full_deploy(version=None, environment='tests'):
run_tests()
create_tag(version)
deploy(version, environment)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment