如何通过Pyral获取Rally中关联特定里程碑的用户故事与缺陷
使用Pyral获取Rally中关联特定里程碑的用户故事与缺陷
我之前也碰到过这个问题,Pyral的官方文档确实有点零散,不过咱们可以借助Rally的WSAPI语法,结合Pyral的查询能力来搞定这个需求。下面是具体的步骤和代码示例,亲测能用:
1. 先搞定Pyral的初始化连接
首先得确保你已经装了Pyral,没装的话先跑 pip install pyral。然后需要用你的Rally账号信息初始化连接——可以用API密钥(推荐,比用户名密码安全),也可以直接用账号密码:
from pyral import Rally # 填写你的Rally配置信息 rally_server = "rally1.rallydev.com" api_key = "你的API密钥" # 替换成自己的API密钥,或者用user="你的用户名", password="你的密码" target_workspace = "你的工作区名称" target_project = "你的项目名称" # 建立连接 rally = Rally(rally_server, apikey=api_key, workspace=target_workspace, project=target_project) # 可选:开启日志方便调试,日志会存在rally.log文件里 rally.enableLogging('rally.log')
2. 构造查询筛选关联特定里程碑的条目
Rally里的用户故事(UserStory)和缺陷(Defect)都有Milestones关联字段,我们可以通过这个字段来筛选和目标里程碑绑定的条目,有两种常用方法:
方法一:先拿到里程碑的Ref,再精准查询
这种方法更稳妥,尤其是当有重名里程碑的时候:
# 目标里程碑的名称 target_milestone = "你的里程碑名称" # 先查询获取目标里程碑的记录 milestone_results = rally.get('Milestone', fetch=True, query=f"Name = \"{target_milestone}\"") if milestone_results.resultCount == 0: print(f"没找到名为【{target_milestone}】的里程碑哦") else: milestone = milestone_results.next() milestone_ref = milestone.ref # 查询关联的用户故事,这里可以按需调整fetch的字段,比如加Description、Owner等 linked_stories = rally.get('UserStory', fetch='FormattedID,Name,State', query=f"Milestones contains {milestone_ref}") print("=== 关联的用户故事 ===") for story in linked_stories: print(f"{story.FormattedID}: {story.Name} | 状态: {story.State}") # 查询关联的缺陷,逻辑和用户故事一致 linked_defects = rally.get('Defect', fetch='FormattedID,Name,State', query=f"Milestones contains {milestone_ref}") print("\n=== 关联的缺陷 ===") for defect in linked_defects: print(f"{defect.FormattedID}: {defect.Name} | 状态: {defect.State}")
方法二:直接通过里程碑名称关联查询(一步到位)
如果你的里程碑名称唯一,也可以直接在查询里嵌套过滤,省掉一步:
target_milestone = "你的里程碑名称" # 查询关联的用户故事 linked_stories = rally.get( 'UserStory', fetch='FormattedID,Name,State', query=f"Milestones.Name = \"{target_milestone}\"" ) # 查询关联的缺陷 linked_defects = rally.get( 'Defect', fetch='FormattedID,Name,State', query=f"Milestones.Name = \"{target_milestone}\"" ) # 输出结果的代码和方法一一样,这里就不重复啦
3. 一些需要注意的小细节
- 权限问题:确保你的API密钥(或账号)有访问对应工作区、项目,以及里程碑、用户故事、缺陷数据的权限,不然会查不到结果。
- 特殊字符处理:如果里程碑名称里有引号、空格这类特殊字符,推荐用参数化查询更安全,避免转义出错:
query_params = {"milestone_name": target_milestone} linked_stories = rally.get('UserStory', fetch='...', query="Milestones.Name = %(milestone_name)s", params=query_params) - 大数据量分页:如果关联的条目很多,记得加
pagesize参数分页获取,比如rally.get(..., pagesize=200),避免一次性请求太多数据导致超时。 - 字段自定义:
fetch参数里可以加你需要的任何字段,比如Owner.Name、PlanEstimate等,按需调整就行。
内容的提问来源于stack exchange,提问作者Rajnish Tyagi
相关产品推荐
相关产品推荐

