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  }