You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:27:05