github.com/jfrog/jfrog-cli-core@v1.12.1/artifactory/commands/buildinfo/xrayscan.go (about) 1 package buildinfo 2 3 import ( 4 "encoding/json" 5 6 "github.com/jfrog/jfrog-cli-core/artifactory/utils" 7 "github.com/jfrog/jfrog-cli-core/utils/config" 8 "github.com/jfrog/jfrog-client-go/artifactory/services" 9 clientutils "github.com/jfrog/jfrog-client-go/utils" 10 "github.com/jfrog/jfrog-client-go/utils/errorutils" 11 "github.com/jfrog/jfrog-client-go/utils/log" 12 ) 13 14 type BuildScanCommand struct { 15 buildConfiguration *utils.BuildConfiguration 16 failBuild bool 17 serverDetails *config.ServerDetails 18 } 19 20 func NewBuildScanCommand() *BuildScanCommand { 21 return &BuildScanCommand{} 22 } 23 24 func (bsc *BuildScanCommand) SetServerDetails(serverDetails *config.ServerDetails) *BuildScanCommand { 25 bsc.serverDetails = serverDetails 26 return bsc 27 } 28 29 func (bsc *BuildScanCommand) SetFailBuild(failBuild bool) *BuildScanCommand { 30 bsc.failBuild = failBuild 31 return bsc 32 } 33 34 func (bsc *BuildScanCommand) SetBuildConfiguration(buildConfiguration *utils.BuildConfiguration) *BuildScanCommand { 35 bsc.buildConfiguration = buildConfiguration 36 return bsc 37 } 38 39 func (bsc *BuildScanCommand) CommandName() string { 40 return "rt_build_scan" 41 } 42 43 func (bsc *BuildScanCommand) ServerDetails() (*config.ServerDetails, error) { 44 return bsc.serverDetails, nil 45 } 46 47 func (bsc *BuildScanCommand) Run() error { 48 log.Info("Triggered Xray build scan... The scan may take a few minutes.") 49 servicesManager, err := utils.CreateServiceManager(bsc.serverDetails, -1, false) 50 if err != nil { 51 return err 52 } 53 54 xrayScanParams := getXrayScanParams(*bsc.buildConfiguration) 55 result, err := servicesManager.XrayScanBuild(xrayScanParams) 56 if err != nil { 57 return err 58 } 59 60 var scanResults scanResult 61 err = json.Unmarshal(result, &scanResults) 62 if errorutils.CheckError(err) != nil { 63 return err 64 } 65 66 log.Info("Xray scan completed.") 67 log.Output(clientutils.IndentJson(result)) 68 69 // Check if should fail build 70 if bsc.failBuild && scanResults.Summary.FailBuild { 71 // We're specifically returning the 'buildScanError' and not a regular error 72 // to indicate that Xray indeed scanned the build, and the failure is not due to 73 // networking connectivity or other issues. 74 return errorutils.CheckError(utils.GetBuildScanError()) 75 } 76 77 return err 78 } 79 80 // To unmarshal xray scan summary result 81 type scanResult struct { 82 Summary scanSummary `json:"summary,omitempty"` 83 } 84 85 type scanSummary struct { 86 TotalAlerts int `json:"total_alerts,omitempty"` 87 FailBuild bool `json:"fail_build,omitempty"` 88 Message string `json:"message,omitempty"` 89 Url string `json:"more_details_url,omitempty"` 90 } 91 92 func getXrayScanParams(buildConfiguration utils.BuildConfiguration) services.XrayScanParams { 93 xrayScanParams := services.NewXrayScanParams() 94 xrayScanParams.BuildName = buildConfiguration.BuildName 95 xrayScanParams.BuildNumber = buildConfiguration.BuildNumber 96 xrayScanParams.ProjectKey = buildConfiguration.Project 97 98 return xrayScanParams 99 }