Как получить все журналы работы в течение определенного периода времени с помощью JRE REST API?
Я пишу приложение с использованием PHP и Jira REST API, который должен генерировать отчет за определенный период времени с накоплением часов, потраченных человеком на конкретный проект.
Для этого мне понадобится вызов, который даст что-то вроде этого.
например: For the period 01/01/2012 - 31/01/2012 give me the worklogs for project X.
Метод, который я нашел до сих пор, состоял в том, чтобы получить обновленные проблемы после даты начала и снова фильтровать рабочие журналы для каждой проблемы за период.
Есть ли лучшая альтернатива?
Ответы
Ответ 1
Если вы не можете найти функцию "из коробки", которая делает то, о чем вы просили, я могу подумать о трех других решениях, кроме ваших:
- Запросить DB напрямую, чтобы вы могли получать рабочие журналы с помощью одного запроса. Обязательно не вставлять/удалять/обновлять БД напрямую, а только запрашивать его.
- Используйте что-то вроде Jira Scripting Suite или Плагин поведения для добавления скриптов, которые будут записывать рабочие журналы где-нибудь на диске. Затем используйте другое приложение, чтобы прочитать записанную информацию с диска и отобразить ее пользователям.
- Используйте Tempo plugin
Ответ 2
Как говорили многие, нет прямого пути. Однако, если вы значительно сократите пространство поиска, это не так уж плохо. Следующий код PHP работает довольно быстро в моей настройке, но, конечно, ваш пробег может отличаться:
<?php
$server = 'jira.myserver.com';
$fromDate = '2012-01-01';
$toDate = '2012-01-31';
$project = 'X';
$assignee = 'bob';
$username = 'my_name';
$password = 'my_password';
$curl = curl_init();
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
# Give me up to 1000 search results with the Key, where
# assignee = $assignee AND project = $project
# AND created < $toDate AND updated > $fromDate
# AND timespent > 0
curl_setopt($curl, CURLOPT_URL,
"https://$server/rest/api/2/search?startIndex=0&jql=".
"assignee+%3D+$assignee+and+project+%3D+$project+".
"and+created+%3C+$toDate+and+updated+%3E+$fromDate+".
"and+timespent+%3E+0&fields=key&maxResults=1000");
$issues = json_decode(curl_exec($curl), true);
foreach ($issues['issues'] as $issue) {
$key = $issue['key'];
# for each issue in result, give me the full worklog for that issue
curl_setopt($curl, CURLOPT_URL,
"https://$server/rest/api/2/issue/$key/worklog");
$worklog = json_decode(curl_exec($curl), true);
foreach ($worklog['worklogs'] as $entry) {
$shortDate = substr($entry['started'], 0, 10);
# keep a worklog entry on $key item,
# iff within the search time period
if ($shortDate >= $fromDate && $shortDate <= $toDate)
$periodLog[$key][] = $entry;
}
}
# Show Result:
# echo json_encode($periodLog);
# var_dump($periodLog);
?>
Ответ 3
Стоит отметить, что запросы Jira имеют параметр expand
, который позволяет вам указать, какие поля вы хотите привязать к вашему поиску:
// Javascript
$jql = 'project = MyProject and updated > 2016-02-01 and updated < 2016-03-01';
// note this definition
$fields = 'key,summary,worklog';
$query = "https://{server}/rest/api/2/search?maxResults=100&fields={fields}&jql={jql}"
.replace(/{server}/g,$server)
.replace(/{jql}/g,encodeURIComponent($jql))
.replace(/{fields}/g,$fields)
;
Возвращенный возвращаемый объект JSON будет списком билетов, и каждый билет будет содержать набор рабочих элементов (потенциально нулевую длину).
Javascript, а не PHP, но та же идея:
function getJql(params){
$.ajax({
url: getJiraUrl()
+ "/rest/api/2/search?startIndex=0&fields=worklog,assignee,status,key,summary&maxResults=1000&jql="
+ encodeURI(params.jql),
success: function (resp) {
resp.issues.forEach(function(issue) {
issue.fields.worklog.worklogs.forEach(function(work){
alert(JSON.stringify(work));
db.AddWork(work);
});
});
}
});
}
опубликовано в GitLab: https://gitlab.com/jefferey-cave/ProductivityBlockers/blob/5c4cb33276e8403443d4d766fc94ab2f92292da6/plugin-data-jira.js
Ответ 4
Подход, который я лично использовал для одного и того же приложения, состоит в том, чтобы получать ВСЕ записи из JIRA на еженедельной основе, а затем генерировать отчеты из базы данных, в которой они хранятся.
Таким образом, вы также получите данные, если произойдет серьезная авария JIRA. Наша компания столкнулась с такой проблемой с экземпляром OnDemand, когда RAID-массив сгорел, и большая часть данных была невосстановимой.