github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/sonar/taskService.go (about) 1 package sonar 2 3 import ( 4 "net/http" 5 "time" 6 7 sonargo "github.com/magicsong/sonargo/sonar" 8 9 "github.com/SAP/jenkins-library/pkg/log" 10 ) 11 12 // EndpointCeTask API endpoint for https://sonarcloud.io/web_api/api/ce/task 13 const EndpointCeTask = "ce/task" 14 15 const ( 16 taskStatusSuccess = "SUCCESS" 17 taskStatusFailed = "FAILED" 18 taskStatusCanceled = "CANCELED" 19 taskStatusPending = "PENDING" 20 taskStatusProcessing = "IN_PROGRESS" 21 ) 22 23 // TaskService ... 24 type TaskService struct { 25 TaskID string 26 PollInterval time.Duration 27 apiClient *Requester 28 } 29 30 // GetTask ... 31 func (service *TaskService) GetTask(options *sonargo.CeTaskOption) (*sonargo.CeTaskObject, *http.Response, error) { 32 request, err := service.apiClient.create("GET", EndpointCeTask, options) 33 if err != nil { 34 return nil, nil, err 35 } 36 // use custom HTTP client to send request 37 response, err := service.apiClient.send(request) 38 if response == nil && err != nil { 39 return nil, nil, err 40 } 41 // reuse response verrification from sonargo 42 err = sonargo.CheckResponse(response) 43 if err != nil { 44 return nil, response, err 45 } 46 // decode JSON response 47 result := new(sonargo.CeTaskObject) 48 err = service.apiClient.decode(response, result) 49 if err != nil { 50 return nil, response, err 51 } 52 return result, response, nil 53 } 54 55 // HasFinished ... 56 func (service *TaskService) HasFinished() (bool, error) { 57 options := &sonargo.CeTaskOption{ 58 Id: service.TaskID, 59 // AdditionalFields: "warnings", 60 } 61 result, _, err := service.GetTask(options) 62 if err != nil { 63 return false, err 64 } 65 if result.Task.Status == taskStatusPending || result.Task.Status == taskStatusProcessing { 66 return false, nil 67 } 68 // for _, warning := range result.Task.Warnings { 69 // log.Entry().Warnf("Warnings during analysis: %s", warning) 70 // } 71 return true, nil 72 } 73 74 // WaitForTask .. 75 func (service *TaskService) WaitForTask() error { 76 log.Entry().Info("waiting for SonarQube task to complete..") 77 finished, err := service.HasFinished() 78 if err != nil { 79 return err 80 } 81 for !finished { 82 time.Sleep(service.PollInterval) 83 finished, err = service.HasFinished() 84 if err != nil { 85 return err 86 } 87 } 88 log.Entry().Info("finished.") 89 return nil 90 } 91 92 // NewTaskService returns a new instance of a service for the task API endpoint. 93 func NewTaskService(host, token, task string, client Sender) *TaskService { 94 return &TaskService{ 95 TaskID: task, 96 PollInterval: 15 * time.Second, 97 apiClient: NewAPIClient(host, token, client), 98 } 99 }