月末总结中每月需要从Jira平台中统计各个项目的新增、关闭以及遗留bug数,人工去对各个项目进行条件筛选统计,耗时较长且容易出错,故计划做一个自动去筛选获取Jira平台各个项目每个月的数据
Jira请求
首先找到了Jira的API文档:https://docs.atlassian.com/jira/REST/latest/#api/2/search-search,其中的 api/2/search 接口为资源搜索API,包括POST和GET,使用JQL搜索问题且排序jql参数是一个完整的jql表达式,并包括ORDER BY子句。
试着使用http://jira.cvte.com/rest/api/2/search?jql=project = REM AND resolution = Unresolved ORDER BY priority DESC, updated DESC
在网页端获取到返回的值,结果如下:
{"expand":"schema,names","startAt":0,"maxResults":50,"total":159,"issues":
[{"expand":"operations,editmeta,changelog,transitions,renderedFields",
"id":"27451","self":"http://.../rest/api/2/issue/27451","key":"REM-191","fields":
{"fixVersions":[],"resolution":null,"customfield_10510":null,"customfield_10500":null,
"customfield_10501":null,"customfield_10502":null,"customfield_10503":null,"customfield_10504":null,
"customfield_10505":null,"customfield_10506":null,"customfield_10507":null,"customfield_10508":null,
"customfield_10509":null,"lastViewed":"2016-03-12T08:50:42.732+0800","customfield_10460":null,
"customfield_10461":null,"priority":
......
在返回值中,只需要”total”:159 这个值,用JAVA去解析获取到的json格式的值:
import net.sf.json.JSONObject;
public class JsonDemo {
public static void main(String[] args) {
String str = "{\"expand\":\"schema,names\",\"startAt\":0,\"maxResults\":50,\"total\":159}";
JSONObject jsonObject = JSONObject.fromObject(str);
int total = jsonObject.getInt("total");
System.out.println("Get the total value :"+total);
}
}
运行后得到的结果为:
Get the total value :137
但是上面的请求是由于该网页已经记录我的Jira账号的登录信息,若没的话,返回的值为:
{"errorMessages":["'project' 字段中没有 'REM'","字段 'resolution'
不存在或这个字段不允许匿名用户查看。",
"无法对字段 'priority'进行排序"],"errors":{}}
故我们现在须先模拟登录Jira平台,先使用Fiddler清空浏览器缓存然后抓包看看登录请求

请求中Cookie包含的变量值:atlassian.xsrf.token、JSESSIONID、ca_uuid、pgv_pvi、pgv_si
尝试着使用Jmeter等工具模拟发包,返回值中无法获取Cookie中pgv_pvi、pgv_si这两个值。
现使用nodejs模拟Jira登录:
在使用前,先下载需要使用的module,如下面需要使用的’node-rest-client’和’mysql’模块,可以在http://npm.taobao.org/ 淘宝 NPM 镜像中下载,也可以直接cmd输入npm install node-rest-client
下载node-rest-client等模块
var Client = require('node-rest-client').Client;
client = new Client();
var loginArgs = {
data: {
"username": "******",
"password": "******" },
headers: {
"Content-Type": "application/json"
}
};
client.post("http://.../rest/auth/1/session", loginArgs, function (data, response) {
if (response.statusCode == 200) {
console.log('succesfully logged in, session:', data.session);
var session = data.session;
var searchArgs = {
headers: {
cookie: session.name + '=' + session.value,
"Content-Type": "application/json"
},
data: {
xxxxxx
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
将Cookie的值传给search请求,在data中提供添加JIRA搜索附加数据,加入JQL JIRA查询语句,可以进行JQL搜索。
在Data中添加:
jql: "project = REM AND resolution = Unresolved ORDER BY priority DESC, updated DESC"
传递头信息(包括cookie)和附加的查询JQL模块,请求返回搜索结果:
client.post("http://.../rest/api/2/search", searchArgs, function (searchResult, response) {
console.log('status code:', response.statusCode);
console.log('searchResult:', searchResult);
});
在查询的结果searchResult中,只需要获取total(即bug数)的值,故提取total的值:
var bugsnum = searchResult.total;
现需要封装查询函数,将bugsnum的值return给JiraRequest函数:
function JiraRequest(){
client.post("http://.../rest/auth/1/session",loginArgs, function (data, response) {
var bugsnum = searchResult.total;
return bugsnum
}
}
此时调用JiraRequest:
var requestResult = JiraRequest();
得到requestResult的值为undefined
这里需要用到一个回调函数:
function JiraRequest(callback) {
client.post("http://.../rest/api/2/search", searchArgs, function (searchResult, response) {
var num = searchResult.total;
callback(num);
});
}
此时调用JiraRequest函数
var callbackFn = function (num) {
console.log('num:'+num);
}
JiraRequest(callbackFn);
也可以这样调用
JiraRequest(function (num) {
console.log(num);
});