diff --git a/docker_test.go b/docker_test.go index ad4281441..76068d8b8 100644 --- a/docker_test.go +++ b/docker_test.go @@ -140,7 +140,7 @@ func TestContainerPushWithDetailedSummary(t *testing.T) { runRt(t, "build-publish", tests.DockerBuildName, buildNumber) imagePath := path.Join(repo, imageName, "1") + "/" - validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, module, 7, 5, 7, t) + validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, module, 7, 5, t) // Check deployment view assertPrintedDeploymentViewFunc, cleanupFunc := initDeploymentViewTest(t) @@ -179,7 +179,7 @@ func runPushTest(containerManager container.ContainerManagerType, imageName, mod runRt(t, "build-publish", tests.DockerBuildName, buildNumber) imagePath := path.Join(repo, imageName, "1") + "/" - validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, module, 7, 5, 7, t) + validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, module, 7, 5, t) } func loginToArtifactory(t *testing.T, container *tests.TestContainer) { @@ -380,7 +380,7 @@ func TestContainerPushBuildNameNumberFromEnv(t *testing.T) { runRt(t, "build-publish") imagePath := path.Join(tests.DockerLocalRepo, tests.DockerImageName, "1") + "/" - validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, tests.DockerImageName+":1", 7, 5, 7, t) + validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, tests.DockerImageName+":1", 7, 5, t) inttestutils.ContainerTestCleanup(t, serverDetails, artHttpDetails, tests.DockerImageName, tests.DockerBuildName, tests.DockerLocalRepo) }() } @@ -404,12 +404,12 @@ func TestContainerPull(t *testing.T) { runRt(t, "build-publish", tests.DockerBuildName, buildNumber) imagePath := path.Join(repo, tests.DockerImageName, "1") + "/" - validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, tests.DockerImageName+":1", 0, 7, 7, t) + validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, tests.DockerImageName+":1", 0, 7, t) buildNumber = "2" runCmdWithRetries(t, jfrogRtCliTask(containerManager.String()+"-pull", imageName, repo, "--build-name="+tests.DockerBuildName, "--build-number="+buildNumber, "--module="+ModuleNameJFrogTest)) runRt(t, "build-publish", tests.DockerBuildName, buildNumber) - validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, ModuleNameJFrogTest, 0, 7, 7, t) + validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, ModuleNameJFrogTest, 0, 7, t) inttestutils.ContainerTestCleanup(t, serverDetails, artHttpDetails, tests.DockerImageName, tests.DockerBuildName, repo) } @@ -481,8 +481,8 @@ func TestDockerPromote(t *testing.T) { inttestutils.VerifyExistInArtifactory(tests.GetDockerDeployedManifest(), searchSpec, serverDetails, t) } -func validateContainerBuild(buildName, buildNumber, imagePath, module string, expectedArtifacts, expectedDependencies, expectedItemsInArtifactory int, t *testing.T) { - validateContainerImage(t, imagePath, expectedItemsInArtifactory) +func validateContainerBuild(buildName, buildNumber, imagePath, module string, expectedArtifacts, expectedDependencies int, t *testing.T) { + validateContainerImage(t, imagePath, 7) publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) if err != nil { assert.NoError(t, err) @@ -585,26 +585,15 @@ func TestNativeDockerPushPull(t *testing.T) { cleanup := initNativeDockerWithArtTest(t) defer cleanup() pushBuildNumber := "2" - pullBuildNumber := "3" - module := "native-docker-module" image, err := inttestutils.BuildTestImage(tests.DockerImageName+":"+pushBuildNumber, "", tests.DockerLocalRepo, container.DockerClient) assert.NoError(t, err) - // Add docker cli flag '-D' to check we ignore them - runCmdWithRetries(t, jfCliTask("docker", "-D", "push", image, "--build-name="+tests.DockerBuildName, "--build-number="+pushBuildNumber, "--module="+module)) - - inttestutils.ValidateGeneratedBuildInfoModule(t, tests.DockerBuildName, pushBuildNumber, "", []string{module}, entities.Docker) - runRt(t, "build-publish", tests.DockerBuildName, pushBuildNumber) + defer tests2.DeleteTestImage(t, image, container.DockerClient) + defer inttestutils.ContainerTestCleanup(t, serverDetails, artHttpDetails, tests.DockerImageName, tests.DockerBuildName, tests.DockerLocalRepo) + runCmdWithRetries(t, jfCliTask("docker", "-D", "push", image, "--detailed-summary=true")) imagePath := path.Join(tests.DockerLocalRepo, tests.DockerImageName, pushBuildNumber) + "/" - validateContainerBuild(tests.DockerBuildName, pushBuildNumber, imagePath, module, 7, 5, 7, t) - tests2.DeleteTestImage(t, image, container.DockerClient) - - runCmdWithRetries(t, jfCliTask("docker", "-D", "pull", image, "--build-name="+tests.DockerBuildName, "--build-number="+pullBuildNumber, "--module="+module)) - runRt(t, "build-publish", tests.DockerBuildName, pullBuildNumber) - imagePath = path.Join(tests.DockerLocalRepo, tests.DockerImageName, pullBuildNumber) + "/" - validateContainerBuild(tests.DockerBuildName, pullBuildNumber, imagePath, module, 0, 7, 0, t) + validateContainerImage(t, imagePath, 7) tests2.DeleteTestImage(t, image, container.DockerClient) - - inttestutils.ContainerTestCleanup(t, serverDetails, artHttpDetails, tests.DockerImageName, tests.DockerBuildName, tests.DockerLocalRepo) + runCmdWithRetries(t, jfCliTask("docker", "-D", "pull", image, "--detailed-summary=true")) } func TestNativeDockerFlagParsing(t *testing.T) { diff --git a/go.mod b/go.mod index 1204725a9..f00bd677f 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/jfrog/build-info-go v1.12.2 github.com/jfrog/gofrog v1.7.6 github.com/jfrog/jfrog-cli-application v1.0.1 - github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251107104809-61e0eb1318a5 + github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251110084008-a7b8b1961aa8 github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251028101519-8c79bb06de65 github.com/jfrog/jfrog-cli-evidence v0.8.2 github.com/jfrog/jfrog-cli-platform-services v1.10.0 @@ -33,6 +33,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 golang.org/x/exp v0.0.0-20250911091902-df9299821621 gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -267,7 +268,6 @@ require ( google.golang.org/protobuf v1.36.8 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect sigs.k8s.io/yaml v1.6.0 // indirect diff --git a/go.sum b/go.sum index 80d4b3148..b68fddcdd 100644 --- a/go.sum +++ b/go.sum @@ -1159,8 +1159,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.1 h1:PiiSVKFFs8VLAwjCe2JrIKlX7LmARFt+r8BLTupWIDc= github.com/jfrog/jfrog-cli-application v1.0.1/go.mod h1:gjV6Q2hhoMe3FF77GFiTyIRLSHokpDrkVj0GvYM+1Y4= -github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251107104809-61e0eb1318a5 h1:pzx0AdO31G/9bOOukZ/kNF7Ria4x3vwo4eaie45EKqE= -github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251107104809-61e0eb1318a5/go.mod h1:l9orAXG293Sx8pyk8nwZyHtnMXmPoVehUKZATIAy14U= +github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251110084008-a7b8b1961aa8 h1:rWrGzqSJWa2accXyNL2V+ePoMmyZ0gsxIEgLZEfVEa0= +github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251110084008-a7b8b1961aa8/go.mod h1:l9orAXG293Sx8pyk8nwZyHtnMXmPoVehUKZATIAy14U= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251028101519-8c79bb06de65 h1:9HDaoQXzP2EcSL7JML3j6qQ18tDvpKRuonFe1DEKvb8= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251028101519-8c79bb06de65/go.mod h1:qGHIijD2doUdFaRFRhudtCmlt0ENDaBvM3dnUClpmHc= github.com/jfrog/jfrog-cli-evidence v0.8.2 h1:GQi2BjIruGzTWJ9AJM59frRgiPQoLLDo4IVfwiye0tc= diff --git a/lifecycle_test.go b/lifecycle_test.go index e4d9ad7d8..0950de366 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -653,7 +653,14 @@ func deleteReleaseBundle(t *testing.T, lcManager *lifecycle.LifecycleServicesMan ReleaseBundleVersion: rbVersion, } - assert.NoError(t, lcManager.DeleteReleaseBundleVersion(rbDetails, services.CommonOptionalQueryParams{Async: false})) + err := lcManager.DeleteReleaseBundleVersion(rbDetails, services.CommonOptionalQueryParams{Async: false}) + if err != nil { + // Ignore 404 errors during cleanup as the release bundle may have already been deleted + if strings.Contains(err.Error(), "404") || strings.Contains(err.Error(), "not found") { + return + } + assert.NoError(t, err) + } // Wait after remote deleting. Can be removed once remote deleting supports sync. time.Sleep(5 * time.Second) } @@ -750,18 +757,6 @@ func deleteReleaseBundleProperties(t *testing.T, lcManager *lifecycle.LifecycleS time.Sleep(5 * time.Second) } -func createRbIfDoesNotExists(t *testing.T, rbName, rbVersion string, lcManager *lifecycle.LifecycleServicesManager) { - isExist, err := lcManager.IsReleaseBundleExist(rbName, rbVersion, "") - assert.NoError(t, err) - if isExist { - _, statusErr := getStatus(lcManager, rbName, rbVersion, "") - if statusErr == nil { - return - } - } - createRbFromSpec(t, tests.LifecycleBuilds12, rbName, rbVersion, true, true) -} - func TestReleaseBundlesSearchGroups(t *testing.T) { cleanCallback := initLifecycleTest(t, artifactoryLifecycleSetTagMinVersion) defer cleanCallback() @@ -778,19 +773,40 @@ func TestReleaseBundlesSearchGroups(t *testing.T) { const rbNameD = "another-app" const version1 = "1.0.0" - createRbIfDoesNotExists(t, rbNameA, version1, lcManager) + // Delete existing release bundles to ensure fresh creation and indexing + // This is important for search groups test as stale bundles may not be indexed + for _, rbName := range []string{rbNameA, rbNameB, rbNameC, rbNameD} { + isExist, err := lcManager.IsReleaseBundleExist(rbName, version1, "") + if err == nil && isExist { + rbDetails := services.ReleaseBundleDetails{ + ReleaseBundleName: rbName, + ReleaseBundleVersion: version1, + } + err := lcManager.DeleteReleaseBundleVersion(rbDetails, services.CommonOptionalQueryParams{Async: false}) + if err != nil { + // Ignore 404 errors as the release bundle may not exist + if !strings.Contains(err.Error(), "404") && !strings.Contains(err.Error(), "not found") { + t.Logf("Warning: Failed to delete release bundle %s/%s: %v", rbName, version1, err) + } + } else { + time.Sleep(5 * time.Second) + } + } + } + + createRbFromSpec(t, tests.LifecycleBuilds12, rbNameA, version1, true, true) defer deleteReleaseBundle(t, lcManager, rbNameA, version1) assertStatusCompleted(t, lcManager, rbNameA, version1, "") - createRbIfDoesNotExists(t, rbNameB, version1, lcManager) + createRbFromSpec(t, tests.LifecycleBuilds12, rbNameB, version1, true, true) defer deleteReleaseBundle(t, lcManager, rbNameB, version1) assertStatusCompleted(t, lcManager, rbNameB, version1, "") - createRbIfDoesNotExists(t, rbNameC, version1, lcManager) + createRbFromSpec(t, tests.LifecycleBuilds12, rbNameC, version1, true, true) defer deleteReleaseBundle(t, lcManager, rbNameC, version1) assertStatusCompleted(t, lcManager, rbNameC, version1, "") - createRbIfDoesNotExists(t, rbNameD, version1, lcManager) + createRbFromSpec(t, tests.LifecycleBuilds12, rbNameD, version1, true, true) defer deleteReleaseBundle(t, lcManager, rbNameD, version1) assertStatusCompleted(t, lcManager, rbNameD, version1, "") @@ -931,25 +947,46 @@ func TestReleaseBundlesSearchVersions(t *testing.T) { const versionC = "1.1.0-rc" const versionD = "2.0.0" - createRbIfDoesNotExists(t, rbName, versionA, lcManager) + // Delete existing release bundle versions to ensure fresh creation and indexing + // This is important for search versions test as stale bundles may not be indexed + for _, version := range []string{versionA, versionB, versionC, versionD} { + isExist, err := lcManager.IsReleaseBundleExist(rbName, version, "") + if err == nil && isExist { + rbDetails := services.ReleaseBundleDetails{ + ReleaseBundleName: rbName, + ReleaseBundleVersion: version, + } + err := lcManager.DeleteReleaseBundleVersion(rbDetails, services.CommonOptionalQueryParams{Async: false}) + if err != nil { + // Ignore 404 errors as the release bundle may not exist + if !strings.Contains(err.Error(), "404") && !strings.Contains(err.Error(), "not found") { + t.Logf("Warning: Failed to delete release bundle %s/%s: %v", rbName, version, err) + } + } else { + time.Sleep(5 * time.Second) + } + } + } + + createRbFromSpec(t, tests.LifecycleBuilds12, rbName, versionA, true, true) defer deleteReleaseBundle(t, lcManager, rbName, versionA) assertStatusCompleted(t, lcManager, rbName, versionA, "") time.Sleep(1 * time.Second) - createRbIfDoesNotExists(t, rbName, versionB, lcManager) + createRbFromSpec(t, tests.LifecycleBuilds12, rbName, versionB, true, true) defer deleteReleaseBundle(t, lcManager, rbName, versionB) assertStatusCompleted(t, lcManager, rbName, versionB, "") time.Sleep(1 * time.Second) - createRbIfDoesNotExists(t, rbName, versionC, lcManager) + createRbFromSpec(t, tests.LifecycleBuilds12, rbName, versionC, true, true) defer deleteReleaseBundle(t, lcManager, rbName, versionC) assertStatusCompleted(t, lcManager, rbName, versionC, "") time.Sleep(1 * time.Second) - createRbIfDoesNotExists(t, rbName, versionD, lcManager) + createRbFromSpec(t, tests.LifecycleBuilds12, rbName, versionD, true, true) defer deleteReleaseBundle(t, lcManager, rbName, versionD) assertStatusCompleted(t, lcManager, rbName, versionD, "")