github.com/jfrog/jfrog-cli-core/v2@v2.51.0/lifecycle/createfrombuilds.go (about)

     1  package lifecycle
     2  
     3  import (
     4  	"encoding/json"
     5  	rtUtils "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils"
     6  	"github.com/jfrog/jfrog-cli-core/v2/common/spec"
     7  	rtServices "github.com/jfrog/jfrog-client-go/artifactory/services"
     8  	"github.com/jfrog/jfrog-client-go/artifactory/services/utils"
     9  	"github.com/jfrog/jfrog-client-go/lifecycle"
    10  	"github.com/jfrog/jfrog-client-go/lifecycle/services"
    11  	"github.com/jfrog/jfrog-client-go/utils/errorutils"
    12  	"github.com/jfrog/jfrog-client-go/utils/io/fileutils"
    13  )
    14  
    15  func (rbc *ReleaseBundleCreateCommand) createFromBuilds(servicesManager *lifecycle.LifecycleServicesManager,
    16  	rbDetails services.ReleaseBundleDetails, queryParams services.CommonOptionalQueryParams) error {
    17  
    18  	var buildsSource services.CreateFromBuildsSource
    19  	var err error
    20  	if rbc.buildsSpecPath != "" {
    21  		buildsSource, err = rbc.getBuildSourceFromBuildsSpec()
    22  	} else {
    23  		buildsSource, err = rbc.convertSpecToBuildsSource(rbc.spec.Files)
    24  	}
    25  	if err != nil {
    26  		return err
    27  	}
    28  
    29  	if len(buildsSource.Builds) == 0 {
    30  		return errorutils.CheckErrorf("at least one build is expected in order to create a release bundle from builds")
    31  	}
    32  
    33  	return servicesManager.CreateReleaseBundleFromBuilds(rbDetails, queryParams, rbc.signingKeyName, buildsSource)
    34  }
    35  
    36  func (rbc *ReleaseBundleCreateCommand) getBuildSourceFromBuildsSpec() (buildsSource services.CreateFromBuildsSource, err error) {
    37  	builds := CreateFromBuildsSpec{}
    38  	content, err := fileutils.ReadFile(rbc.buildsSpecPath)
    39  	if err != nil {
    40  		return
    41  	}
    42  	if err = json.Unmarshal(content, &builds); errorutils.CheckError(err) != nil {
    43  		return
    44  	}
    45  
    46  	return rbc.convertBuildsSpecToBuildsSource(builds)
    47  }
    48  
    49  func (rbc *ReleaseBundleCreateCommand) convertBuildsSpecToBuildsSource(builds CreateFromBuildsSpec) (services.CreateFromBuildsSource, error) {
    50  	buildsSource := services.CreateFromBuildsSource{}
    51  	for _, build := range builds.Builds {
    52  		buildSource := services.BuildSource{BuildName: build.Name, IncludeDependencies: build.IncludeDependencies}
    53  		buildNumber, err := rbc.getLatestBuildNumberIfEmpty(build.Name, build.Number, build.Project)
    54  		if err != nil {
    55  			return services.CreateFromBuildsSource{}, err
    56  		}
    57  		buildSource.BuildNumber = buildNumber
    58  		buildSource.BuildRepository = utils.GetBuildInfoRepositoryByProject(build.Project)
    59  		buildsSource.Builds = append(buildsSource.Builds, buildSource)
    60  	}
    61  	return buildsSource, nil
    62  }
    63  
    64  func (rbc *ReleaseBundleCreateCommand) convertSpecToBuildsSource(files []spec.File) (services.CreateFromBuildsSource, error) {
    65  	buildsSource := services.CreateFromBuildsSource{}
    66  	for _, file := range files {
    67  		buildName, buildNumber, err := rbc.getBuildDetailsFromIdentifier(file.Build, file.Project)
    68  		if err != nil {
    69  			return services.CreateFromBuildsSource{}, err
    70  		}
    71  		isIncludeDeps, err := file.IsIncludeDeps(false)
    72  		if err != nil {
    73  			return services.CreateFromBuildsSource{}, err
    74  		}
    75  
    76  		buildSource := services.BuildSource{
    77  			BuildName:           buildName,
    78  			BuildNumber:         buildNumber,
    79  			BuildRepository:     utils.GetBuildInfoRepositoryByProject(file.Project),
    80  			IncludeDependencies: isIncludeDeps,
    81  		}
    82  		buildsSource.Builds = append(buildsSource.Builds, buildSource)
    83  	}
    84  	return buildsSource, nil
    85  }
    86  
    87  func (rbc *ReleaseBundleCreateCommand) getLatestBuildNumberIfEmpty(buildName, buildNumber, project string) (string, error) {
    88  	if buildNumber != "" {
    89  		return buildNumber, nil
    90  	}
    91  
    92  	aqlService, err := rbc.getAqlService()
    93  	if err != nil {
    94  		return "", err
    95  	}
    96  
    97  	buildNumber, err = utils.GetLatestBuildNumberFromArtifactory(buildName, project, aqlService)
    98  	if err != nil {
    99  		return "", err
   100  	}
   101  	if buildNumber == "" {
   102  		return "", errorutils.CheckErrorf("could not find a build info with name '%s' in artifactory", buildName)
   103  	}
   104  	return buildNumber, nil
   105  }
   106  
   107  func (rbc *ReleaseBundleCreateCommand) getBuildDetailsFromIdentifier(buildIdentifier, project string) (string, string, error) {
   108  	aqlService, err := rbc.getAqlService()
   109  	if err != nil {
   110  		return "", "", err
   111  	}
   112  
   113  	buildName, buildNumber, err := utils.GetBuildNameAndNumberFromBuildIdentifier(buildIdentifier, project, aqlService)
   114  	if err != nil {
   115  		return "", "", err
   116  	}
   117  	if buildName == "" || buildNumber == "" {
   118  		return "", "", errorutils.CheckErrorf("could not identify a build info by the '%s' identifier in artifactory", buildIdentifier)
   119  	}
   120  	return buildName, buildNumber, nil
   121  }
   122  
   123  func (rbc *ReleaseBundleCreateCommand) getAqlService() (*rtServices.AqlService, error) {
   124  	rtServiceManager, err := rtUtils.CreateServiceManager(rbc.serverDetails, 3, 0, false)
   125  	if err != nil {
   126  		return nil, err
   127  	}
   128  	return rtServices.NewAqlService(rtServiceManager.GetConfig().GetServiceDetails(), rtServiceManager.Client()), nil
   129  }
   130  
   131  type CreateFromBuildsSpec struct {
   132  	Builds []SourceBuildSpec `json:"builds,omitempty"`
   133  }
   134  
   135  type SourceBuildSpec struct {
   136  	Name                string `json:"name,omitempty"`
   137  	Number              string `json:"number,omitempty"`
   138  	Project             string `json:"project,omitempty"`
   139  	IncludeDependencies bool   `json:"includeDependencies,omitempty"`
   140  }