有没有办法获得用户在时间跟踪中花费在所有问题上的总时间
/spend
slash命令?
使用 API 进行时间跟踪统计仅获取少量数据:https://docs.gitlab.com/ce/api/issues.html#get-time-tracking-stats
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",
},
...
}
更多信息: https://docs.gitlab.com/ee/api/notes.html
更新
目前我已经创建了用于计算每个贡献者所花费时间的工具。希望对您有所帮助:
这是一个非常简单的 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))
我发布到这个帖子是因为这是 Google 上出现的第一个答案,并且实际上没有任何其他现成的解决方案可供找到。
建立在 @josh-harkema 提供的基础上,这个版本列出了分配给特定
closed
且在给定时间段内已更新的所有 username
问题(并且没有标签 '付费套餐):
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)))
注意:您需要为
GITLAB_REPORTING_USERNAME
、GITLAB_REPORTING_PROJECTID
以及GITLAB_REPORTING_TOKEN
设置环境变量。
我们用它来支付承包商费用。希望这有帮助!
我自己也在寻找同样的工具,经过更多搜索,我发现了这个优秀的 CLI 工具,名为 gitlab-time-tracker。它生成全面的跟踪时间报告,您可以通过多个选项进行自定义,并可以打印它们甚至作为 PDF !
为了保持此答案与OP的问题相关,您可以使用以下命令打印(在终端中)用户花费的总时间**:
gtt report "namespace/project" --user username --closed --from="2017-03-01" --to="2017-04-01"
** 这假设您已经安装了此工具 (gtt) 并在其配置文件中设置了 Gitlab PAT(激活了“api”范围)。
您必须使用 Gitlab Commits API 和 GraphQL API 来实现它。下面是一些为简洁起见而缩短的代码。
您需要指定 Gitlab 实例标志和您的个人令牌。
假设您有一个用于捕获 Gitlab 实例中所有用户的函数,名为“GetUsers”:
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
"github.com/sirupsen/logrus"
"github.com/xanzy/go-gitlab"
"gopkg.in/alecthomas/kingpin.v2"
)
var (
address = kingpin.Flag("address", "The Gitlab URL to use").Required().String()
token = kingpin.Flag("token", "Project token").String()
)
func main () {
timeTracker()
}
func timeTracker(git *gitlab.Client) {
names := GetUsers(git)
for _, name := range names {
jsonData := map[string]interface{}{
"query": `
query($user: String!) {
timelogs(username: $user ) {
edges {
node {
id
user {
id
username
}
timeSpent
issue{
labels{
nodes{
title
}
}
}
}
}
}
}
`, "variables": fmt.Sprintf(`{"user":"%s"}`, name),
}
jsonValue, _ := json.Marshal(jsonData)
request, err := http.NewRequest("POST", "https://" +*address + "/api/graphql", bytes.NewBuffer(jsonValue))
if err != nil {
logrus.Error(err)
}
request.Header.Set("Authorization", "Bearer "+*token)
request.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: time.Second * 10}
response, err := client.Do(request)
response.Body.Close()
if err != nil {
fmt.Printf("The HTTP request failed with error %s\n", err)
}
logrus.Print(ioutil.ReadAll(response.Body))
结果(使用 JSONDecoder 解码时):
INFO[0000] User: user1, Time spent: 300 (s)
INFO[0000] User: user2, Time spent: 120 (s)
然后,您可以获取这些数据并将其解码为结构(为了理智起见,我会将发布请求复制并粘贴到自动生成器),然后用它做您想做的事情。或者,如果您对更精细的内容更感兴趣,请更改 POST 请求以按项目捕获用户。
来源:https://docs.gitlab.com/ee/api/graphql/getting_started.html
这是我们团队创建的另一种用于显示 gitlab 花费时间报告的工具https://github.com/SCD-company/gitlab-times