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 }