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')))
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
def rollback(): ''' rollback to previous version ''' schema = schemas.Cap(myenv.home) curr = schema.current_release() prev = schema.get_previous() schema.switch_current_to(prev) mine("rm -rf '%s'" % curr)
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')
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')
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
def rollback(): mine('mv %s %s' % (bak, self.current))
def link_to(): with settings(warn_only=True): return mine('ln -s %s %s' % (path, self.current)).succeeded
def remove_useless(self, Dfiles): rel = self.get_rel_id() with cd(rel): for name in Dfiles: mine('rm -rf %s' % name.base)
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
def tag_info(self): with cd(self.current): return { 'TAG': mine('cat TAG').stdout, 'REV': mine('cat REV').stdout, }
def build(self): ''' build hierarchical directory structure in home ''' for path in self.walk(): mine('mkdir -p %s' % path)