X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/a3face505cc1462d8d8cae3102666890608eacb6..69ce61e6ef27d1911538523b57371e19926641cb:/fabfile.py diff --git a/fabfile.py b/fabfile.py index 5a9d4040..b132b9dd 100644 --- a/fabfile.py +++ b/fabfile.py @@ -1,16 +1,18 @@ -from __future__ import with_statement # needed for python 2.5 +from __future__ import with_statement # needed for python 2.5 from fabric.api import * from fabric.contrib import files import os - +import time # ========== # = Config = # ========== # Globals env.project_name = 'platforma' -env.use_south = False +env.use_south = True +env.giturl = "git://github.com/fnp/redakcja.git" + # Servers def staging(): @@ -21,15 +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 = ['wolnelektury.pl:22123'] - env.user = 'fundacja' - env.path = '/opt/lektury/platforma' - env.python = '/opt/lektury/basevirtualenv/bin/python' - env.virtualenv = '/opt/lektury/basevirtualenv/bin/virtualenv' - env.pip = '/opt/lektury/basevirtualenv/bin/pip' + env.hosts = ['szo.nowoczesnapolska.org.pl:2225'] + env.user = 'librarian' + 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') # ========= @@ -40,47 +53,62 @@ def test(): require('hosts', 'path', provided_by=[staging, production]) result = run('cd %(path)s/%(project_name)s; %(python)s manage.py test' % env) + 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;" % 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) + # 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; mkdir -p releases; mkdir -p shared; mkdir -p packages;' % env, pty=True) run('cd %(path)s/releases; ln -s . current; ln -s . previous' % env, pty=True) deploy() + def deploy(): """ - Deploy the latest version of the site to the servers, - install any required third party modules, + Deploy the latest version of the site to the servers, + 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() restart_webserver() + def deploy_version(version): "Specify a specific version to be made live" - require('hosts', 'path', provided_by=[localhost,webserver]) + require('hosts', 'path', provided_by=[localhost, webserver]) env.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() + def rollback(): """ Limited rollback capability. Simple loads the previously current @@ -98,42 +126,54 @@ 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' - require('release', provided_by=[deploy]) - run('cd %(path)s; %(pip)s install -E . -r %(path)s/releases/%(release)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" + + print '>>> Instaling global requirements' require('release', provided_by=[deploy]) - require('path', provided_by=[staging, production]) + 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 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(): "Symlink our current release" @@ -144,16 +184,27 @@ def symlink_current_release(): run('rm releases/previous; mv releases/current releases/previous') run('ln -s %(release)s releases/current' % env) + def migrate(): "Update the database" 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(): + "Update static files" + print '>>> migrate' + require('project_name', provided_by=[staging, production]) + with cd('%(path)s/releases/current/%(project_name)s' % env): + 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)