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