github.com/jfrog/jfrog-cli-core/v2@v2.52.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  }