From 85758488fc4c0f60e4b958df9c4c7cd67a732000 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Rekucki?= Date: Sun, 11 Apr 2010 18:52:15 +0200 Subject: [PATCH] Fixed requirements. Rewrote deployment script to use github. --- fabfile.py | 82 ++++++++++++++++++++----------- platforma/config/requirements.txt | 2 +- 2 files changed, 53 insertions(+), 31 deletions(-) diff --git a/fabfile.py b/fabfile.py index 587821b5..8ae349f0 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 = env.target = os.path.join(env.sandbox, 'python', 'bin', 'python') + + common() + + +def common(): + env.path = os.path.join(env.sandbox, env.project_name) # ========= @@ -48,10 +59,19 @@ 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) + + # make a git mirror + run("""\ +cd %(path)s; +git clone %(giturl)s mirror; +cd %(path)s/mirror; +git pull""" % env, pty=True) - 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('%(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() @@ -62,14 +82,14 @@ 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() symlink_current_release() @@ -85,6 +105,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 +126,46 @@ 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 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) + run('cd %(path)s; %(path)s/bin/pip install -r %(path)s/releases/%(release)s/%(project_name)s/config/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]) + require('release', 'path', provided_by=[deploy]) + require('sandbox', provided_by=[staging, production]) with settings(warn_only=True): - run('cp %(path)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env) + run('cp %(sandbox)s/etc/%(project_name)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env) def symlink_current_release(): @@ -162,9 +183,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) manage.py syncdb --noinput' % env, pty=True) + if env.use_south: - run('../../../bin/python manage.py migrate' % env, pty=True) + run('%(target) manage.py migrate' % env, pty=True) def django_compress(): @@ -172,10 +194,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) 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) diff --git a/platforma/config/requirements.txt b/platforma/config/requirements.txt index 0d95ac8c..4cf362bd 100644 --- a/platforma/config/requirements.txt +++ b/platforma/config/requirements.txt @@ -4,7 +4,7 @@ mercurial>=1.3.1 PyYAML>=3.0 ## Book conversion library -git+http://github.com/fnp/librarian.git@master#egg=librarian +git+git://github.com/fnp/librarian.git@master#egg=librarian ## Django Django>=1.1.1,<1.2 -- 2.20.1