diff --git a/go.mod b/go.mod index ce6223dec..756aa3ca5 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/jfrog/build-info-go v1.13.1-0.20260120103048-d7f367bfa36e github.com/jfrog/gofrog v1.7.6 github.com/jfrog/jfrog-cli-application v1.0.2-0.20260107143435-b30ede954432 - github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260127133717-20240af03a4c + github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260129054930-035e3ed7e30d github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260112010739-87fc7275623c github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251225153025-9d8ac181d615 github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e diff --git a/go.sum b/go.sum index 90fcbe00f..dc7d41e82 100644 --- a/go.sum +++ b/go.sum @@ -1216,8 +1216,8 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= github.com/jfrog/jfrog-cli-application v1.0.2-0.20260107143435-b30ede954432 h1:6eOOs+326IrWLVA+ghDDudJmN3Nt8lxPl11eOu8vtPE= github.com/jfrog/jfrog-cli-application v1.0.2-0.20260107143435-b30ede954432/go.mod h1:xum2HquWO5uExa/A7MQs3TgJJVEeoqTR+6Z4mfBr1Xw= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260127133717-20240af03a4c h1:czaLFCx8wRuO0ixOFgEWYNX2L9UQdcBP71r391LQ3nc= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260127133717-20240af03a4c/go.mod h1:ANFZOB4AX+Voo24l1BO8bVvN76m3ZViR1QaK5u3QDgE= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260129054930-035e3ed7e30d h1:jyBD9kqAL8eHerZvGmxiTZECA+sYuH3TpodGnnpnPSs= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260129054930-035e3ed7e30d/go.mod h1:ANFZOB4AX+Voo24l1BO8bVvN76m3ZViR1QaK5u3QDgE= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260112010739-87fc7275623c h1:K9anqOZ7ASxlsijsl9u4jh92wqqIvJA4kTYfXrcOmJA= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260112010739-87fc7275623c/go.mod h1:+Hnaikp/xCSPD/q7txxRy4Zc0wzjW/usrCSf+6uONSQ= github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251225153025-9d8ac181d615 h1:y5an0bojHL00ipHP1QuBUrVcP+XK+yZHHOJ/r1I0RUM= diff --git a/lifecycle_test.go b/lifecycle_test.go index 2708ccc63..3319736b4 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -150,6 +150,51 @@ func TestReleaseBundleCreationFromMultipleBuildsAndBundlesUsingCommandFlags(t *t assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") } +func TestReleaseBundleCreationFromMultiBundlesUsingCommandFlagWithProject(t *testing.T) { + cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) + defer cleanCallback() + deleteProject := createTestProject(t) + if deleteProject != nil { + defer func() { + if err := deleteProject(); err != nil { + t.Error(err) + } + }() + } + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuildsWithProject(t) + defer deleteBuilds() + + // Create first release bundle from builds with project + createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, tests.ProjectKey, true, true) + defer deleteReleaseBundleWithProject(t, lcManager, tests.LcRbName1, number1, tests.ProjectKey) + assertStatusCompletedWithProject(t, lcManager, tests.LcRbName1, number1, "", tests.ProjectKey) + + // Verify first release bundle exists with project + isExist, err := lcManager.IsReleaseBundleExist(tests.LcRbName1, number1, tests.ProjectKey) + assert.NoError(t, err) + assert.True(t, isExist, "Release bundle %s/%s should exist in project %s", tests.LcRbName1, number1, tests.ProjectKey) + + // Create second release bundle from builds with project + createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, tests.ProjectKey, true, true) + defer deleteReleaseBundleWithProject(t, lcManager, tests.LcRbName2, number2, tests.ProjectKey) + assertStatusCompletedWithProject(t, lcManager, tests.LcRbName2, number2, "", tests.ProjectKey) + + // Verify second release bundle exists with project + isExist, err = lcManager.IsReleaseBundleExist(tests.LcRbName2, number2, tests.ProjectKey) + assert.NoError(t, err) + assert.True(t, isExist, "Release bundle %s/%s should exist in project %s", tests.LcRbName2, number2, tests.ProjectKey) + + // Wait a bit to ensure release bundles are fully indexed before using them as sources + time.Sleep(5 * time.Second) + + // Create release bundle from the two previous release bundles with project + createRbFromMultiSourcesUsingCommandFlagsWithProject(t, lcManager, "", createReleaseBundlesSource(), tests.LcRbName3, number3, tests.ProjectKey, true) + defer deleteReleaseBundleWithProject(t, lcManager, tests.LcRbName3, number3, tests.ProjectKey) + assertStatusCompletedWithProject(t, lcManager, tests.LcRbName3, number3, "", tests.ProjectKey) +} + func TestReleaseBundleCreationFromMultipleSourcesUsingSpec(t *testing.T) { cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) @@ -191,6 +236,7 @@ func TestReleaseBundleCreationFromArtifactsWithoutSigningKey(t *testing.T) { testReleaseBundleCreation(t, tests.UploadDevSpec, tests.LifecycleArtifacts, tests.GetExpectedLifecycleCreationByArtifacts(), withoutSigningKey) } +//nolint:unparam // sync parameter is kept for API consistency with existing tests func createRbFromMultiSourcesUsingCommandFlags(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, buildsSourcesOption, bundlesSourcesOption, rbName, rbVersion, project string, sync bool, ) { @@ -210,6 +256,46 @@ func createRbFromMultiSourcesUsingCommandFlags(t *testing.T, lcManager *lifecycl assert.NoError(t, err) } +//nolint:unparam // sync parameter is kept for API consistency with existing tests +func createRbFromMultiSourcesUsingCommandFlagsWithProject(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, buildsSourcesOption, bundlesSourcesOption, + rbName, rbVersion, project string, sync bool, +) { + var sources []services.RbSource + sources = buildMultiSources(sources, buildsSourcesOption, bundlesSourcesOption, project) + // For projects (non-default), populate repository key for release bundle sources + if project != "" && project != "default" { + populateRepositoryKeyForReleaseBundleSourcesWithProject(sources, project) + } + + rbDetails := services.ReleaseBundleDetails{ + ReleaseBundleName: rbName, + ReleaseBundleVersion: rbVersion, + } + queryParams := services.CommonOptionalQueryParams{ + Async: !sync, + ProjectKey: project, + } + + _, err := lcManager.CreateReleaseBundlesFromMultipleSources(rbDetails, queryParams, gpgKeyPairName, sources) + assert.NoError(t, err) +} + +func populateRepositoryKeyForReleaseBundleSourcesWithProject(sources []services.RbSource, projectKey string) { + if projectKey == "" || projectKey == "default" { + return + } + for i := range sources { + if sources[i].SourceType == "release_bundles" { + for j := range sources[i].ReleaseBundles { + rb := &sources[i].ReleaseBundles[j] + if rb.ProjectKey != "" && rb.ProjectKey != "default" { + rb.RepositoryKey = rb.ProjectKey + "-release-bundles-v2" + } + } + } + } +} + func buildMultiSources(sources []services.RbSource, buildsSourcesStr, bundlesSourcesStr, projectKey string) []services.RbSource { // Process Builds if buildsSourcesStr != "" { @@ -580,6 +666,8 @@ func assertStatusCompleted(t *testing.T, lcManager *lifecycle.LifecycleServicesM } // If createdMillis is provided, assert status for promotion. If blank, assert for creation. +// +//nolint:unparam // createdMillis parameter is kept for API consistency with existing tests func assertStatusCompletedWithProject(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion, createdMillis, projectKey string) { resp, err := getStatusWithProject(lcManager, rbName, rbVersion, createdMillis, projectKey) if !assert.NoError(t, err) {