def archive(self, path, prefix, ref): try: repo = Jagare(path) stdout = repo.archive(prefix=prefix, ref=ref) return stdout except Exception as e: raise ServiceUnavailable(repr(e))
class Repo(object): provided_features = [] def __init__(self, path): self.type = "repo" self.path = path self.repo = Jagare(self.path) def provide(self, name): '''检查是否提供某功能,即是否提供某接口''' return name in self.provided_features @property def is_empty(self): return self.repo.empty @property def default_branch(self): branch = None head = self.repo.head if head: branch = head.name.rpartition('/')[-1] return branch def update_default_branch(self, name): branches = self.repo.branches if name not in branches: return None self.repo.update_head(name) def clone(self, path, bare=None, branch=None, mirror=None, env=None): self.repo.clone(path, bare=bare, branch=branch, mirror=mirror, env=env) def archive(self, name): content = self.repo.archive(name) outbuffer = StringIO() zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) zipfile.writelines(content) zipfile.close() out = outbuffer.getvalue() return out def get_submodule(self, ref, path): path = path.strip() gitmodules = self.repo.show("%s:%s" % (ref, '.gitmodules')) if not gitmodules: return None submodules_lines = gitmodules["data"].split('\n') modules_str = '\n'.join([line.strip() for line in submodules_lines]) config = ConfigParser.RawConfigParser() config.readfp(StringIO(modules_str)) for section in config.sections(): if config.has_option(section, 'path') and config.get( section, 'path') == path: url = config.get(section, 'url') return Submodule(url, path) return None def get_file(self, ref, path): blob = self.repo.show("%s:%s" % (ref, path)) if not blob: return None if blob['type'] != 'blob': return None # TODO: validate blob return Blob(self, blob) def get_file_by_lines(self, ref, path): blob = self.get_file(ref, path) # TODO: blob.size < xxx if not blob or blob.binary: return None if not blob.data: return [] src = blob.data return src.splitlines() def get_file_n_lines(self, ref, path): lines = self.get_file_by_lines(ref, path) if lines: return len(lines) return 0 def get_commits(self, *w, **kw): commits = self.repo.rev_list(*w, **kw) # TODO: validate commits return [Commit(self, commit) for commit in commits] def get_raw_diff(self, ref, from_ref=None, **kw): ''' get Jagare formated diff dict ''' return self.repo.diff(ref, from_ref=from_ref, **kw) def get_diff(self, ref=None, from_ref=None, linecomments=[], raw_diff=None, **kw): ''' get ngit wrapped diff object ''' _raw_diff = None if raw_diff: _raw_diff = raw_diff elif ref: _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) if _raw_diff: return Diff(self, _raw_diff, linecomments) else: return None def get_diff_length(self, ref, from_ref=None, **kw): _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) return len(_raw_diff['patches']) if _raw_diff else 0 def get_last_commit(self, ref, path=None): if not path: return self.get_commit(ref) commit = self.repo.rev_list(ref, path=path, max_count=1) if not commit: return None commit = commit[0] commit = Commit(self, commit) return commit def get_commit(self, ref): sha = self.repo.resolve_commit(ref) if not sha: return None commit = self.repo.show(sha) if not commit: return None # TODO: validate commit return Commit(self, commit) def delete_branch(self, name): self.repo.delete_branch(name) def get_path_by_ref(self, ref): ''' get blob or tree ''' path = self.repo.show(ref) if not path: return None if path['type'] == 'tree': path = Tree(self, path['entries']) elif path['type'] == 'blob': path = Blob(self, path) else: path = None return path def get_path(self, ref, path): _item = self.repo.show("%s:%s" % (ref, path)) if not _item: return None if _item['type'] == 'tree': item = Tree(self, _item['entries']) elif _item['type'] == 'blob': item = Blob(self, _item) else: item = None return item
class Repo(object): provided_features = [] def __init__(self, path): self.type = "repo" self.path = path self.repo = Jagare(self.path) def provide(self, name): '''检查是否提供某功能,即是否提供某接口''' return name in self.provided_features @property def is_empty(self): return self.repo.empty @property def default_branch(self): branch = None head = self.repo.head if head: branch = head.name.rpartition('/')[-1] return branch def update_default_branch(self, name): branches = self.repo.branches if name not in branches: return None self.repo.update_head(name) def clone(self, path, bare=None, branch=None, mirror=None, env=None): self.repo.clone(path, bare=bare, branch=branch, mirror=mirror, env=env) def archive(self, name): content = self.repo.archive(name) outbuffer = StringIO() zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) zipfile.writelines(content) zipfile.close() out = outbuffer.getvalue() return out def get_submodule(self, ref, path): path = path.strip() gitmodules = self.repo.show("%s:%s" % (ref, '.gitmodules')) if not gitmodules: return None submodules_lines = gitmodules["data"].split('\n') modules_str = '\n'.join([line.strip() for line in submodules_lines]) config = ConfigParser.RawConfigParser() config.readfp(StringIO(modules_str)) for section in config.sections(): if config.has_option(section, 'path') and config.get(section, 'path')==path: url = config.get(section, 'url') return Submodule(url, path) return None def get_file(self, ref, path): blob = self.repo.show("%s:%s" % (ref, path)) if not blob: return None if blob['type'] != 'blob': return None # TODO: validate blob return Blob(self, blob) def get_file_by_lines(self, ref, path): blob = self.get_file(ref, path) # TODO: blob.size < xxx if not blob or blob.binary: return None if not blob.data: return [] src = blob.data return src.splitlines() def get_file_n_lines(self, ref, path): lines = self.get_file_by_lines(ref, path) if lines: return len(lines) return 0 def get_commits(self, *w, **kw): commits = self.repo.rev_list(*w, **kw) # TODO: validate commits return [Commit(self, commit) for commit in commits] def get_raw_diff(self, ref, from_ref=None, **kw): ''' get Jagare formated diff dict ''' return self.repo.diff(ref, from_ref=from_ref, **kw) def get_diff(self, ref=None, from_ref=None, linecomments=[], raw_diff=None, **kw): ''' get ngit wrapped diff object ''' _raw_diff = None if raw_diff: _raw_diff = raw_diff elif ref: _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) if _raw_diff: return Diff(self, _raw_diff, linecomments) else: return None def get_diff_length(self, ref, from_ref=None, **kw): _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) return len(_raw_diff['patches']) if _raw_diff else 0 def get_last_commit(self, ref, path=None): if not path: return self.get_commit(ref) commit = self.repo.rev_list(ref, path=path, max_count=1) if not commit: return None commit = commit[0] commit = Commit(self, commit) return commit def get_commit(self, ref): sha = self.repo.resolve_commit(ref) if not sha: return None commit = self.repo.show(sha) if not commit: return None # TODO: validate commit return Commit(self, commit) def delete_branch(self, name): self.repo.delete_branch(name) def get_path_by_ref(self, ref): ''' get blob or tree ''' path = self.repo.show(ref) if not path: return None if path['type'] == 'tree': path = Tree(self, path['entries']) elif path['type'] == 'blob': path = Blob(self, path) else: path = None return path def get_path(self, ref, path): _item = self.repo.show("%s:%s" % (ref, path)) if not _item: return None if _item['type'] == 'tree': item = Tree(self, _item['entries']) elif _item['type'] == 'blob': item = Blob(self, _item) else: item = None return item
def deployFabric(payload): # step.1 fetch and merge # step.2 export this code with tar.gz # step.3 update this archive.tar.gz to aliyun'oss # step.4 deploy this code with each machine and update each machine's status # step.5 update this fabric's status. fabric_id = payload.get('fabric_id', None) fabricobj = FabricModel() fabric_info = fabricobj._getFabricInfo(fabric_id) fabric_time = int(time.time()) if fabric_info: # get logger obj logger = BaseModel.getLogger(fabric_info['id'], 'fabric') logger.info("获取到发布计划") project_info = fabricobj._getProjectInfo(fabric_info['project_id']) if project_info: logger.info("获取到任务信息") # savepath, localpath, fabric_time, tag, mode='tar.gz' savepath = BaseModel.buildpath( conf.savepath, project_info['localaddress'], fabric_info['create_time'], fabric_info['tag'], ) # export git tar.gz file if fabric_info['type'] == 'new': try: logger.info("开始创建Git对象") git = Jagare(project_info['localaddress']) logger.info("git对象创建成功") except Exception as e: logger.info("git对象创建失败:" + str(e)) fabricobj._endFabric(fabric_id, 'error', fabric_time, int(time.time()), str(e)) return 'end' # step.1 try: logger.info("开始更新代码") git.pull(callbacks=git.auth(project_info['gituser'], conf.auth.pubkey, conf.auth.privkey, '')) logger.info("代码更新成功") except Exception as e: logger.info("代码更新失败:" + str(e)) fabricobj._endFabric(fabric_id, 'error', fabric_time, int(time.time()), str(e)) # step.2 try: logger.info("开始导出代码") dirname = os.path.dirname(savepath) if not os.path.exists(dirname): os.makedirs(dirname) git.archive(savepath) logger.info("代码导出成功") except Exception as e: logger.info("代码导出失败" + str(e)) fabricobj._endFabric(fabric_id, 'error', fabric_time, int(time.time()), str(e)) return 'end' # step.2.5 # create tag for this repo try: logger.info("开始给Git仓库打标签") git.create_tag(fabric_info['tag'], fabric_info['desc'], conf.username, conf.email) logger.info("Git标签添加成功") except Exception as e: logger.info("标签添加失败" + str(e)) # step.3 try: logger.info("开始上传至OSS") osspath = BaseModel.buildOssPath( project_info['localaddress'], fabric_info['create_time'], fabric_info['tag']) logger.info('OSS地址为:' + osspath) BaseModel.uploadFileToOss(local=savepath, remote=osspath) logger.info("OSS上传成功") except Exception as e: logger.info("OSS上传失败" + str(e)) #step.4 try: logger.info("开始进行发布对象构建") if os.path.exists(savepath): res = DeployModel(fabric_info, project_info, savepath).deployMachineByFabric() else: raise FileNotFoundError("没有找到对应的发布包") logger.info("发布过程结束") except FileNotFoundError as e: logger.info("发布过程异常:" + str(e)) fabricobj._endFabric(fabric_id, 'error', fabric_time, int(time.time()), str(e)) fabricobj._setMachinesStatus(fabric_id, 'error') return 'end' except Exception as e: logger.info("发布过程异常" + str(e)) fabricobj._endFabric(fabric_id, 'error', fabric_time, int(time.time()), str(e)) return 'end' #step.5 finish_time = int(time.time()) fabricobj._endFabric(fabric_id, 'end', fabric_time, finish_time, success_num=res['success'], error_num=res['error']) logger.info("发布结束") else: # not found project'info logger.info("没有获取到项目信息") fabricobj._endFabric(fabric_id, 'error', fabric_time, int(time.time()), 'not found project') else: # not found fabric'info print("没有获取到发布计划") return 'end'
class Repo(object): provided_features = [] def __init__(self, path): self.type = "repo" self.path = path self.repo = Jagare(self.path) def provide(self, name): '''检查是否提供某功能,即是否提供某接口''' return name in self.provided_features @property def empty(self): return self.is_empty @property def is_empty(self): return self.repo.empty @property def default_branch(self): branch = '' head = self.repo.head if head: branch = head.name[REFS_HEADS_PREFIX_LENGTH:] return branch def update_default_branch(self, name): branches = self.repo.branches if name not in branches: return None self.repo.update_head(name) def clone(self, path, bare=None, branch=None, mirror=None, env=None, shared=None): self.repo.clone(path, bare=bare, branch=branch, mirror=mirror, env=env) # shared=shared) why? def archive(self, name, ref='master', ext='tar.gz'): content = self.repo.archive(name, ref=ref) if ext == 'tar': return content outbuffer = StringIO() zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) zipfile.write(content) zipfile.close() out = outbuffer.getvalue() return out def get_submodule(self, ref, path): path = path.strip() gitmodules = self.repo.show("%s:%s" % (ref, '.gitmodules')) if not gitmodules: return None submodules_lines = gitmodules["data"].split('\n') modules_str = '\n'.join([line.strip() for line in submodules_lines]) config = ConfigParser.RawConfigParser() config.readfp(StringIO(modules_str)) for section in config.sections(): if config.has_option(section, 'path') and config.get( section, 'path') == path: url = config.get(section, 'url') return Submodule(url, path) return None def get_file(self, ref, path): blob = self.repo.show("%s:%s" % (ref, path)) if not blob: return None if blob['type'] != 'blob': return None # TODO: validate blob return Blob(self, blob) def get_file_by_lines(self, ref, path): blob = self.get_file(ref, path) # TODO: blob.size < xxx if not blob or blob.binary: return None if not blob.data: return [] src = blob.data return src.splitlines() def get_file_n_lines(self, ref, path): lines = self.get_file_by_lines(ref, path) if lines: return len(lines) return 0 def get_commits(self, to_ref, from_ref=None, path=None, skip=0, max_count=0, author=None, query=None, first_parent=None, since=0, no_merges=None): commits = self.repo.rev_list(to_ref=to_ref, from_ref=from_ref, path=path, skip=skip, max_count=max_count, author=author, query=query, first_parent=first_parent, since=since, no_merges=no_merges) return [Commit(self, commit) for commit in commits] def get_raw_diff(self, ref, from_ref=None, paths=None, **kw): ''' get Jagare formated diff dict ''' try: diff = self.repo.diff(ref, from_ref=from_ref, paths=paths, **kw) except KeyError: return None return diff def get_diff(self, ref=None, from_ref=None, linecomments=[], raw_diff=None, paths=None, **kw): ''' get ngit wrapped diff object ''' _raw_diff = None if raw_diff: _raw_diff = raw_diff elif ref: _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, paths=paths, **kw) if _raw_diff: return Diff(self, _raw_diff, linecomments) else: return None def get_diff_length(self, ref, from_ref=None, **kw): _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) return len(_raw_diff['patches']) if _raw_diff else 0 def get_last_commit(self, ref, path=None, no_merges=False): if not path: return self.get_commit(ref) commit = self.repo.rev_list(ref, path=path, max_count=1, no_merges=no_merges) if not commit: return None commit = commit[0] commit = Commit(self, commit) return commit def get_previours_commit(self, ref, path): """previours commit that touch the specified path""" commits = self.repo.rev_list(ref, path=path, max_count=2, no_merges=True) for commit in commits: if commit['sha'] != self.repo.sha(ref): return Commit(self, commit) return None def get_commit(self, ref): sha = self.repo.resolve_commit(ref) if not sha: return None commit = self.repo.show(sha) if not commit: return None # TODO: validate commit return Commit(self, commit) def delete_branch(self, name): self.repo.delete_branch(name) def get_path_by_ref(self, ref): ''' get blob or tree ''' path = self.repo.show(ref) if not path: return None if path['type'] == 'tree': path = Tree(self, path['entries']) elif path['type'] == 'blob': path = Blob(self, path) else: path = None return path def get_path(self, ref, path): _item = self.repo.show("%s:%s" % (ref, path)) if not _item: return None if _item['type'] == 'tree': item = Tree(self, _item['entries']) elif _item['type'] == 'blob': item = Blob(self, _item) else: item = None return item def get_last_update_timestamp(self): commit = self.get_last_commit('HEAD') if not commit: return 0 return int(commit.author_timestamp)