Generowanie pybundle z zależnościami na komputerze lokalnym i wrzucanie go przez...
[wolnelektury.git] / fabfile.py
index 6791864..ad5760d 100644 (file)
@@ -3,22 +3,32 @@ from fabric.api import *
 
 import os
 
 
 import os
 
+
+# ==========
+# = Config =
+# ==========
 # Globals
 env.project_name = 'wolnelektury'
 # Globals
 env.project_name = 'wolnelektury'
+env.use_south = True
 
 
-
-# ===========
-# = Servers =
-# ===========
+# Servers
 def staging():
     """Use staging server"""
 def staging():
     """Use staging server"""
-    env.hosts = ['zuber@stigma.nowoczesnapolska.org.pl:2222']
-    env.path = '/var/lektury'
+    env.hosts = ['stigma.nowoczesnapolska.org.pl:2222']
+    env.user = 'zuber'
+    env.path = '/var/services/wolnelektury'
+    env.python = '/usr/bin/python'
+    env.virtualenv = '/usr/bin/virtualenv'
+    env.pip = '/usr/bin/pip'
     
 def production():
     """Use production server"""
     
 def production():
     """Use production server"""
-    env.hosts = ['fundacja@wolnelektury:22123']
-    env.path = '/opt/lektury'
+    env.hosts = ['wolnelektury.pl:22123']
+    env.user = 'fundacja'
+    env.path = '/opt/lektury/wolnelektury'
+    env.python = '/opt/cas/basevirtualenv/bin/python'
+    env.virtualenv = '/opt/cas/basevirtualenv/bin/virtualenv'
+    env.pip = '/opt/cas/basevirtualenv/bin/pip'
 
 
 # =========
 
 
 # =========
@@ -26,8 +36,19 @@ def production():
 # =========
 def test():
     "Run the test suite and bail out if it fails"
 # =========
 def test():
     "Run the test suite and bail out if it fails"
-    require('project_dir', provided_by=[staging, production])
-    result = local('cd %(path)s; python manage.py test' % env)
+    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])
+
+    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)
+    deploy()
 
 def deploy():
     """
 
 def deploy():
     """
@@ -35,13 +56,13 @@ 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', provided_by=[staging, production])
-    require('path')
-    
+    require('hosts', 'path', provided_by=[staging, production])
+
     import time
     env.release = time.strftime('%Y-%m-%dT%H%M')
     import time
     env.release = time.strftime('%Y-%m-%dT%H%M')
-    
+
     upload_tar_from_git()
     upload_tar_from_git()
+    upload_pybundle()
     install_requirements()
     symlink_current_release()
     migrate()
     install_requirements()
     symlink_current_release()
     migrate()
@@ -49,8 +70,7 @@ def deploy():
 
 def deploy_version(version):
     "Specify a specific version to be made live"
 
 def deploy_version(version):
     "Specify a specific version to be made live"
-    require('hosts', provided_by=[localhost,webserver])
-    require('path')
+    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)
     env.version = version
     with cd(env.path):
         run('rm releases/previous; mv releases/current releases/previous;', pty=True)
@@ -69,29 +89,6 @@ def rollback():
         run('mv releases/previous releases/current;', pty=True)
         run('mv releases/_previous releases/previous;', pty=True)
     restart_webserver()
         run('mv releases/previous releases/current;', pty=True)
         run('mv releases/_previous releases/previous;', pty=True)
     restart_webserver()
