使用Rally API通过迭代获取用户素材

时间:2014-05-19 13:18:00

标签: node.js rally

我无法弄清楚如何在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已完成的那些吗?

1 个答案:

答案 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);
    }
});