如何获得在Gitlab中花费的总时间?

如何获得在Gitlab中花费的总时间?,gitlab,gitlab-ce,Gitlab,Gitlab Ce,是否有方法获取用户在时间跟踪/spend斜杠命令中花费的所有问题上的总时间? 使用API进行时间跟踪统计只获得少量数据: Gitlab CE9.1.4正如我所见,可以解析API v3中的注释并计算总数 比如说, https://gitlab.com/api/v3/projects/:id/issues/:issue_id/notes?private_token=your_token { id: 73113225, body: "added 1h of time spent at 2018

是否有方法获取用户在时间跟踪
/spend
斜杠命令中花费的所有问题上的总时间?

使用API进行时间跟踪统计只获得少量数据:


Gitlab CE9.1.4

正如我所见,可以解析API v3中的注释并计算总数

比如说,

https://gitlab.com/api/v3/projects/:id/issues/:issue_id/notes?private_token=your_token

{
  id: 73113225,
  body: "added 1h of time spent at 2018-05-15",
  attachment: null,
  author: {
    ...
    username: "mnvxxx",
  },
  ...
}
更多信息:

更新

目前,我已经创建了一个工具来计算每个贡献者花费的时间。我希望这会有帮助:


下面是一个非常简单的Python脚本,可用于API v4:

import requests

API_KEY = ""  # Enter your API key here
BASE_URL = "https://{{enter gitlab url here}}/api/v4/"

item_counter = 0
total_seconds = 0

for i in range(1, 57):  # manually set range of issues here. All issues doesn't work well.
    issue = requests.get(BASE_URL + 'projects/2/issues/' + str(i) + '/time_stats')
    total_seconds += issue.json()['total_time_spent']
    item_counter += 1

print("Hours on all issues: %.2f" % float((total_seconds / 60) / 60))
print("Total issues: " + str(item_counter))

我之所以发布到这个帖子,是因为这是谷歌上的第一个答案,而且实际上没有其他现成的解决方案

在@josh harkema提供的基础上,这个版本列出了分配给特定
用户名的所有
已关闭的
问题,这些问题在给定时间段内已更新(且未设置“付费”标签):

注意:您需要为
GITLAB\u报告\u用户名
GITLAB\u报告\u项目
、以及
GITLAB\u报告\u令牌
设置环境变量


我们用它来支付承包商的费用。希望这有帮助

谢谢,真的很有用。你知道一种方法来获得小时公关用户公关问题吗?因此,如果多个用户跟踪同一问题的时间,您可以提取pr user?看起来我们可以使用其全局搜索API搜索问题,以限制返回的问题:GitLab 13.12(2021年5月)中的新时间跟踪报告可能会引起兴趣:请参阅
import requests
import os

username = os.environ.get('GITLAB_REPORTING_USERNAME')
project_id = os.environ.get('GITLAB_REPORTING_PROJECTID') # in the top of your project page
access_token = os.environ.get('GITLAB_REPORTING_TOKEN')  # https://gitlab.com/profile/personal_access_tokens
base_url = "https://gitlab.com/api/v4"

updated_after = "2019-06-01T00:00:00.00Z"
updated_before = "2019-07-01T00:00:00.00Z"

item_counter = 0
total_seconds = 0

headers = { 'Private-Token': access_token }
url_template = "{base_url}/projects/{project_id}/issues?" \
               "state=closed&assignee_username={username}&updated_after={updated_after}&updated_before={updated_before}"
url = url_template.format(base_url=base_url, project_id=project_id, username=username,
                          updated_after=updated_after, updated_before=updated_before)

# call API
issues = requests.get(url, headers = headers)

total_seconds = 0
issues_to_pay = []
line_template = "id: {id}    closed: {closed_at}    time spent: {time}\ttitle: {title}\turl: {url}"
print("Issue statistics for {u} from {f} to {t}:\n".format(u=username,f=updated_after, t=updated_before))

for issue in issues.json():

    time_val = issue['time_stats']['human_total_time_spent']
    already_paid = u'paid' in issue['labels'] # you can put a label 'paid' to exclude an issue
    if already_paid:
        time_val = time_val + " *"
    else:
        # if the issue has been paid, already, don't add the time, and don't list as to be paid
        total_seconds += issue['time_stats']['total_time_spent']
        issues_to_pay.append(str(issue['id']))

    line = line_template.format(
        id=issue['id'],
        closed_at=issue['closed_at'],
        title=issue['title'],
        time=time_val,
        url=issue['web_url']
    )
    print(line)
print("")
print("Hours to pay on all issues: %.2f" % float((float(total_seconds) / 60) / 60))
print("")
print("* = issue has been paid for, already")
print("All issue to pay: {issues}".format(issues=",".join(issues_to_pay)))