func BuildPublish(buildName, buildNumber string, flags *utils.BuildInfoFlags) error { err := utils.PreCommandSetup(flags) if err != nil { return err } buildData, err := utils.ReadBuildInfoFiles(buildName, buildNumber) if err != nil { return err } if len(buildData) == 0 { return cliutils.CheckError(fmt.Errorf("Can't find any files related to build name: %q, number: %q", buildName, buildNumber)) } sort.Sort(buildData) buildInfo := createNewBuildInfo() buildInfo.Name = buildName buildInfo.Number = buildNumber buildGeneralDetails, err := utils.ReadBuildInfoGeneralDetails(buildName, buildNumber) if err != nil { return err } buildInfo.Started = buildGeneralDetails.Timestamp.Format("2006-01-02T15:04:05.000-0700") artifactsSet, dependenciesSet, env, err := prepareBuildInfoData(buildData, createIncludeFilter(flags), createExcludeFilter(flags)) if err != nil { return err } if len(env) != 0 { buildInfo.Propertires = env } module := createModule(buildName, artifactsSet, dependenciesSet) buildInfo.Modules = append(buildInfo.Modules, module) marshaledBuildInfo, err := json.Marshal(buildInfo) if cliutils.CheckError(err) != nil { return err } if flags.IsDryRun() { fmt.Println(cliutils.IndentJson(marshaledBuildInfo)) return nil } httpClientsDetails := utils.GetArtifactoryHttpClientDetails(flags.ArtDetails) utils.SetContentType("application/vnd.org.jfrog.artifactory+json", &httpClientsDetails.Headers) log.Info("Deploying build info...") resp, body, err := utils.PublishBuildInfo(flags.ArtDetails.Url, marshaledBuildInfo, httpClientsDetails) if err != nil { return err } if resp.StatusCode != 204 { return cliutils.CheckError(errors.New("Artifactory response: " + resp.Status + "\n" + cliutils.IndentJson(body))) } log.Debug("Artifactory response:", resp.Status) log.Info("Build info successfully deployed. Browse it in Artifactory under " + flags.ArtDetails.Url + "webapp/builds/" + buildName + "/" + buildNumber) if err = utils.RemoveBuildDir(buildName, buildNumber); err != nil { return err } return nil }
func BuildDistribute(buildName, buildNumber, targetRepo string, flags *BuildDistributionFlags) error { err := utils.PreCommandSetup(flags) if err != nil { return err } dryRun := "" if flags.DryRun == true { dryRun = "[Dry run] " } message := "Destributing build..." log.Info(dryRun + message) distributeUrl := flags.ArtDetails.Url restApi := path.Join("api/build/distribute/", buildName, buildNumber) requestFullUrl, err := utils.BuildArtifactoryUrl(distributeUrl, restApi, make(map[string]string)) if err != nil { return err } data := BuildDistributionConfig{ SourceRepos: strings.Split(flags.SourceRepos, ","), TargetRepo: targetRepo, Publish: flags.Publish, OverrideExistingFiles: flags.OverrideExistingFiles, GpgPassphrase: flags.GpgPassphrase, Async: flags.Async, DryRun: flags.DryRun} requestContent, err := json.Marshal(data) if err != nil { return cliutils.CheckError(errors.New("Failed to execute request. " + cliutils.GetDocumentationMessage())) } httpClientsDetails := utils.GetArtifactoryHttpClientDetails(flags.ArtDetails) utils.SetContentType("application/json", &httpClientsDetails.Headers) resp, body, err := ioutils.SendPost(requestFullUrl, requestContent, httpClientsDetails) if err != nil { return err } if resp.StatusCode != 200 { return cliutils.CheckError(errors.New("Artifactory response: " + resp.Status + "\n" + cliutils.IndentJson(body))) } log.Debug("Artifactory response:", resp.Status) if flags.Async && !flags.DryRun { log.Info("Asynchronously distributed build", buildName, "#"+buildNumber, "to:", targetRepo, "repository, logs are avalable in Artifactory.") return nil } log.Info(dryRun+"Distributed build", buildName, "#"+buildNumber, "to:", targetRepo, "repository.") return nil }
func Download(downloadSpec *utils.SpecFiles, flags *DownloadFlags) (err error) { err = utils.PreCommandSetup(flags) if err != nil { return } isCollectBuildInfo := len(flags.BuildName) > 0 && len(flags.BuildNumber) > 0 if isCollectBuildInfo && !flags.DryRun { if err = utils.SaveBuildGeneralDetails(flags.BuildName, flags.BuildNumber); err != nil { return } } if !flags.DryRun { err = ioutils.CreateTempDirPath() if err != nil { return } defer ioutils.RemoveTempDir() } buildDependecies := make([][]utils.DependenciesBuildInfo, flags.Threads) log.Info("Searching artifacts...") var downloadData []DownloadData for i := 0; i < len(downloadSpec.Files); i++ { var partialDownloadData []DownloadData switch downloadSpec.Get(i).GetSpecType() { case utils.WILDCARD, utils.SIMPLE: partialDownloadData, err = collectWildcardDependecies(downloadSpec.Get(i), flags) case utils.AQL: partialDownloadData, err = collectAqlDependecies(downloadSpec.Get(i), flags) } if err != nil { return } downloadData = append(downloadData, partialDownloadData...) } utils.LogSearchResults(len(downloadData)) buildDependecies, err = downloadAqlResult(downloadData, flags) if err != nil { return } if isCollectBuildInfo && !flags.DryRun { populateFunc := func(tempWrapper *utils.ArtifactBuildInfoWrapper) { tempWrapper.Dependencies = stripThreadIdFromBuildInfoDependencies(buildDependecies) } err = utils.PrepareBuildInfoForSave(flags.BuildName, flags.BuildNumber, populateFunc) } return }
func Delete(deleteSpec *utils.SpecFiles, flags *DeleteFlags) (err error) { err = utils.PreCommandSetup(flags) if err != nil { return } resultItems, err := GetPathsToDelete(deleteSpec, flags) if err != nil { return err } if err = DeleteFiles(resultItems, flags); err != nil { return } log.Info("Deleted", len(resultItems), "items.") return }
func Search(searchSpec *utils.SpecFiles, flags *SearchFlags) (result []SearchResult, err error) { err = utils.PreCommandSetup(flags) if err != nil { return } var resultItems []utils.AqlSearchResultItem var itemsFound []utils.AqlSearchResultItem log.Info("Searching artifacts...") for i := 0; i < len(searchSpec.Files); i++ { switch searchSpec.Get(i).GetSpecType() { case utils.WILDCARD, utils.SIMPLE: isRecursive, e := cliutils.StringToBool(searchSpec.Get(i).Recursive, true) if e != nil { err = e return } itemsFound, e = utils.AqlSearchDefaultReturnFields(searchSpec.Get(i).Pattern, isRecursive, searchSpec.Get(i).Props, flags) if e != nil { err = e return } resultItems = append(resultItems, itemsFound...) case utils.AQL: itemsFound, err = utils.AqlSearchBySpec(searchSpec.Get(i).Aql, flags) if err != nil { return } resultItems = append(resultItems, itemsFound...) } } result = aqlResultToSearchResult(resultItems) utils.LogSearchResults(len(resultItems)) return }
// Uploads the artifacts in the specified local path pattern to the specified target path. // Returns the total number of artifacts successfully uploaded. func Upload(uploadSpec *utils.SpecFiles, flags *UploadFlags) (totalUploaded, totalFailed int, err error) { err = utils.PreCommandSetup(flags) if err != nil { return 0, 0, err } isCollectBuildInfo := len(flags.BuildName) > 0 && len(flags.BuildNumber) > 0 if isCollectBuildInfo && !flags.DryRun { if err := utils.SaveBuildGeneralDetails(flags.BuildName, flags.BuildNumber); err != nil { return 0, 0, err } } spinner := cliutils.NewSpinner("[Info] Collecting files for upload:", time.Second) spinner.Start() uploadData, err := buildUploadData(uploadSpec, flags) spinner.Stop() if err != nil { return 0, 0, err } buildArtifacts, totalUploaded, totalFailed, err := uploadWildcard(uploadData, flags) if err != nil { return 0, 0, err } if totalFailed > 0 { return } if isCollectBuildInfo && !flags.DryRun { populateFunc := func(tempWrapper *utils.ArtifactBuildInfoWrapper) { tempWrapper.Artifacts = toBuildInfoArtifacts(buildArtifacts) } err = utils.PrepareBuildInfoForSave(flags.BuildName, flags.BuildNumber, populateFunc) } return }