X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/24c1d259ba4af084959d70c6a1f355d0a57f1191..00a90d6175599e055f5a84697c8388d81ac1b007:/fabfile.py?ds=sidebyside diff --git a/fabfile.py b/fabfile.py index 587821b5..399f1c2f 100644 --- a/fabfile.py +++ b/fabfile.py @@ -3,7 +3,7 @@ from fabric.api import * from fabric.contrib import files import os - +import time # ========== # = Config = @@ -11,6 +11,7 @@ import os # Globals env.project_name = 'platforma' env.use_south = True +env.giturl = "git://github.com/fnp/redakcja.git" # Servers @@ -22,16 +23,26 @@ def staging(): env.python = '/usr/bin/python' env.virtualenv = '/usr/bin/virtualenv' env.pip = '/usr/bin/pip' + env.gitbranch = "staging" + common() def production(): """Use production server""" env.hosts = ['szo.nowoczesnapolska.org.pl:2225'] env.user = 'librarian' - env.path = '/opt/lektury/platforma' - env.python = '/srv/library-in-a-box/sandbox/env/redakcja/bin/python' - env.virtualenv = '/opt/lektury/basevirtualenv/bin/virtualenv' - env.pip = '/opt/lektury/basevirtualenv/bin/pip' + env.gitbranch = 'master' + env.sandbox = '/srv/library-in-a-box/sandbox/' + env.virtualenv = os.path.join(env.sandbox, 'bin', 'virtualenv') + + env.pip = os.path.join(env.sandbox, 'python', 'bin', 'pip') + env.python = os.path.join(env.sandbox, 'python', 'bin', 'python') + common() + + +def common(): + env.path = os.path.join(env.sandbox, env.project_name) + env.target = os.path.join(env.path, 'bin', 'python') # ========= @@ -48,11 +59,28 @@ def setup(): Setup a fresh virtualenv as well as a few useful directories, then run a full deployment. virtualenv and pip should be already installed. """ - require('hosts', 'path', provided_by=[staging, production]) + require('hosts', 'sandbox', provided_by=[staging, production]) + + run("mkdir -p %(path)s; mkdir -p %(path)s/www/wsgi; mkdir -p %(path)s/www/media" % env) + + # make a git mirror + run("""cd %(path)s; +git clone %(giturl)s mirror; +cd %(path)s/mirror; +git pull""" % env, pty=True) + + run('%(virtualenv)s %(path)s' % env, pty=True) + run('cd %(path)s; rm -rf releases shared packages; mkdir -p releases; mkdir -p shared; mkdir -p packages;' % env, pty=True) + + # symlink static content + run("""cd %(path)s/www/media; +ln -sf %(path)s/releases/current/%(project_name)s/static static +ln -sf %(path)s/lib/python2.6/site-packages/django/contrib/admin/media admin-media +mkdir -p dynamic +""" % env) - run('mkdir -p %(path)s; cd %(path)s; %(virtualenv)s --no-site-packages .;' % env, pty=True) - run('cd %(path)s; mkdir releases; mkdir shared; mkdir packages;' % env, pty=True) run('cd %(path)s/releases; ln -s . current; ln -s . previous' % env, pty=True) + deploy() @@ -62,16 +90,16 @@ def deploy(): install any required third party modules, install the virtual host and then restart the webserver """ - require('hosts', 'path', provided_by=[staging, production]) + require('hosts', 'sandbox', 'gitbranch', provided_by=[staging, production]) - import time env.release = time.strftime('%Y-%m-%dT%H%M') - upload_tar_from_git() + prepare_package_from_git() + upload_wsgi_script() - upload_vhost_sample() +# upload_vhost_sample() install_requirements() - copy_localsettings() + hardlink_localsettings() symlink_current_release() migrate() django_compress() @@ -85,6 +113,7 @@ def deploy_version(version): with cd(env.path): run('rm releases/previous; mv releases/current releases/previous;', pty=True) run('ln -s %(version)s releases/current' % env, pty=True) + restart_webserver() @@ -105,46 +134,53 @@ def rollback(): # ===================================================================== # = Helpers. These are called by other functions rather than directly = # ===================================================================== -def upload_tar_from_git(): +def prepare_package_from_git(): "Create an archive from the current Git master branch and upload it" print '>>> upload tar from git' + require('release', provided_by=[deploy]) - local('git archive --format=tar master | gzip > %(release)s.tar.gz' % env) + run('mkdir -p %(path)s/releases/%(release)s' % env, pty=True) run('mkdir -p %(path)s/packages' % env, pty=True) - put('%(release)s.tar.gz' % env, '%(path)s/packages/' % env) + run('cd %(path)s/mirror; git pull; git archive --format=tar %(gitbranch)s | gzip > %(path)s/packages/%(release)s.tar.gz' % env) run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True) - local('rm %(release)s.tar.gz' % env) -def upload_vhost_sample(): - "Create and upload Apache virtual host configuration sample" - print ">>> upload vhost sample" - files.upload_template('%(project_name)s.vhost.template' % env, '%(path)s/%(project_name)s.vhost.sample' % env, context=env) +#def upload_vhost_sample(): +# "Create and upload Apache virtual host configuration sample" +# print ">>> upload vhost sample" +# files.upload_template('%(project_name)s.vhost.template' % env, '%(path)s/%(project_name)s.vhost.sample' % env, context=env) def upload_wsgi_script(): "Create and upload a wsgi script sample" print ">>> upload wsgi script sample" - files.upload_template('%(project_name)s.wsgi.template' % env, '%(path)s/%(project_name)s.wsgi' % env, context=env) - run('chmod ug+x %(path)s/%(project_name)s.wsgi' % env) + files.upload_template('%(project_name)s/config/%(project_name)s.wsgi.template' % env, '%(path)s/www/wsgi/%(project_name)s.wsgi' % env, context=env) + run('chmod ug+x %(path)s/www/wsgi/%(project_name)s.wsgi' % env) def install_requirements(): "Install the required packages from the requirements file using pip" - print '>>> install requirements' + + print '>>> Instaling global requirements' require('release', provided_by=[deploy]) - run('cd %(path)s; %(pip)s install -E . -r %(path)s/releases/%(release)s/requirements.txt' % env, pty=True) + run('cd %(path)s; %(path)s/bin/pip install -r %(path)s/releases/%(release)s/%(project_name)s/config/requirements.txt' % env, pty=True) + print '>>> Instaling site requirements' + + with settings(warn_only=True): + run('cd %(path)s; %(path)s/bin/pip install -r %(sandbox)s/etc/%(project_name)s/requirements.txt' % env, pty=True) -def copy_localsettings(): - "Copy localsettings.py from root directory to release directory (if this file exists)" - print ">>> copy localsettings" - require('release', provided_by=[deploy]) - require('path', provided_by=[staging, production]) +def hardlink_localsettings(): + "Hardlink localsettings.py from root directory to release directory (if this file exists)" + print ">>> Hardlink localsettings" + require('release', 'path', provided_by=[deploy]) + require('sandbox', provided_by=[staging, production]) + + # hardlink localsettings with settings(warn_only=True): - run('cp %(path)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env) + run('ln %(sandbox)s/etc/%(project_name)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env) def symlink_current_release(): @@ -162,9 +198,10 @@ def migrate(): print '>>> migrate' require('project_name', provided_by=[staging, production]) with cd('%(path)s/releases/current/%(project_name)s' % env): - run('../../../bin/python manage.py syncdb --noinput' % env, pty=True) + run('%(target)s manage.py syncdb --noinput' % env, pty=True) + if env.use_south: - run('../../../bin/python manage.py migrate' % env, pty=True) + run('%(target)s manage.py migrate' % env, pty=True) def django_compress(): @@ -172,10 +209,10 @@ def django_compress(): print '>>> migrate' require('project_name', provided_by=[staging, production]) with cd('%(path)s/releases/current/%(project_name)s' % env): - run('../../../bin/python manage.py synccompress --force' % env, pty=True) + run('%(target)s manage.py synccompress --force' % env, pty=True) def restart_webserver(): "Restart the web server" print '>>> restart webserver' - run('touch %(path)s/releases/current/%(project_name)s/%(project_name)s.wsgi' % env) + run('touch %(path)s/www/wsgi/%(project_name)s.wsgi' % env)