def local_clone(): """Checkout code to local machine, then upload to servers""" # set new release env prepare_for_checkout() # start cache_name = 'code_%s.tar.bz2' % env.commit_hash[:15] local_cache = '/tmp/' + cache_name if not os.path.isfile(local_cache): local('git archive --remote=%(git_clone)s %(git_branch)s | bzip2 > %(local_cache)s' % { 'git_clone': env.git_clone, 'git_branch': env.git_branch, 'local_cache': local_cache, }) put(local_cache, '/tmp/') sudo_run('mkdir -p %(current_release)s' % { 'current_release': env.current_release, }) with cd(env.current_release): sudo_run('tar jxf %(local_cache)s' % { 'local_cache': local_cache, })
def remote_export(): """Checkout code to the remote servers""" # set new release env prepare_for_checkout() # start cache_name = 'code_%(app_name)s_%(svn_revision)s_%(current_revision)s' % { 'app_name': env.app_name, 'svn_revision': env.svn_revision, 'current_revision': env.current_revision, } local_cache = '/tmp/'+cache_name # svn auth svn_username_opt = '' if env.svn_username: svn_username_opt = '--username %(svn_username)s' % {'svn_username': env.svn_username} svn_password_opt = '' if env.svn_password: svn_password_opt = '--password %(svn_password)s' % {'svn_password': env.svn_password} sudo_run('svn export -r %(svn_revision)s %(svn_repo)s %(local_cache)s %(svn_username_opt)s %(svn_password_opt)s' % { 'svn_revision': env.svn_revision, 'svn_repo': env.svn_repo, 'local_cache': local_cache, 'svn_username_opt': svn_username_opt, 'svn_password_opt': svn_password_opt, }) sudo_run('mv %(local_cache)s %(current_release)s' % { 'local_cache': local_cache, 'current_release': env.current_release, })
def task(self): """Clean up old releases""" if len(env.releases) > 3: directories = env.releases directories.reverse() del directories[:3] env.directories = ' '.join(['%(releases_path)s/%(release)s' % {'releases_path': env.releases_path, 'release': release} for release in directories]) sudo_run('rm -rf %(directories)s' % {'directories': env.directories})
def symlink(): """Updates the symlink to the most recently deployed version""" for dirname in env.shared_dirs: cmd = 'ln -nfs %(shared_path)s/%(dirname)s %(current_release)s/%(dirname)s' % { 'shared_path': env.shared_path, 'current_release': env.current_release, 'dirname': dirname, } sudo_run(cmd)
def rollback_code(): """Rolls back to the previously deployed version""" if len(env.releases) >= 2: env.current_release = env.releases[-1] env.previous_revision = env.releases[-2] env.current_release = '%(releases_path)s/%(current_revision)s' %\ {'releases_path': env.releases_path, 'current_revision': env.current_revision} env.previous_release = '%(releases_path)s/%(previous_revision)s' %\ {'releases_path': env.releases_path, 'previous_revision': env.previous_revision} sudo_run('rm %(current_path)s; ln -s %(previous_release)s %(current_path)s && rm -rf %(current_release)s' % {'current_release': env.current_release, 'previous_release': env.previous_release, 'current_path': env.current_path})
def task(self): """Prepares one or more servers for deployment""" sudo_run('mkdir -p %(domain_path)s/{releases,shared}' % { 'domain_path': env.domain_path}) if env.shared_dirs: dirs = ','.join(env.shared_dirs) if len(env.shared_dirs) > 1: dirs = '{'+dirs+'}' sudo_run('mkdir -p %(shared_path)s/%(dirs)s' % { 'shared_path': env.shared_path, 'dirs': dirs}) permissions()
def local_export(): """Checkout code to local machine, then upload to servers""" # set new release env prepare_for_checkout() # start cache_name = 'code_%(app_name)s_%(svn_revision)s_%(current_revision)s' % { 'app_name': env.app_name, 'svn_revision': env.svn_revision, 'current_revision': env.current_revision, } # svn auth svn_username_opt = '' if env.svn_username: svn_username_opt = '--username %(svn_username)s' % {'svn_username': env.svn_username} svn_password_opt = '' if env.svn_password: svn_password_opt = '--password %(svn_password)s' % {'svn_password': env.svn_password} cmd = ('svn export -r %(svn_revision)s %(svn_repo)s ' '/tmp/%(cache_name)s %(svn_username_opt)s %(svn_password_opt)s') % { 'svn_revision': env.svn_revision, 'svn_repo': env.svn_repo, 'cache_name': cache_name, 'svn_username_opt': svn_username_opt, 'svn_password_opt': svn_password_opt, } local(cmd) local('cd /tmp/ && tar cvzf %(cache_name)s.tar.gz %(cache_name)s' % { 'cache_name': cache_name, }) put('/tmp/%(cache_name)s.tar.gz' % {'cache_name': cache_name}, '/tmp/') with cd('/tmp'): sudo_run('tar -xvf %(cache_name)s.tar.gz' % { 'cache_name': cache_name, }) sudo_run('mv %(cache_name)s %(current_release)s' % { 'cache_name': cache_name, 'current_release': env.current_release, })
def task(self): """Restarts your application""" try: if env.wsgi_path.startswith('/'): # user specifies absolute path touch_file_path = env.wsgi_path else: # relative path. In this case, I prefer "env.domain_path/env.wsgi_path" # but original author choose "env.current_release/env.wsgi_path", # for backward compatibility, follow it touch_file_path = '%(current_release)s/%(wsgi_path)s' %\ {'current_release': env.current_release, 'wsgi_path': env.wsgi_path} sudo_run('touch %s' % touch_file_path) except AttributeError: try: sudo_run(env.restart_cmd) except AttributeError: pass
def localcopy(): """ Deploy local copy to servers """ # set new release env prepare_for_checkout() # start cache_name = 'code_%s.tar.bz2' % env.commit_hash[:15] cmd = ('cp -rf %(localcopy_path)s /tmp/%(cache_name)s && ' 'cd /tmp/ && tar cvzf %(cache_name)s.tar.gz %(cache_name)s') % { 'localcopy_path': env.localcopy_path, 'cache_name': cache_name, } local(cmd) # We add a guid for tmp folder on server is to avoid conflict # when deploying onto localhost, mainly for testing purpose. server_tmp_folder = '/tmp/%(guid)s' % {'guid': uuid.uuid4().hex} sudo_run('mkdir -p %(dir)s && chmod 777 %(dir)s' % {'dir': server_tmp_folder}) put('/tmp/%(cache_name)s.tar.gz' % {'cache_name': cache_name}, server_tmp_folder) with cd(server_tmp_folder): sudo_run('tar -xvf %(cache_name)s.tar.gz' % { 'cache_name': cache_name, }) sudo_run('mv %(cache_name)s %(current_release)s' % { 'cache_name': cache_name, 'current_release': env.current_release, })
def remote_clone(): """Checkout code to the remote servers""" # set new release env prepare_for_checkout() # start cache_name = 'code_%s.tar.bz2' % env.commit_hash_cache local_cache = '/tmp/'+cache_name sudo_run('git archive --remote=%(git_clone)s %(git_branch)s | bzip2 > %(local_cache)s' % { 'git_clone': env.git_clone, 'git_branch': env.git_branch, 'local_cache': local_cache, }) sudo_run('mkdir -p %(current_release)s' % { 'current_release': env.current_release, }) with cd(env.current_release): sudo_run('tar jxf %(local_cache)s' % { 'local_cache': local_cache, })
def set_current(): """Sets the current directory to the new release""" sudo_run('ln -nfs %(current_release)s %(current_path)s' % {'current_release': env.current_release, 'current_path': env.current_path})