是否存在可从Bitbucket拉取指定信息的Python代码?
Python拉取Bitbucket指定数据实现方案
可以直接用成熟的Python库对接Bitbucket接口拉取你需要的所有数据,不需要从零手写HTTP请求逻辑,具体实现如下。
依赖安装
执行以下命令安装对接用的开源库:pip install atlassian-python-api
可覆盖的获取字段
- 图纸编号:通过匹配Commit备注、PR标题/描述中符合你们命名规则的编号提取,如果编号存在仓库自定义属性中,可在拿到基础数据后追加字段拉取
- 全量Commit记录:包含Commit哈希、提交备注、提交人、提交时间、关联变更内容
- 全量Pull Request记录:包含PR编号、标题、描述、状态、创建/合入时间、关联Commit列表
- 创建人信息:包含账号ID、显示名称、公开邮箱(权限范围内可获取)
可直接运行的参考代码
import re import time from atlassian import Bitbucket # -------------------------- 配置项 按需修改 -------------------------- # Bitbucket Cloud 初始化配置 bitbucket = Bitbucket( url='https://api.bitbucket.org/', username='你的Bitbucket登录用户名', password='你的Bitbucket App专用密码(在账号安全设置中生成,不要用日常登录密码)' ) WORKSPACE = '目标仓库所属工作空间名' REPO_NAME = '目标仓库名' # 图纸编号匹配正则,按你们实际的编号规则修改,示例为匹配DRAW-开头+层级数字的编号格式 DRAWING_NO_PATTERN = re.compile(r'DRAW-\d{3,}-\d{2,}') # 分页拉取的单页大小,不建议调太大避免触发接口限制 PAGE_LIMIT = 50 # 拉取间隔 单位秒,数据量大的时候建议保留避免限流 REQUEST_INTERVAL = 1 # -------------------------------------------------------------------- def get_all_commits(): """分页拉取仓库全量Commit记录""" all_commits = [] page_start = 0 while True: resp = bitbucket.get_commits( workspace=WORKSPACE, repo_slug=REPO_NAME, start=page_start, limit=PAGE_LIMIT ) commit_list = resp.get('values', []) if not commit_list: break for commit in commit_list: # 从提交备注中提取关联的图纸编号 match_draw_nos = DRAWING_NO_PATTERN.findall(commit.get('message', '')) # 提取提交人信息 author_info = commit.get('author', {}) commit_data = { 'commit_hash': commit['hash'], 'commit_msg': commit.get('message', ''), 'author_name': author_info['user']['display_name'] if author_info.get('user') else author_info.get('raw', '未知提交人'), 'author_account': author_info['user']['nickname'] if author_info.get('user') else '', 'create_time': commit['date'], 'related_drawing_nos': list(set(match_draw_nos)) } all_commits.append(commit_data) page_start += PAGE_LIMIT time.sleep(REQUEST_INTERVAL) if len(commit_list) < PAGE_LIMIT: break return all_commits def get_all_pull_requests(): """分页拉取仓库全量状态的PR记录""" all_prs = [] page_start = 0 while True: resp = bitbucket.get_pull_requests( workspace=WORKSPACE, repo_slug=REPO_NAME, start=page_start, limit=PAGE_LIMIT, state='' # 传空值拉取所有状态的PR,可按需指定为OPEN/MERGED/DECLINED ) pr_list = resp.get('values', []) if not pr_list: break for pr in pr_list: # 从PR标题和描述中提取关联图纸编号 pr_content = pr.get('title', '') + '\n' + pr.get('description', '') match_draw_nos = DRAWING_NO_PATTERN.findall(pr_content) # 拉取当前PR关联的所有Commit pr_commits_resp = bitbucket.get_pull_request_commits( workspace=WORKSPACE, repo_slug=REPO_NAME, pull_request_id=pr['id'] ) pr_data = { 'pr_id': pr['id'], 'pr_title': pr.get('title', ''), 'pr_desc': pr.get('description', ''), 'creator_name': pr['author']['display_name'], 'creator_account': pr['author']['nickname'], 'create_time': pr['created_on'], 'pr_status': pr['state'], 'related_drawing_nos': list(set(match_draw_nos)), 'related_commit_hashs': [c['hash'] for c in pr_commits_resp.get('values', [])] } all_prs.append(pr_data) page_start += PAGE_LIMIT time.sleep(REQUEST_INTERVAL) if len(pr_list) < PAGE_LIMIT: break return all_prs if __name__ == '__main__': total_commits = get_all_commits() total_prs = get_all_pull_requests() # 后续可自行添加存储到CSV/数据库的逻辑 print(f"拉取完成,共获取{len(total_commits)}条Commit记录,{len(total_prs)}条PR记录")
适配说明
- 如果使用公司自建的Bitbucket Server/Data Center版本,初始化客户端时将
url参数替换为自建站点的访问地址,认证信息替换为个人访问令牌即可,核心拉取逻辑基本一致,仅少量接口参数名需要根据库的提示调整 - 代码里的图纸编号匹配正则需要根据你们实际的编号规则修改,比如编号是
TZ-2024-XXXX格式,就把正则改成对应匹配规则 - 所用账号需要拥有目标仓库的读取权限,否则会拉取失败或者拿不全用户相关字段
内容的提问来源于stack exchange,提问作者davidk3698
相关产品推荐
相关产品推荐

