12

私は PHP と Jira REST API を使用してアプリケーションを作成しています。これは、特定のプロジェクトに人が費やした時間の累積で、特定の期間のレポートを生成するために必要です。

このためには、このようなものを与える呼び出しが必要になります。

例えば:For the period 01/01/2012 - 31/01/2012 give me the worklogs for project X.

これまでに見つけた方法は、開始日以降に更新された問題を取得し、各問題の作業ログを期間で再度フィルター処理することでした。

より良い代替手段はありますか?

4

4 に答える 4

4

多くの人が言っているように、直接的な方法はありません。しかし、効率的に探索空間を絞り込めば、それほど悪くはありません。次の 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);
?>
于 2015-01-08T19:35:45.547 に答える
3

あなたが要求したことを実行するすぐに使える関数が見つからない場合は、あなた以外の 3 つの解決策を考えることができます。

  1. DB に直接クエリを実行して、1 つのクエリで作業ログを取得できるようにします。DB を直接挿入/削除/更新しないでください。クエリのみを実行してください。
  2. Jira Scripting SuiteBehaviors Pluginなどを使用して、作業ログをディスクのどこかに書き込むスクリプトを追加します。次に、別のアプリを使用して、書き込まれた情報をディスクから読み取り、ユーザーに表示します。
  3. テンポプラグインを使用する
于 2012-10-14T11:11:13.257 に答える
2

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 オブジェクトはチケットのリストであり、各チケットには作業項目のコレクションが添付されます (長さゼロの可能性があります)。

PHP ではなく Javascript を使用しますが、考え方は同じです。

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

于 2016-03-16T00:20:05.393 に答える
0

同じ種類のアプリケーションで私が個人的に使用したアプローチは、毎週JIRAからすべてのレコードを取得し、それらが格納されているデータベースからレポートを生成することです。

このようにして、JIRAのメジャークラッシュが発生した場合にもデータを利用できるようになります。当社は、RAIDアレイが焼失し、ほとんどのデータが回復不能になったときに、OnDemandインスタンスでこのような問題を経験しました。

于 2012-10-09T13:30:18.857 に答える