-    
-# def setup():
-#     """
-#     Setup a fresh virtualenv as well as a few useful directories, then run
-#     a full deployment
-#     """
-#     require('hosts', provided_by=[staging, production])
-#     require('path')
-#     sudo('aptitude install -y python-setuptools')
-#     sudo('easy_install pip')
-#     sudo('pip install virtualenv')
-#     sudo('aptitude install -y apache2-threaded')
-#     sudo('aptitude install -y libapache2-mod-wsgi') # beware, outdated on hardy!
-#     # we want to get rid of the default apache config
-#     sudo('cd /etc/apache2/sites-available/; a2dissite default;', pty=True)
-#     sudo('mkdir -p %(path)s; chown %(user)s:%(user)s %(path)s;' % env, pty=True)
-#     run('ln -s %(path)s www;' % env, pty=True) # symlink web dir in home
-#     with cd(env.path):
-#         run('virtualenv .;' % env, pty=True)
-#         run('mkdir logs; chmod a+w logs; mkdir releases; mkdir shared; mkdir packages;' % env, pty=True)
-#         if env.use_photologue: run('mkdir photologue');
-#         run('cd releases; ln -s . current; ln -s . previous;', pty=True)
-#     deploy()
 
 
 # =====================================================================
 
 
 # =====================================================================
@@ -99,6 +96,7 @@ def rollback():
 # =====================================================================
 def upload_tar_from_git():
     "Create an archive from the current Git master branch and upload it"
 # =====================================================================
 def 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])
     local('git archive --format=tar master | gzip > %(release)s.tar.gz' % env)
     run('mkdir -p %(path)s/releases/%(release)s' % env, pty=True)
     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)
@@ -109,39 +107,51 @@ def upload_tar_from_git():
 
 def install_requirements():
     "Install the required packages from the requirements file using pip"
 
 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 . requirements.pybundle' % env)
+
+def upload_pybundle():
+    "Create pybundle with required libraries and upload it"
+    print ">>> upload pybundle"
     require('release', provided_by=[deploy])
     require('release', provided_by=[deploy])
-    pip_options = file('pip-options.txt').read().strip()
-    with cd('%(path)s/releases/%(release)s' % env):
-        run('virtualenv --no-site-packages .')
-        run('pip install -E . %s -r requirements.txt' % pip_options)
+    with settings(warn_only=True):
+        pip_options = run('cat %(path)s/releases/%(release)s/pip-options.txt' % env)
+        if pip_options.failed:
+            env.pip_options = ''
+        else:
+            env.pip_options = pip_options
+
+    requirements_mtime = os.path.getmtime('requirements.txt')
+    bundle_mtime = 0
+    try:
+        bundle_mtime = os.path.getmtime('requirements.pybundle')
+    except os.error:
+        pass
+
+    if requirements_mtime > bundle_mtime:
+        local('pip bundle requirements.pybundle %(pip_options)s -r requirements.txt' % env)
+        put('requirements.pybundle', '%(path)s' % env)
 
 def symlink_current_release():
     "Symlink our current release"
 
 def symlink_current_release():
     "Symlink our current release"
+    print '>>> symlink current release'
     require('release', provided_by=[deploy])
     require('path', provided_by=[staging, production])
     with cd(env.path):
     require('release', provided_by=[deploy])
     require('path', provided_by=[staging, production])
     with cd(env.path):
-        with settings(
-            hide('warnings', 'running', 'stdout', 'stderr'),
-            warn_only=True
-        ):
-            run('rm releases/previous; mv releases/current releases/previous;')
-        
+        run('rm releases/previous; mv releases/current releases/previous')
         run('ln -s %(release)s releases/current' % env)
 
 def migrate():
     "Update the database"
         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):
     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('../bin/python manage.py migrate' % env, pty=True)
+        run('../../../bin/python manage.py syncdb --noinput' % env, pty=True)
+        if env.use_south:
+            run('../../../bin/python manage.py migrate' % env, pty=True)
 
 def restart_webserver():
     "Restart the web server"
 
 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/releases/current/%(project_name)s/%(project_name)s.wsgi' % env)
-
-# def install_site():
-#     "Add the virtualhost file to apache"
-#     require('release', provided_by=[deploy, setup])
-#     #sudo('cd %(path)s/releases/%(release)s; cp %(project_name)s%(virtualhost_path)s%(project_name)s /etc/apache2/sites-available/' % env)
-#     sudo('cd %(path)s/releases/%(release)s; cp vhost.conf /etc/apache2/sites-available/%(project_name)s' % env)
-#     sudo('cd /etc/apache2/sites-available/; a2ensite %(project_name)s' % env, pty=True)