From 1dab92385f3855604be28794c3f4b84562ca63da Mon Sep 17 00:00:00 2001 From: justusbunsi <61625851+justusbunsi@users.noreply.github.com> Date: Mon, 12 Jul 2021 16:58:48 +0200 Subject: [PATCH] Fetch raw measures from SonarQube Signed-off-by: Steven Kriegler <61625851+justusbunsi@users.noreply.github.com> --- internal/{ => clients}/gitea_sdk/gitea_sdk.go | 2 - .../clients/sonarqube_sdk/sonarqube_sdk.go | 50 +++++++++++++++++++ internal/webhook_handler/main.go | 5 +- internal/webhook_handler/sonarqube.go | 39 +++++++++++++-- 4 files changed, 87 insertions(+), 9 deletions(-) rename internal/{ => clients}/gitea_sdk/gitea_sdk.go (87%) create mode 100644 internal/clients/sonarqube_sdk/sonarqube_sdk.go diff --git a/internal/gitea_sdk/gitea_sdk.go b/internal/clients/gitea_sdk/gitea_sdk.go similarity index 87% rename from internal/gitea_sdk/gitea_sdk.go rename to internal/clients/gitea_sdk/gitea_sdk.go index 0daac70..6d5ea01 100644 --- a/internal/gitea_sdk/gitea_sdk.go +++ b/internal/clients/gitea_sdk/gitea_sdk.go @@ -2,7 +2,6 @@ package gitea_sdk import ( "fmt" - "log" "gitea-sonarqube-pr-bot/internal/settings" "code.gitea.io/sdk/gitea" ) @@ -20,7 +19,6 @@ func (sdk *GiteaSdk) PostComment(repo settings.GiteaRepository, idx int, msg str Body: msg, } - log.Printf("Owner: %s | Repo: %s | Index: %d | Options: %s", repo.Owner, repo.Name, idx, opt) _, _, err := sdk.client.CreateIssueComment(repo.Owner, repo.Name, int64(idx), opt) return err diff --git a/internal/clients/sonarqube_sdk/sonarqube_sdk.go b/internal/clients/sonarqube_sdk/sonarqube_sdk.go new file mode 100644 index 0000000..5556a4b --- /dev/null +++ b/internal/clients/sonarqube_sdk/sonarqube_sdk.go @@ -0,0 +1,50 @@ +package sonarqube_sdk + +import ( + "net/http" + "fmt" + "log" + "encoding/base64" + "io" + + "gitea-sonarqube-pr-bot/internal/settings" +) + +type SonarQubeSdkInterface interface { + GetMeasures(string, string) (string, error) +} + +type SonarQubeSdk struct { + client *http.Client + baseUrl string + token string +} + +func (sdk *SonarQubeSdk) GetMeasures(project string, branch string) (string, error) { + url := fmt.Sprintf("%s/api/measures/component?additionalFields=metrics&metricKeys=bugs,vulnerabilities,new_security_hotspots,violations&component=%s&pullRequest=%s", sdk.baseUrl, project, branch) + log.Println(url) + req, err := http.NewRequest("GET", url, nil) + if err != nil { + panic(fmt.Errorf("Cannot initialize Request: %w", err)) + } + req.Header.Add("Authorization", sdk.basicAuth()) + resp, _ := sdk.client.Do(req) + + defer resp.Body.Close() + body, _ := io.ReadAll(resp.Body) + + return string(body), nil +} + +func (sdk *SonarQubeSdk) basicAuth() string { + auth := []byte(fmt.Sprintf("%s:", sdk.token)) + return fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString(auth)) +} + +func New() *SonarQubeSdk { + return &SonarQubeSdk{ + client: &http.Client{}, + baseUrl: settings.SonarQube.Url, + token: settings.SonarQube.Token.Value, + } +} diff --git a/internal/webhook_handler/main.go b/internal/webhook_handler/main.go index 9f09067..8a2b3b8 100644 --- a/internal/webhook_handler/main.go +++ b/internal/webhook_handler/main.go @@ -10,7 +10,8 @@ import ( "os/signal" "time" - sdk "gitea-sonarqube-pr-bot/internal/gitea_sdk" + giteaSdk "gitea-sonarqube-pr-bot/internal/clients/gitea_sdk" + sqSdk "gitea-sonarqube-pr-bot/internal/clients/sonarqube_sdk" "github.com/gorilla/mux" "github.com/urfave/cli/v2" ) @@ -23,7 +24,7 @@ func Serve(c *cli.Context) error { flag.Parse() r := mux.NewRouter() - r.HandleFunc("/hooks/sonarqube", NewSonarQubeWebhookHandler(sdk.New()).Handle).Methods("POST").Headers("X-SonarQube-Project", "") + r.HandleFunc("/hooks/sonarqube", NewSonarQubeWebhookHandler(giteaSdk.New(), sqSdk.New()).Handle).Methods("POST").Headers("X-SonarQube-Project", "") srv := &http.Server{ Addr: "0.0.0.0:8080", diff --git a/internal/webhook_handler/sonarqube.go b/internal/webhook_handler/sonarqube.go index 8996ed5..9aa1cb9 100644 --- a/internal/webhook_handler/sonarqube.go +++ b/internal/webhook_handler/sonarqube.go @@ -9,17 +9,42 @@ import ( "strings" "gitea-sonarqube-pr-bot/internal/settings" - sdk "gitea-sonarqube-pr-bot/internal/gitea_sdk" + giteaSdk "gitea-sonarqube-pr-bot/internal/clients/gitea_sdk" + sqSdk "gitea-sonarqube-pr-bot/internal/clients/sonarqube_sdk" webhook "gitea-sonarqube-pr-bot/internal/webhooks/sonarqube" ) type SonarQubeWebhookHandler struct { fetchDetails func(w *webhook.Webhook) - giteaSdk sdk.GiteaSdkInterface + giteaSdk giteaSdk.GiteaSdkInterface + sqSdk sqSdk.SonarQubeSdkInterface } func (h *SonarQubeWebhookHandler) composeGiteaComment(w *webhook.Webhook) string { - return fmt.Sprintf("Hello from pr-bot. SonarQube data for '%s' has been processed.", w.Project.Key) + a, _ := h.sqSdk.GetMeasures(w.Project.Key, w.Branch.Name) + + log.Println(a) + + status := ":white_check_mark:" + if w.QualityGate.Status != "OK" { + status = ":x:" + } + + measures := `| Metric | Current | +| -------- | -------- | +| Bugs | 123 | +| Code Smells | 1 | +| Vulnerabilities | 1 | +` + + msg := `**Quality Gate**: %s + +**Measures** + +%s + +See [SonarQube](https://example.com/sonarqube/dashboard?id=pr-bot&pullRequest=PR-1) for details.` + return fmt.Sprintf(msg, status, measures) } func (_ *SonarQubeWebhookHandler) inProjectsMapping(p []settings.Project, n string) (bool, int) { @@ -86,6 +111,10 @@ func fetchDetails(w *webhook.Webhook) { log.Printf("This method will load additional data from SonarQube based on PR %d", w.PRIndex) } -func NewSonarQubeWebhookHandler(giteaSdk sdk.GiteaSdkInterface) *SonarQubeWebhookHandler { - return &SonarQubeWebhookHandler{fetchDetails, giteaSdk} +func NewSonarQubeWebhookHandler(g giteaSdk.GiteaSdkInterface, sq sqSdk.SonarQubeSdkInterface) *SonarQubeWebhookHandler { + return &SonarQubeWebhookHandler{ + fetchDetails: fetchDetails, + giteaSdk: g, + sqSdk: sq, + } }