我无法弄清楚如何在Rally中获取一个用户故事的所有字段。现在,我需要获取最后5次迭代,并计算每次迭代的完成点。
我设法通过指定type: iteration
来获取迭代,但不知道如何为这些迭代获取用户素材,以及如何仅指定完成。我应该使用与用户故事相关的TaskStatus
个任务吗?
我猜用户故事中有关于迭代的参考,但我不确定它是什么样的。 我没有发现这个manual非常简洁,我还应该使用其他任何文档吗?
编辑:
我在HierarchicalRequirement中看到,我有Iteration对象,其中包含以下字段:
_rallyAPIMajor: 2
_rallyAPIMinor: 0
_ref: https://rally1.rallydev.com/slm/webservice/v2.0/iteration/18831411089
_refObjectUUID: 8053fbd0-867c-4126-805c-18ccbc958a93
_refObjectName: Iteration 1
_type: Iteration
问题:我应该如何使用它?我想要获取5次迭代(由EndDate排序),然后为每次迭代获取所有任务。但我不确定如何为此指定查询(该任务属于迭代)。这个问题可能听起来很傻,但我仍然在拉力赛的黑暗中拍摄。 关于完成要求,我应该只获取TaskStatus已完成的那些吗?
答案 0 :(得分:2)
Web Services API文档中提供了Rally对象模型。
HierarchicalRequirement(用户素材)对象上有Iteration属性,它是对Iteration对象的引用,因此可以通过迭代查询故事。
您引用的手册特定于LookbackAPI,并且需要熟悉WS API文档中的对象模型。
这是一个LookbackAPI端点,用于查询计划进行三次迭代之一的用户故事,其中222,333,444是迭代的ObjectID:
"Iteration" : {$in: [222,333,444]}
并提取'FormattedID','ScheduleState','PlanEstimate'
个用户素材字段。
https://rally1.rallydev.com/analytics/v2.0/service/rally/workspace/111/artifact/snapshot/query.js?find={"Iteration" : {$in: [222,333,444]},"_TypeHierarchy":"HierarchicalRequirement","__At" : "current"}&fields=['FormattedID','ScheduleState','PlanEstimate'],hydrate=['ScheduleState']
这是一个类似的WS API端点:
https://rally1.rallydev.com/slm/webservice/v2.0/hierarchicalrequirement?workspace=https://rally1.rallydev.com/slm/webservice/v2.0/workspace/1119&query=(((Iteration.ObjectID = 222) OR (Iteration.ObjectID = 333)) OR (Iteration.ObjectID = 444))&fetch=FormattedID,ScheduleState,PlanEstimate&pagesize=200
两个查询返回相同的结果。
即使您想获取对象的当前状态,也可以使用Lookback API查询而不是WS API查询,如上面的示例中使用"__At" : "current"
,但Lookback API旨在提供历史数据。 WS API仅返回对象的当前状态,而Lookback API可以及时返回这些对象的快照。
rally-node 不内置支持Lookback API。
这是一个拉力赛节点示例,通过3次迭代查询故事:
var rally = require('rally'),
queryUtils = rally.util.query;
mySettings = {
apiKey: '_XYZ...',
server: 'https://rally1.rallydev.com', //this is the default
requestOptions: {
headers: {
'X-RallyIntegrationName': 'stories by iteration node.js program',
'X-RallyIntegrationVendor': 'My company'
'X-RallyIntegrationVersion': '1.0'
},
}
},
restApi = rally(mySettings);
var q = queryUtils.where('Iteration.ObjectID', '=', 222).or('Iteration.ObjectID', '=', 333).or('Iteration.ObjectID', '=', 444);
restApi.query({
type: 'hierarchicalrequirement'
fetch: ['FormattedID', 'Name', 'ScheduleState', 'PlanEstimate', 'Iteration'],
query: q,
scope: {
workspace: '/workspace/111',
},
}, function(error, result) {
if(error) {
console.log(error);
} else {
console.log(result.Results);
}
});