195 строки
5.5 KiB
Python
195 строки
5.5 KiB
Python
import os
|
|
from os.path import join as pjoin
|
|
|
|
from fabric.api import (env, execute, lcd, local, parallel,
|
|
run, roles, task)
|
|
|
|
from fabdeploytools import helpers
|
|
import fabdeploytools.envs
|
|
|
|
import deploysettings as settings
|
|
|
|
|
|
env.key_filename = settings.SSH_KEY
|
|
fabdeploytools.envs.loadenv(settings.CLUSTER)
|
|
|
|
ROOT, ZAMBONI = helpers.get_app_dirs(__file__)
|
|
|
|
VIRTUALENV = pjoin(ROOT, 'venv')
|
|
PYTHON = pjoin(VIRTUALENV, 'bin', 'python')
|
|
|
|
|
|
def managecmd(cmd):
|
|
with lcd(ZAMBONI):
|
|
local('%s manage.py %s' % (PYTHON, cmd))
|
|
|
|
|
|
@task
|
|
def create_virtualenv(update_on_change=False):
|
|
helpers.create_venv(VIRTUALENV, settings.PYREPO,
|
|
pjoin(ZAMBONI, 'requirements/prod.txt'),
|
|
update_on_change=update_on_change)
|
|
|
|
if settings.LOAD_TESTING:
|
|
helpers.pip_install_reqs(pjoin(ZAMBONI, 'requirements/load.txt'))
|
|
|
|
|
|
@task
|
|
def update_locales():
|
|
with lcd(pjoin(ZAMBONI, 'locale')):
|
|
local("./compile-mo.sh .")
|
|
|
|
|
|
@task
|
|
def loadtest(repo=''):
|
|
if hasattr(settings, 'MARTEAU'):
|
|
os.environ['MACAUTH_USER'] = settings.MARTEAU_USER
|
|
os.environ['MACAUTH_SECRET'] = settings.MARTEAU_SECRET
|
|
local('%s %s --server %s' % (settings.MARTEAU, repo,
|
|
settings.MARTEAU_SERVER))
|
|
|
|
|
|
@task
|
|
def update_products():
|
|
managecmd('update_product_details')
|
|
|
|
|
|
@task
|
|
def compress_assets(arg=''):
|
|
managecmd('compress_assets -t %s' % arg)
|
|
|
|
|
|
@task
|
|
def schematic():
|
|
with lcd(ZAMBONI):
|
|
local("%s %s/bin/schematic migrations" %
|
|
(PYTHON, VIRTUALENV))
|
|
|
|
|
|
@task
|
|
def update_info(ref='origin/master'):
|
|
helpers.git_info(ZAMBONI)
|
|
with lcd(ZAMBONI):
|
|
local("/bin/bash -c "
|
|
"'source /etc/bash_completion.d/git && __git_ps1'")
|
|
local('git show -s {0} --pretty="format:%h" '
|
|
'> media/git-rev.txt'.format(ref))
|
|
|
|
|
|
@task
|
|
def disable_cron():
|
|
local("rm -f /etc/cron.d/%s" % settings.CRON_NAME)
|
|
|
|
|
|
@task
|
|
def install_cron(installed_dir):
|
|
installed_zamboni_dir = os.path.join(installed_dir, 'zamboni')
|
|
installed_python = os.path.join(installed_dir, 'venv', 'bin', 'python')
|
|
with lcd(ZAMBONI):
|
|
local('%s ./scripts/crontab/gen-cron.py '
|
|
'-z %s -u %s -p %s > /etc/cron.d/.%s' %
|
|
(PYTHON, installed_zamboni_dir,
|
|
getattr(settings, 'CRON_USER', 'apache'),
|
|
installed_python, settings.CRON_NAME))
|
|
|
|
local('mv /etc/cron.d/.%s /etc/cron.d/%s' % (settings.CRON_NAME,
|
|
settings.CRON_NAME))
|
|
|
|
|
|
@task
|
|
@roles('web')
|
|
@parallel
|
|
def restart_workers():
|
|
for gservice in settings.GUNICORN:
|
|
run("/sbin/service %s graceful" % gservice)
|
|
restarts = []
|
|
for g in settings.MULTI_GUNICORN:
|
|
restarts.append('( supervisorctl restart {0}-a; '
|
|
'supervisorctl restart {0}-b )&'.format(g))
|
|
|
|
if restarts:
|
|
run('%s wait' % ' '.join(restarts))
|
|
|
|
|
|
@task
|
|
@roles('celery')
|
|
@parallel
|
|
def update_celery():
|
|
restarts = []
|
|
if getattr(settings, 'CELERY_SERVICE_PREFIX', False):
|
|
restarts.extend(['supervisorctl restart {0}{1} &'.format(
|
|
settings.CELERY_SERVICE_PREFIX, x)
|
|
for x in ('', '-devhub', '-priority')])
|
|
if getattr(settings, 'CELERY_SERVICE_MKT_PREFIX', False):
|
|
restarts.extend(['supervisorctl restart {0}{1} &'.format(
|
|
settings.CELERY_SERVICE_MKT_PREFIX, x)
|
|
for x in ('', '-devhub', '-priority')])
|
|
|
|
if restarts:
|
|
run('%s wait' % ' '.join(restarts))
|
|
|
|
|
|
@task
|
|
def deploy():
|
|
rpmbuild = helpers.deploy(name='zamboni',
|
|
env=settings.ENV,
|
|
cluster=settings.CLUSTER,
|
|
domain=settings.DOMAIN,
|
|
root=ROOT,
|
|
deploy_roles=['web', 'celery'],
|
|
package_dirs=['zamboni', 'venv'])
|
|
|
|
execute(restart_workers)
|
|
helpers.restart_uwsgi(getattr(settings, 'UWSGI', []))
|
|
execute(update_celery)
|
|
execute(install_cron, rpmbuild.install_to)
|
|
managecmd('cron cleanup_validation_results')
|
|
|
|
|
|
@task
|
|
def deploy_web():
|
|
rpmbuild = helpers.deploy(name='zamboni',
|
|
env=settings.ENV,
|
|
cluster=settings.CLUSTER,
|
|
domain=settings.DOMAIN,
|
|
root=ROOT,
|
|
use_yum=False,
|
|
package_dirs=['zamboni', 'venv'])
|
|
|
|
execute(restart_workers)
|
|
helpers.restart_uwsgi(getattr(settings, 'UWSGI', []))
|
|
|
|
|
|
@task
|
|
def pre_update(ref=settings.UPDATE_REF):
|
|
local('date')
|
|
execute(disable_cron)
|
|
execute(helpers.git_update, ZAMBONI, ref)
|
|
execute(update_info, ref)
|
|
|
|
|
|
@task
|
|
def update():
|
|
execute(create_virtualenv, getattr(settings, 'DEV', False))
|
|
execute(update_locales)
|
|
execute(update_products)
|
|
execute(compress_assets)
|
|
execute(compress_assets, arg='--settings=settings_local_mkt')
|
|
execute(schematic)
|
|
managecmd('dump_apps')
|
|
managecmd('statsd_ping --key=update')
|
|
|
|
|
|
@task
|
|
def pre_update_latest_tag():
|
|
current_tag_file = os.path.join(ZAMBONI, '.tag')
|
|
latest_tag = helpers.git_latest_tag(ZAMBONI)
|
|
with open(current_tag_file, 'r+') as f:
|
|
if f.read() == latest_tag:
|
|
print 'Environemnt is at %s' % latest_tag
|
|
else:
|
|
pre_update(latest_tag)
|
|
f.seek(0)
|
|
f.write(latest_tag)
|
|
f.truncate()
|