如何使用Rally的Web服务API跟踪迭代进度

我正在编写一个自定义应用程序来跟踪每天的迭代进度。 在拉力赛中是否有一种内置方式来获取特定date的“接受”状态的用户故事数量,以及点数(或者是否必须获取所有用户故事并parsing其修订历史logging)?

WS API中有IterationCumulativeFlowData对象,当“数据集合”在“工作空间设置”屏幕中指定的工作日上运行时,该对象在“工作空间时区”的午夜填充。

数据存储在迭代的每一天以及相应的状态。 迭代的第1天有一个CumulativeFlowData对象,用于处于Defined状态的所有内容,处于In-Progress状态的所有内容的Release 1的第1天等。
CumulativeFlowData对象还存储CardEstimateTotal,它是每个状态下卡的估计总和。

下面是一个用rally-node编写的应用程序示例,该应用程序在迭代的最后一天返回特定状态(Accepted)的迭代数据。

在这个例子中,最后结果的创builddate是2013-08-27T06:00:00.000Z,而有关迭代的结束date是2013-08-27 11:59:59 PM America / Denver(2013 – 08-28T05:59:59.000Z),所以我不得不操纵一个date,以使这个查询条件返回迭代的最后一天的数据:

query = query.and('CreationDate', '>', endDateMinusOneDay); 

这里是这个例子的完整的js文件:

 var rally = require('rally'), queryUtils = rally.util.query, restApi = rally({ user: 'user@co.com', pass: 'secret', apiVersion: 'v2.0', server: 'https://rally1.rallydev.com', requestOptions: { headers: { 'X-RallyIntegrationName': 'My cool node.js program', 'X-RallyIntegrationVendor': 'My company', 'X-RallyIntegrationVersion': '1.0' }, } }); function findIteration() { return restApi.query({ type: 'Iteration', start: 1, pageSize: 2, limit: 10, fetch: ['ObjectID', 'EndDate'], scope: { project: '/project/12352608219', up: false, down: false }, query: queryUtils.where('Name', '=', 'i777') }); } function queryIterationData(result) { var endDate = result.Results[0].EndDate, oid = result.Results[0].ObjectID; console.log('endDate',endDate); var date1 = new Date(endDate); var ms = date1.getTime() - 86400000; //86400000 is the number of milliseconds in a day var date2 = new Date(ms); var endDateMinusOneDay = date2.toISOString(); console.log('date2 ISO', date2.toISOString()); var query = queryUtils.where('IterationObjectID', '=',oid ); query = query.and('CardState', '=', 'Accepted'); query = query.and('CreationDate', '>', endDateMinusOneDay); return restApi.query({ type: 'IterationCumulativeFlowData', fetch: ['CardCount', 'CardEstimateTotal', 'CardState', 'CardState', 'CreationDate'], query: query, }); } function onSuccess(result) { console.log('Success!', result); } function onError(errors) { console.log('Failure!', errors); } findIteration() .then(queryIterationData) .then(onSuccess) .fail(onError); 

它返回:

在这里输入图像描述