Wydzielenie ścieżek do python, virtualenv i pip do zmiennych w env.
[wolnelektury.git] / fabfile.py
index 6791864..e403320 100644 (file)
@@ -14,20 +14,25 @@ def staging():
     """Use staging server"""
     env.hosts = ['zuber@stigma.nowoczesnapolska.org.pl:2222']
     env.path = '/var/lektury'
     """Use staging server"""
     env.hosts = ['zuber@stigma.nowoczesnapolska.org.pl:2222']
     env.path = '/var/lektury'
+    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.hosts = ['fundacja@wolnelektury.pl:22123']
     env.path = '/opt/lektury'
     env.path = '/opt/lektury'
-
+    env.python = '/opt/lektury/basevirtualenv/bin/python'
+    env.virtualenv = '/opt/lektury/basevirtualenv/bin/virtualenv'
+    env.pip = '/opt/lektury/basevirtualenv/bin/pip'
 
 # =========
 # = Tasks =
 # =========
 def test():
     "Run the test suite and bail out if it fails"
 
 # =========
 # = Tasks =
 # =========
 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 deploy():
     """
 
 def deploy():
     """
@@ -35,13 +40,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')
     
     upload_tar_from_git()
     
     import time
     env.release = time.strftime('%Y-%m-%dT%H%M')
     
     upload_tar_from_git()
+    upload_requirements_bundle()
     install_requirements()
     symlink_current_release()
     migrate()
     install_requirements()
     symlink_current_release()
     migrate()
@@ -49,8 +54,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)
@@ -99,6 +103,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)
@@ -107,16 +112,32 @@ def upload_tar_from_git():
     run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True)
     local('rm %(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_requirements_bundle():
+    "Create a pybundle from requirements.txt file and upload it"
+    print '>>> upload requirements bundle'
+    require('release', provided_by=[deploy])
+    requirements_mtime = os.path.getmtime('requirements.txt')
+    pybundle_mtime = 0
+    try:
+        pybundle_mtime = os.path.getmtime('requirements.pybundle')
+    except os.error:
+        pass
+    if pybundle_mtime < requirements_mtime:
+        pip_options = file('pip-options.txt').read().strip()
+        local('pip bundle %s -r requirements.txt requirements.pybundle' % pip_options)
+    put('requirements.pybundle', '%(path)s/releases/%(release)s' % env)
+
 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])
     require('release', provided_by=[deploy])
-    pip_options = file('pip-options.txt').read().strip()
     with cd('%(path)s/releases/%(release)s' % env):
     with cd('%(path)s/releases/%(release)s' % env):
-        run('virtualenv --no-site-packages .')
-        run('pip install -E . %s -r requirements.txt' % pip_options)
+        run('%(virtualenv)s --no-site-packages .' % env)
+        run('%(pip)s install -E . requirements.pybundle' % 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):
@@ -130,6 +151,7 @@ def symlink_current_release():
 
 def migrate():
     "Update the database"
 
 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)
     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)
@@ -137,6 +159,7 @@ def migrate():
 
 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)
 
 # def install_site():
     run('touch %(path)s/releases/current/%(project_name)s/%(project_name)s.wsgi' % env)
 
 # def install_site():