Class: GitlabQuality::TestTooling::GitlabClient::IssuesClient

Inherits:
GitlabClient
  • Object
show all
Defined in:
lib/gitlab_quality/test_tooling/gitlab_client/issues_client.rb

Overview

The GitLab client is used for API access: github.com/NARKOZ/gitlab

Direct Known Subclasses

IssuesDryClient

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

Methods inherited from GitlabClient

#handle_gitlab_client_exceptions, #ignore_gitlab_client_exceptions, #initialize, #post_exception_to_slack

Constructor Details

This class inherits a constructor from GitlabQuality::TestTooling::GitlabClient::GitlabClient

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


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
    # In a merged results commit, the first parent is the one from
    # the default branch, and the second parent is from the branch
    # itself (more likely to have caused the issue)
    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


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