Class: GitlabQuality::TestTooling::GitlabClient::IssuesClient
- Inherits:
-
GitlabClient
- Object
- GitlabClient
- GitlabQuality::TestTooling::GitlabClient::IssuesClient
show all
- Defined in:
- lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb
Overview
Constant Summary
collapse
- REPORTER_ACCESS_LEVEL =
20
- DUO_WORKFLOW_TIMEOUT =
30
- DUO_WORKFLOW_DEFINITION =
'developer/v1'
Constants inherited
from GitlabClient
GitlabClient::MAX_RETRY_ATTEMPTS, GitlabClient::RETRY_BACK_OFF_DELAY
Instance Method Summary
collapse
-
#add_note_to_issue_discussion_as_thread(iid:, discussion_id:, note:) ⇒ Object
-
#assert_user_permission! ⇒ Object
-
#create_issue(title:, description:, labels:, issue_type: 'issue', assignee_id: nil, due_date: nil, confidential: false) ⇒ Object
-
#create_issue_discussion(iid:, note:) ⇒ Object
-
#create_issue_link(project:, issue_iid:, target_project_id:, target_issue_iid:, link_type: 'is_blocked_by') ⇒ Object
-
#create_issue_note(iid:, note:) ⇒ Object
-
#edit_issue(iid:, options: {}) ⇒ Object
-
#edit_issue_note(issue_iid:, note_id:, note:) ⇒ Object
-
#find_commit(project, sha) ⇒ Object
-
#find_commit_diff(project, sha) ⇒ Object
-
#find_commit_parent(project, sha) ⇒ Object
-
#find_deployments(project, environment:, status:, order_by: 'id', sort: 'desc') ⇒ Object
-
#find_issue_discussions(iid:) ⇒ Object
-
#find_issue_notes(iid:) ⇒ Object
-
#find_issues(iid: nil, options: {}, &select) ⇒ Object
-
#find_pipeline(project, pipeline_id) ⇒ Object
-
#find_user_id(username:) ⇒ Object
-
#get_note_award_emojis(issue_iid:, note_id:) ⇒ Object
-
#issue_links(project:, issue_iid:, options: {}) ⇒ Object
-
#related_merge_requests(iid:) ⇒ Object
-
#start_duo_workflow(goal:, workflow_definition: DUO_WORKFLOW_DEFINITION, project_id: project) ⇒ Object
Starts a GitLab Duo Agent Platform workflow (Flows API).
-
#upload_file(file_fullpath:) ⇒ Object
#handle_gitlab_client_exceptions, #ignore_gitlab_client_exceptions, #initialize, #post_exception_to_slack
Instance Method Details
#add_note_to_issue_discussion_as_thread(iid:, discussion_id:, note:) ⇒ Object
168
169
170
171
172
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 168
def add_note_to_issue_discussion_as_thread(iid:, discussion_id:, note:)
handle_gitlab_client_exceptions do
client.add_note_to_issue_discussion_as_thread(project, iid, discussion_id, body: note)
end
end
|
#assert_user_permission! ⇒ Object
49
50
51
52
53
54
55
56
57
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 49
def assert_user_permission!
handle_gitlab_client_exceptions do
member = client.team_member(project, user.id)
abort_not_permitted(member.access_level) if member.access_level < REPORTER_ACCESS_LEVEL
end
rescue Gitlab::Error::NotFound
abort_member_not_found(user)
end
|
#create_issue(title:, description:, labels:, issue_type: 'issue', assignee_id: nil, due_date: nil, confidential: false) ⇒ Object
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 89
def create_issue(title:, description:, labels:, issue_type: 'issue', assignee_id: nil, due_date: nil, confidential: false)
attrs = {
issue_type: issue_type,
description: description,
labels: labels,
assignee_id: assignee_id,
due_date: due_date,
confidential: confidential
}.compact
handle_gitlab_client_exceptions do
client.create_issue(project, title, attrs)
end
end
|
#create_issue_discussion(iid:, note:) ⇒ Object
162
163
164
165
166
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 162
def create_issue_discussion(iid:, note:)
handle_gitlab_client_exceptions do
client.create_issue_discussion(project, iid, body: note)
end
end
|
#create_issue_link(project:, issue_iid:, target_project_id:, target_issue_iid:, link_type: 'is_blocked_by') ⇒ Object
104
105
106
107
108
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 104
def create_issue_link(project:, issue_iid:, target_project_id:, target_issue_iid:, link_type: 'is_blocked_by')
handle_gitlab_client_exceptions do
client.create_issue_link(project, issue_iid, target_project_id, target_issue_iid, link_type)
end
end
|
#create_issue_note(iid:, note:) ⇒ Object
122
123
124
125
126
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 122
def create_issue_note(iid:, note:)
handle_gitlab_client_exceptions do
client.create_issue_note(project, iid, note)
end
end
|
#edit_issue(iid:, options: {}) ⇒ Object
116
117
118
119
120
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 116
def edit_issue(iid:, options: {})
handle_gitlab_client_exceptions do
client.edit_issue(project, iid, options)
end
end
|
#edit_issue_note(issue_iid:, note_id:, note:) ⇒ Object
150
151
152
153
154
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 150
def edit_issue_note(issue_iid:, note_id:, note:)
handle_gitlab_client_exceptions do
client.edit_issue_note(project, issue_iid, note_id, note)
end
end
|
#find_commit(project, sha) ⇒ Object
193
194
195
196
197
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 193
def find_commit(project, sha)
handle_gitlab_client_exceptions do
client.commit(project, sha)
end
end
|
#find_commit_diff(project, sha) ⇒ Object
208
209
210
211
212
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 208
def find_commit_diff(project, sha)
handle_gitlab_client_exceptions do
client.commit_diff(project, sha)
end
end
|
#find_commit_parent(project, sha) ⇒ Object
199
200
201
202
203
204
205
206
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 199
def find_commit_parent(project, sha)
handle_gitlab_client_exceptions do
client.commit(project, sha).parent_ids.last
end
end
|
#find_deployments(project, environment:, status:, order_by: 'id', sort: 'desc') ⇒ Object
214
215
216
217
218
219
220
221
222
223
224
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 214
def find_deployments(project, environment:, status:, order_by: 'id', sort: 'desc')
handle_gitlab_client_exceptions do
client.deployments(
project,
environment: environment,
status: status,
order_by: order_by,
sort: sort
)
end
end
|
#find_issue_discussions(iid:) ⇒ Object
83
84
85
86
87
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 83
def find_issue_discussions(iid:)
handle_gitlab_client_exceptions do
client.issue_discussions(project, iid, order_by: 'created_at', sort: 'asc').auto_paginate
end
end
|
#find_issue_notes(iid:) ⇒ Object
71
72
73
74
75
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 71
def find_issue_notes(iid:)
handle_gitlab_client_exceptions do
client.issue_notes(project, iid, order_by: 'created_at', sort: 'asc', activity_filter: 'only_comments').auto_paginate
end
end
|
#find_issues(iid: nil, options: {}, &select) ⇒ Object
59
60
61
62
63
64
65
66
67
68
69
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 59
def find_issues(iid: nil, options: {}, &select)
select ||= :itself
handle_gitlab_client_exceptions do
break [client.issue(project, iid)].select(&select) if iid
client.issues(project, options)
.auto_paginate
.select(&select)
end
end
|
#find_pipeline(project, pipeline_id) ⇒ Object
187
188
189
190
191
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 187
def find_pipeline(project, pipeline_id)
handle_gitlab_client_exceptions do
client.pipeline(project, pipeline_id)
end
end
|
#find_user_id(username:) ⇒ Object
174
175
176
177
178
179
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 174
def find_user_id(username:)
handle_gitlab_client_exceptions do
user = client.users(username: username)&.first
user['id'] unless user.nil?
end
end
|
#get_note_award_emojis(issue_iid:, note_id:) ⇒ Object
156
157
158
159
160
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 156
def get_note_award_emojis(issue_iid:, note_id:)
handle_gitlab_client_exceptions do
client.issue_note_award_emoji(project, issue_iid, note_id)
end
end
|
#issue_links(project:, issue_iid:, options: {}) ⇒ Object
110
111
112
113
114
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 110
def issue_links(project:, issue_iid:, options: {})
handle_gitlab_client_exceptions do
client.issue_links(project, issue_iid, options)
end
end
|
77
78
79
80
81
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 77
def related_merge_requests(iid:)
handle_gitlab_client_exceptions do
client.related_merge_requests(project, iid).auto_paginate
end
end
|
#start_duo_workflow(goal:, workflow_definition: DUO_WORKFLOW_DEFINITION, project_id: project) ⇒ Object
Starts a GitLab Duo Agent Platform workflow (Flows API). The agent investigates and posts its own analysis back, so no follow-up call is needed.
This is a best-effort helper: it deliberately does NOT use handle_gitlab_client_exceptions (which would retry with long backoffs and post failures to Slack) and uses a short timeout so a slow or unavailable Duo endpoint can never stall the reporting job. The caller is expected to rescue any error.
project_id accepts either a numeric ID or a namespace path (e.g. ‘gitlab-org/quality/…’), matching the GitLab API’s project-identifier convention; the path form is verified working.
138
139
140
141
142
143
144
145
146
147
148
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 138
def start_duo_workflow(goal:, workflow_definition: DUO_WORKFLOW_DEFINITION, project_id: project)
client.post('/ai/duo_workflows/workflows',
timeout: DUO_WORKFLOW_TIMEOUT,
headers: { 'Content-Type' => 'application/json' },
body: {
project_id: project_id,
goal: goal,
workflow_definition: workflow_definition,
start_workflow: true
}.to_json)
end
|
#upload_file(file_fullpath:) ⇒ Object
181
182
183
184
185
|
# File 'lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb', line 181
def upload_file(file_fullpath:)
ignore_gitlab_client_exceptions do
client.upload_file(project, file_fullpath)
end
end
|