# frozen_string_literal: truerequire'gitlab'moduleGitlab# Monkey patch the Gitlab client to use the correct API path and add required methodsclassClientdefteam_member(project,id)get("/projects/#{url_encode(project)}/members/all/#{id}")enddefissue_discussions(project,issue_id,options={})get("/projects/#{url_encode(project)}/issues/#{issue_id}/discussions",query: options)enddefadd_note_to_issue_discussion_as_thread(project,issue_id,discussion_id,options={})post("/projects/#{url_encode(project)}/issues/#{issue_id}/discussions/#{discussion_id}/notes",query: options)endendmoduleQAmoduleReport# The GitLab client is used for API access: https://github.com/NARKOZ/gitlabclassGitlabIssueClientMAINTAINER_ACCESS_LEVEL=40RETRY_BACK_OFF_DELAY=60MAX_RETRY_ATTEMPTS=3definitialize(token:,project:)@token=token@project=project@retry_backoff=0configure_gitlab_clientenddefassert_user_permission!handle_gitlab_client_exceptionsdouser=Gitlab.usermember=Gitlab.team_member(project,user.id)abort_not_permittedifmember.access_level<MAINTAINER_ACCESS_LEVELendrescueGitlab::Error::NotFoundabort_not_permittedenddeffind_issues(iid: nil,options: {},&select)select||=:itselfhandle_gitlab_client_exceptionsdoreturn[Gitlab.issue(project,iid)]ifiidGitlab.issues(project,options).auto_paginate.select(&select)endenddeffind_issue_discussions(iid:)handle_gitlab_client_exceptionsdoGitlab.issue_discussions(project,iid,order_by: 'created_at',sort: 'asc').auto_paginateendenddefcreate_issue(title:,description:,labels:)attrs={description: description,labels: labels}handle_gitlab_client_exceptionsdoGitlab.create_issue(project,title,attrs)endenddefedit_issue(iid:,options: {})handle_gitlab_client_exceptionsdoGitlab.edit_issue(project,iid,options)endenddefcreate_issue_note(iid:,note:)handle_gitlab_client_exceptionsdoGitlab.create_issue_note(project,iid,note)endenddefadd_note_to_issue_discussion_as_thread(iid:,discussion_id:,body:)handle_gitlab_client_exceptionsdoGitlab.add_note_to_issue_discussion_as_thread(project,iid,discussion_id,body: body)endenddefhandle_gitlab_client_exceptionsyieldrescueGitlab::Error::NotFound# This error could be raised in assert_user_permission!# If so, we want it to terminate at that pointraiserescueSystemCallError,OpenSSL::SSL::SSLError,Net::OpenTimeout,Net::ReadTimeout,Gitlab::Error::InternalServerError,Gitlab::Error::Parsing=>e@retry_backoff+=RETRY_BACK_OFF_DELAYraiseif@retry_backoff>RETRY_BACK_OFF_DELAY*MAX_RETRY_ATTEMPTSwarn_exception(e)warn("Sleeping for #{@retry_backoff} seconds before retrying...")sleep@retry_backoffretryrescueStandardError=>epipeline=QA::Runtime::Env.pipeline_from_project_namechannel=pipeline=="canary"?"qa-production":"qa-#{pipeline}"error_msg=warn_exception(e)returnunlessQA::Runtime::Env.ci_commit_ref_name==QA::Runtime::Env.default_branchslack_options={channel: channel,icon_emoji: ':ci_failing:',message: <<~MSG
An unexpected error occurred while reporting test results in issues.
The error occurred in job: #{QA::Runtime::Env.ci_job_url}
`#{error_msg}`
MSG}puts"Posting Slack message to channel: #{channel}"Gitlab::QA::Slack::PostToSlack.new(**slack_options).invoke!endprivateattr_reader:token,:projectdefconfigure_gitlab_clientGitlab.configuredo|config|config.endpoint=Runtime::Env.gitlab_api_baseconfig.private_token=tokenendenddefabort_not_permittedabort"You must have at least Maintainer access to the project to use this feature."enddefwarn_exception(error)error_msg="#{error.class.name}#{error.message}"warn(error_msg)error_msgendendendendend