Fixed requirements. Rewrote deployment script to use github.
authorŁukasz Rekucki <lrekucki@gmail.com>
Sun, 11 Apr 2010 16:52:15 +0000 (18:52 +0200)
committerŁukasz Rekucki <lrekucki@gmail.com>
Sun, 11 Apr 2010 16:52:15 +0000 (18:52 +0200)
fabfile.py
platforma/config/requirements.txt

index 587821b..8ae349f 100644 (file)
@@ -3,7 +3,7 @@ from fabric.api import *
 from fabric.contrib import files
 
 import os
 from fabric.contrib import files
 
 import os
-
+import time
 
 # ==========
 # = Config =
 
 # ==========
 # = Config =
@@ -11,6 +11,7 @@ import os
 # Globals
 env.project_name = 'platforma'
 env.use_south = True
 # Globals
 env.project_name = 'platforma'
 env.use_south = True
+env.giturl = "git://github.com/fnp/redakcja.git"
 
 
 # Servers
 
 
 # Servers
@@ -22,16 +23,26 @@ def staging():
     env.python = '/usr/bin/python'
     env.virtualenv = '/usr/bin/virtualenv'
     env.pip = '/usr/bin/pip'
     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'
 
 
 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.
     """
     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()
 
     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
     """
     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')
 
     env.release = time.strftime('%Y-%m-%dT%H%M')
 
-    upload_tar_from_git()
+    prepare_package_from_git()
+
     upload_wsgi_script()
     upload_wsgi_script()
-    upload_vhost_sample()
+#    upload_vhost_sample()
     install_requirements()
     copy_localsettings()
     symlink_current_release()
     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)
     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()
 
 
     restart_webserver()
 
 
@@ -105,46 +126,46 @@ def rollback():
 # =====================================================================
 # = Helpers. These are called by other functions rather than directly =
 # =====================================================================
 # =====================================================================
 # = 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'
     "Create an archive from the current Git master branch and upload it"
     print '>>> upload tar from git'
+
     require('release', provided_by=[deploy])
     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)
     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)
     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"
 
 
 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])
 
 
 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"
 
 
 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):
 
     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():
 
 
 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):
     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:
         if env.use_south:
-            run('../../../bin/python manage.py migrate' % env, pty=True)
+            run('%(target) manage.py migrate' % env, pty=True)
 
 
 def django_compress():
 
 
 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):
     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'
 
 
 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)
index 0d95ac8..4cf362b 100644 (file)
@@ -4,7 +4,7 @@ mercurial>=1.3.1
 PyYAML>=3.0
 
 ## Book conversion library
 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
 
 ## Django 
 Django>=1.1.1,<1.2