* add devops client interface Signed-off-by: runzexia <runzexia@yunify.com> * direct return jenkins Signed-off-by: runzexia <runzexia@yunify.com> * add some interface Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * update interface Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * credential op structs Signed-off-by: runzexia <runzexia@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * credential handler Signed-off-by: runzexia <runzexia@yunify.com> * update devopsoperator func Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * get build sonar Signed-off-by: runzexia <runzexia@yunify.com> * sonar handler * mv code to cilent Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * project member handler Signed-off-by: runzexia <runzexia@yunify.com> * update pipeline operator interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add tenant devops handler Signed-off-by: runzexia <runzexia@yunify.com> * update merge Signed-off-by: runzexia <runzexia@yunify.com> * clean Signed-off-by: runzexia <runzexia@yunify.com> * fmt Signed-off-by: runzexia <runzexia@yunify.com> * update ListPipelineRuns Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * complate pipelineOperator interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update HttpParameters Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add pipeline steps interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update pipeline GetNodesDetail Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add s2i api Signed-off-by: runzexia <runzexia@yunify.com> * add branch pipeline interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add scan branch interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add common interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add SCM interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add handler Signed-off-by: runzexia <runzexia@yunify.com> * add fake s3 Signed-off-by: runzexia <runzexia@yunify.com> * add webhook&check interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * clean Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * clean Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * format Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add some func Signed-off-by: runzexia <runzexia@yunify.com> * clean code Signed-off-by: runzexia <runzexia@yunify.com> * implement interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * fix interface GetBranchArtifacts Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add s2ibinary upload test Signed-off-by: runzexia <runzexia@yunify.com> * tenant devops Signed-off-by: runzexia <runzexia@yunify.com> * update tenant Signed-off-by: runzexia <runzexia@yunify.com> * fake Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add some unit test Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add devops tenant handler Signed-off-by: runzexia <runzexia@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update fake test Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update unit test and fake data Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update Co-authored-by: Xiaoyang Zhu <sunzhu@yunify.com>
69 lines
2.4 KiB
Go
69 lines
2.4 KiB
Go
package sonarqube
|
|
|
|
import (
|
|
sonargo "github.com/kubesphere/sonargo/sonar"
|
|
"k8s.io/klog"
|
|
"kubesphere.io/kubesphere/pkg/simple/client/devops"
|
|
)
|
|
|
|
type SonarInterface interface {
|
|
GetSonarResultsByTaskIds(taskId ...string) ([]*SonarStatus, error)
|
|
}
|
|
|
|
type sonarQube struct {
|
|
client *sonargo.Client
|
|
}
|
|
|
|
const (
|
|
SonarAnalysisActionClass = "hudson.plugins.sonar.action.SonarAnalysisAction"
|
|
SonarMetricKeys = "alert_status,quality_gate_details,bugs,new_bugs,reliability_rating,new_reliability_rating,vulnerabilities,new_vulnerabilities,security_rating,new_security_rating,code_smells,new_code_smells,sqale_rating,new_maintainability_rating,sqale_index,new_technical_debt,coverage,new_coverage,new_lines_to_cover,tests,duplicated_lines_density,new_duplicated_lines_density,duplicated_blocks,ncloc,ncloc_language_distribution,projects,new_lines"
|
|
SonarAdditionalFields = "metrics,periods"
|
|
)
|
|
|
|
type SonarStatus struct {
|
|
Measures *sonargo.MeasuresComponentObject `json:"measures,omitempty"`
|
|
Issues *sonargo.IssuesSearchObject `json:"issues,omitempty"`
|
|
GeneralAction *devops.GeneralAction `json:"generalAction,omitempty"`
|
|
Task *sonargo.CeTaskObject `json:"task,omitempty"`
|
|
}
|
|
|
|
func (s *sonarQube) GetSonarResultsByTaskIds(taskIds ...string) ([]*SonarStatus, error) {
|
|
sonarStatuses := make([]*SonarStatus, 0)
|
|
for _, taskId := range taskIds {
|
|
sonarStatus := &SonarStatus{}
|
|
taskOptions := &sonargo.CeTaskOption{
|
|
Id: taskId,
|
|
}
|
|
ceTask, _, err := s.client.Ce.Task(taskOptions)
|
|
if err != nil {
|
|
klog.Errorf("get sonar task error [%+v]", err)
|
|
continue
|
|
}
|
|
sonarStatus.Task = ceTask
|
|
measuresComponentOption := &sonargo.MeasuresComponentOption{
|
|
Component: ceTask.Task.ComponentKey,
|
|
AdditionalFields: SonarAdditionalFields,
|
|
MetricKeys: SonarMetricKeys,
|
|
}
|
|
measures, _, err := s.client.Measures.Component(measuresComponentOption)
|
|
if err != nil {
|
|
klog.Errorf("get sonar task error [%+v]", err)
|
|
continue
|
|
}
|
|
sonarStatus.Measures = measures
|
|
|
|
issuesSearchOption := &sonargo.IssuesSearchOption{
|
|
AdditionalFields: "_all",
|
|
ComponentKeys: ceTask.Task.ComponentKey,
|
|
Resolved: "false",
|
|
Ps: "10",
|
|
S: "FILE_LINE",
|
|
Facets: "severities,types",
|
|
}
|
|
issuesSearch, _, err := s.client.Issues.Search(issuesSearchOption)
|
|
sonarStatus.Issues = issuesSearch
|
|
sonarStatuses = append(sonarStatuses, sonarStatus)
|
|
}
|
|
return sonarStatuses, nil
|
|
}
|