示例#1
0
    def release(self, rel, check_exists=False):
        if not os.path.isabs(rel):
            rel = os.path.join(self.home, 'releases', rel)

        if check_exists and not path_exists(rel):
            abort('no such release:%s' % rel)
        return rel
示例#2
0
    def switch_current_to(self, rel=None):
        '''
        switch curernt link to rel.
        if operation failed, leave current link unchanged
        '''
        if rel is None:
            rel = self.get_rel_id()
        path = self.release(rel, True)

        def link_to():
            with settings(warn_only=True):
                return mine('ln -s %s %s' % (path, self.current)).succeeded

        def rollback_if_failed():
            bak = self.current+'.bak'
            mine('mv %s %s' % (self.current, bak))
            def rollback():
                mine('mv %s %s' % (bak, self.current))

            try:
                ok = link_to()
            except:
                rollback()
                raise

            if ok:
                mine('rm -r %s' % bak)
            else:
                rollback()
                abort('switch failed, rollback to original')

        if path_exists(self.current):
            rollback_if_failed()
        else:
            link_to()
示例#3
0
 def save_current_for_rollback(self):
     if not path_exists(self.current):
         #for the first time deploy, there is no current link
         return
     path = self.get_rel_id()
     curr = self.current_release()
     mine("echo '%s' > '%s'" % (curr, os.path.join(path, 'PREV')))
示例#4
0
 def overwrite_to_release(self, src):
     rel = self.get_rel_id()
     if path_exists(rel):
         abort('try to overwrite a exists release:%s->%s' % (src, rel))
     curr = self.current_release(True)
     mine("cp -r '%s' '%s'" % (curr, rel))
     mine("cp -r '%s'/* '%s'" % (src, rel))
     return rel
示例#5
0
    def make_workspace(self, home):
        if path_exists(home):
            if not is_owner(home):
                abort('workspace already exists and does not belong to you, \
make sure you want to reinstall the project:%s' % home)
        else:
            with settings(hide('warnings'), warn_only=True):
                if not sudo('mkdir %s' % home).failed:
                    sudo('chown %s %s' % (myenv.owner, home))
示例#6
0
 def get_previous(self, rel=None):
     if rel:
         rel = self.release(rel, True)
     else:
         rel = self.current_release(True)
     prev = os.path.join(rel, 'PREV')
     if path_exists(prev):
         return mine("cat '%s'" % prev).stdout
     abort('no avaiable previous version')
示例#7
0
 def current_release(self, check_exists=False):
     '''
     real path to which the current symbol link refer
     '''
     path = mine("readlink '%s'" % self.current).stdout
     if not os.path.isabs(path):
         path = os.path.join(os.path.dirname(self.current), path)
     if check_exists and not path_exists(path):
         abort('no such release:%s' % path)
     return path
示例#8
0
 def push_to_release(self, src):
     rel = self.get_rel_id()
     if path_exists(rel):
         abort('try to overwrite a exists release:%s->%s' % (src, rel))
     mine("cp -r '%s' '%s'" % (src, rel))
     return rel