From 17ccb63e08284054b3c44aa0a5abdb23710304f2 Mon Sep 17 00:00:00 2001 From: kfirh Date: Sun, 1 Feb 2026 17:08:27 +0200 Subject: [PATCH 01/12] Added e2e tests for create and update of a draft release bundle commands --- go.mod | 6 +- go.sum | 12 +-- lifecycle_test.go | 129 ++++++++++++++++++++++++++++++-- utils/cliutils/commandsflags.go | 1 + utils/tests/consts.go | 40 ++++++++++ 5 files changed, 171 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index 9d2f7c0ca..0fd48a719 100644 --- a/go.mod +++ b/go.mod @@ -16,15 +16,15 @@ require ( github.com/docker/docker v28.5.2+incompatible github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 github.com/jfrog/archiver/v3 v3.6.1 - github.com/jfrog/build-info-go v1.13.1-0.20260107080257-82671efa69a2 + github.com/jfrog/build-info-go v1.13.1-0.20260119231731-3cc4a0771bbd github.com/jfrog/gofrog v1.7.6 github.com/jfrog/jfrog-cli-application v1.0.2-0.20251231144110-a68c3ac11c7a - github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260107090044-56a45e5c560e + github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260201084712-af3845a393d3 github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260106204841-744f3f71817b 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 github.com/jfrog/jfrog-cli-security v1.25.0 - github.com/jfrog/jfrog-client-go v1.55.1-0.20260107080024-ccd1f1de6614 + github.com/jfrog/jfrog-client-go v1.55.1-0.20260201135506-ffd03518ef56 github.com/jszwec/csvutil v1.10.0 github.com/manifoldco/promptui v0.9.0 github.com/spf13/viper v1.21.0 diff --git a/go.sum b/go.sum index 00de23985..8af16c430 100644 --- a/go.sum +++ b/go.sum @@ -1204,8 +1204,8 @@ github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI= github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= -github.com/jfrog/build-info-go v1.13.1-0.20260107080257-82671efa69a2 h1:I3D+ApaOhHfICPkRlU8WwOY/IlHs4lfBIZC8NNHSDtQ= -github.com/jfrog/build-info-go v1.13.1-0.20260107080257-82671efa69a2/go.mod h1:+OCtMb22/D+u7Wne5lzkjJjaWr0LRZcHlDwTH86Mpwo= +github.com/jfrog/build-info-go v1.13.1-0.20260119231731-3cc4a0771bbd h1:rDAJA3RLhdjxgHjpYrPiYEl9RuGwDFODx+bvhU7J2LY= +github.com/jfrog/build-info-go v1.13.1-0.20260119231731-3cc4a0771bbd/go.mod h1:+OCtMb22/D+u7Wne5lzkjJjaWr0LRZcHlDwTH86Mpwo= github.com/jfrog/froggit-go v1.20.6 h1:Xp7+LlEh0m1KGrQstb+u0aGfjRUtv1eh9xQBV3571jQ= github.com/jfrog/froggit-go v1.20.6/go.mod h1:obSG1SlsWjktkuqmKtpq7MNTTL63e0ot+ucTnlOMV88= github.com/jfrog/go-mockhttp v0.3.1 h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8= @@ -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.20251231144110-a68c3ac11c7a h1:XoJ3w2AFi7zniimALNK3idw9bzY9MwB/FM45TMgxYAY= github.com/jfrog/jfrog-cli-application v1.0.2-0.20251231144110-a68c3ac11c7a/go.mod h1:xum2HquWO5uExa/A7MQs3TgJJVEeoqTR+6Z4mfBr1Xw= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260107090044-56a45e5c560e h1:+qB6eWbzeSOh5i6Pc0sC9arG8r5f6GLZm722jDyQ6nI= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260107090044-56a45e5c560e/go.mod h1:U/1q7jEO0YGSAWZEZiEmo0lZHI48xBorsFuL/F8C1fU= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260201084712-af3845a393d3 h1:CGPRVKhCXuDAoK78RyACO04ohI0vvCDfnAk8FUheJJw= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260201084712-af3845a393d3/go.mod h1:+3MYwa3NE2GR10uegJTdfKKvVXURXftN6N3/45OipRM= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260106204841-744f3f71817b h1:gGGmYXuYvcNns1BnLQI13lC+pgMxrmenx+ramtolQuA= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260106204841-744f3f71817b/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= @@ -1226,8 +1226,8 @@ github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b000 github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e/go.mod h1:qbu4iqBST9x8LgD8HhzUm91iOB3vHqtoGmaxOnmw0ok= github.com/jfrog/jfrog-cli-security v1.25.0 h1:DM29QsMkFLRD6adKCWISe3uHFVaOodIN56NH7ThpKKU= github.com/jfrog/jfrog-cli-security v1.25.0/go.mod h1:IV/+JhaLmyeMb8IAoJZYUq4gONW5BdrxgdT4w7SXgz0= -github.com/jfrog/jfrog-client-go v1.55.1-0.20260107080024-ccd1f1de6614 h1:8mjRuSJeJJ/mYPUXqJbT82hh2NxT2JvqWTvOtYsVa8g= -github.com/jfrog/jfrog-client-go v1.55.1-0.20260107080024-ccd1f1de6614/go.mod h1:sCE06+GngPoyrGO0c+vmhgMoVSP83UMNiZnIuNPzU8U= +github.com/jfrog/jfrog-client-go v1.55.1-0.20260201135506-ffd03518ef56 h1:MLbEex8JxLDj4bh62ZjQu16Qgfu8BPcKnlSTtizipe8= +github.com/jfrog/jfrog-client-go v1.55.1-0.20260201135506-ffd03518ef56/go.mod h1:sCE06+GngPoyrGO0c+vmhgMoVSP83UMNiZnIuNPzU8U= github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= diff --git a/lifecycle_test.go b/lifecycle_test.go index 938e4b516..a94cc97f0 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -404,6 +404,76 @@ func TestPromoteReleaseBundleWithPromotionTypeFlag(t *testing.T) { assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") } +func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { + cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // Test 1: Create draft bundle from spec + createRbFromSpecWithDraft(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + assertStatusDraft(t, lcManager, tests.LcRbName1, number1) + + // Test 2: Create draft bundle using build-name/build-number flags + createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + assertStatusDraft(t, lcManager, tests.LcRbName2, number2) +} + +func TestReleaseBundleUpdateWithSpec(t *testing.T) { + cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // Create a draft bundle from build 1 + createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "default", true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + assertStatusDraft(t, lcManager, tests.LcRbName1, number1) + assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleBuild1Artifacts()) + + // Update the draft bundle by adding build 3 (which includes dependencies) using spec file + updateSpecFile, err := tests.CreateSpec(tests.LifecycleBuilds3) + assert.NoError(t, err) + updateRbWithFlags(t, updateSpecFile, tests.LcRbName1, number1, "default", "", true) + + // Verify the bundle is still in DRAFT status after update + assertStatusDraft(t, lcManager, tests.LcRbName1, number1) + + // Verify the bundle now contains artifacts from both build 1 and build 3 + assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleUpdateArtifacts()) +} + +func TestReleaseBundleUpdateWithFlags(t *testing.T) { + cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // Create a draft bundle from build 2 + createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + assertStatusDraft(t, lcManager, tests.LcRbName2, number2) + assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleBuild2Artifacts()) + + // Update draft using --source-type-builds flag to add build 3 + sourceBuildsFlag := fmt.Sprintf("name=%s,id=%s,include-deps=true", tests.LcBuildName3, number3) + updateRbWithFlags(t, "", tests.LcRbName2, number2, "default", sourceBuildsFlag, true) + + // Verify the bundle is still in DRAFT status after update + assertStatusDraft(t, lcManager, tests.LcRbName2, number2) + + // Verify the bundle now contains artifacts from both build 2 and build 3 + assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleUpdateBuild2Artifacts()) +} + /*func deleteExportedReleaseBundle(t *testing.T, rbName string) { assert.NoError(t, os.RemoveAll(rbName)) }*/ @@ -439,13 +509,19 @@ func uploadBuildsWithProject(t *testing.T) func() { func createRbBackwardCompatible(t *testing.T, specName, sourceOption, rbName, rbVersion string, sync bool) { specFile, err := getSpecFile(specName) assert.NoError(t, err) - createRbWithFlags(t, specFile, sourceOption, "", "", rbName, rbVersion, "", sync, false) + createRbWithFlags(t, specFile, sourceOption, "", "", rbName, rbVersion, "", sync, false, false) } func createRbFromSpec(t *testing.T, specName, rbName, rbVersion string, sync bool, withoutSigningKey bool) { specFile, err := tests.CreateSpec(specName) assert.NoError(t, err) - createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey) + createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, false) +} + +func createRbFromSpecWithDraft(t *testing.T, specName, rbName, rbVersion string, sync, withoutSigningKey, draft bool) { + specFile, err := tests.CreateSpec(specName) + assert.NoError(t, err) + createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, draft) } func TestCreateBundleWithoutSpec(t *testing.T) { @@ -457,11 +533,11 @@ func TestCreateBundleWithoutSpec(t *testing.T) { deleteBuilds := uploadBuilds(t) defer deleteBuilds() - createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "default", false, false) + createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "default", false, false, false) assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) - createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", false, true) + createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", false, true, false) assertStatusCompleted(t, lcManager, tests.LcRbName2, number2, "") defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) } @@ -481,13 +557,13 @@ func TestCreateBundleWithoutSpecAndWithProject(t *testing.T) { deleteBuilds := uploadBuildsWithProject(t) defer deleteBuilds() - createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, tests.ProjectKey, false, false) + createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, tests.ProjectKey, false, false, false) assertStatusCompletedWithProject(t, lcManager, tests.LcRbName1, number1, "", tests.ProjectKey) defer deleteReleaseBundleWithProject(t, lcManager, tests.LcRbName1, number1, tests.ProjectKey) } func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buildNumber, rbName, rbVersion, project string, - sync, withoutSigningKey bool, + sync, withoutSigningKey, draft bool, ) { argsAndOptions := []string{ "rbc", @@ -516,6 +592,35 @@ func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buil argsAndOptions = append(argsAndOptions, getOption(cliutils.Project, project)) } + if draft { + argsAndOptions = append(argsAndOptions, getOption(cliutils.Draft, "true")) + } + + assert.NoError(t, lcCli.Exec(argsAndOptions...)) +} + +func updateRbWithFlags(t *testing.T, specFilePath, rbName, rbVersion, project, sourceTypeBuilds string, sync bool) { + argsAndOptions := []string{ + "rbu", + rbName, + rbVersion, + "--add", // Mandatory flag for rbu + } + + if specFilePath != "" { + argsAndOptions = append(argsAndOptions, getOption("spec", specFilePath)) + } + + if sourceTypeBuilds != "" { + argsAndOptions = append(argsAndOptions, getOption("source-type-builds", sourceTypeBuilds)) + } + + if project != "" { + argsAndOptions = append(argsAndOptions, getOption(cliutils.Project, project)) + } + + argsAndOptions = append(argsAndOptions, getOption(cliutils.Sync, strconv.FormatBool(sync))) + assert.NoError(t, lcCli.Exec(argsAndOptions...)) } @@ -580,6 +685,14 @@ func assertStatusCompleted(t *testing.T, lcManager *lifecycle.LifecycleServicesM assert.Equal(t, services.Completed, resp.Status) } +func assertStatusDraft(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) { + resp, err := getStatus(lcManager, rbName, rbVersion, "") + if !assert.NoError(t, err) { + return + } + assert.Equal(t, services.Draft, resp.Status) +} + // If createdMillis is provided, assert status for promotion. If blank, assert for creation. func assertStatusCompletedWithProject(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion, createdMillis, projectKey string) { resp, err := getStatusWithProject(lcManager, rbName, rbVersion, createdMillis, projectKey) @@ -1117,13 +1230,13 @@ func TestReleaseBundlesSearchVersions(t *testing.T) { } // Create release bundles with project - createRbWithFlags(t, "", "", tests.LcBuildName1, number1, projectRbName, projectVersionA, tests.ProjectKey, true, false) + createRbWithFlags(t, "", "", tests.LcBuildName1, number1, projectRbName, projectVersionA, tests.ProjectKey, true, false, false) defer deleteReleaseBundleWithProject(t, lcManager, projectRbName, projectVersionA, tests.ProjectKey) assertStatusCompletedWithProject(t, lcManager, projectRbName, projectVersionA, "", tests.ProjectKey) time.Sleep(1 * time.Second) - createRbWithFlags(t, "", "", tests.LcBuildName2, number2, projectRbName, projectVersionB, tests.ProjectKey, true, false) + createRbWithFlags(t, "", "", tests.LcBuildName2, number2, projectRbName, projectVersionB, tests.ProjectKey, true, false, false) defer deleteReleaseBundleWithProject(t, lcManager, projectRbName, projectVersionB, tests.ProjectKey) assertStatusCompletedWithProject(t, lcManager, projectRbName, projectVersionB, "", tests.ProjectKey) diff --git a/utils/cliutils/commandsflags.go b/utils/cliutils/commandsflags.go index 7c3e1ebc2..8d7768a0d 100644 --- a/utils/cliutils/commandsflags.go +++ b/utils/cliutils/commandsflags.go @@ -592,6 +592,7 @@ const ( SigningKey = "signing-key" setupRepo = repo PromotionType = "promotion-type" + Draft = "draft" ) var flagsMap = map[string]cli.Flag{ diff --git a/utils/tests/consts.go b/utils/tests/consts.go index 8910cf920..17a7b68e5 100644 --- a/utils/tests/consts.go +++ b/utils/tests/consts.go @@ -2156,6 +2156,46 @@ func GetExpectedLifecycleCreationByAql() []string { } } +// GetExpectedLifecycleBuild1Artifacts returns expected artifacts from build 1 only. +func GetExpectedLifecycleBuild1Artifacts() []string { + return []string{ + RtDevRepo + "/a1.in", + RtDevRepo + "/a2.in", + RtDevRepo + "/a3.in", + } +} + +// GetExpectedLifecycleUpdateArtifacts returns expected artifacts after updating a draft bundle +// that was created from build 1 (a1.in, a2.in, a3.in) with build 3 (dep-file as dependency). +func GetExpectedLifecycleUpdateArtifacts() []string { + return []string{ + RtDevRepo + "/a1.in", + RtDevRepo + "/a2.in", + RtDevRepo + "/a3.in", + RtDevRepo + "/dep-file", + } +} + +// GetExpectedLifecycleBuild2Artifacts returns expected artifacts from build 2 only. +func GetExpectedLifecycleBuild2Artifacts() []string { + return []string{ + RtDevRepo + "/b1.in", + RtDevRepo + "/b2.in", + RtDevRepo + "/b3.in", + } +} + +// GetExpectedLifecycleUpdateBuild2Artifacts returns expected artifacts after updating a draft bundle +// that was created from build 2 (b1.in, b2.in, b3.in) with build 3 (dep-file as dependency). +func GetExpectedLifecycleUpdateBuild2Artifacts() []string { + return []string{ + RtDevRepo + "/b1.in", + RtDevRepo + "/b2.in", + RtDevRepo + "/b3.in", + RtDevRepo + "/dep-file", + } +} + func GetExpectedLifecycleArtifacts() []string { return []string{ RtProdRepo1 + "/a1.in", From 004d227a7925d33b517a2d5a862e34a974ecce7b Mon Sep 17 00:00:00 2001 From: kfirh Date: Sun, 1 Feb 2026 17:33:31 +0200 Subject: [PATCH 02/12] Added e2e tests for create and update of a draft release bundle commands --- testdata/gradle/civcsproject/build.gradle | 59 ++++++++++++++++++++ testdata/gradle/civcsproject/settings.gradle | 1 + 2 files changed, 60 insertions(+) create mode 100644 testdata/gradle/civcsproject/build.gradle create mode 100644 testdata/gradle/civcsproject/settings.gradle diff --git a/testdata/gradle/civcsproject/build.gradle b/testdata/gradle/civcsproject/build.gradle new file mode 100644 index 000000000..029aeeb68 --- /dev/null +++ b/testdata/gradle/civcsproject/build.gradle @@ -0,0 +1,59 @@ +import org.gradle.util.GradleVersion + +apply plugin: 'java' +apply plugin: 'maven-publish' + +// Check if Gradle version supports allowInsecureProtocol (6.2+) +def supportsInsecureProtocol = GradleVersion.current() >= GradleVersion.version("6.2") + +repositories { + mavenCentral() +} + +allprojects { + repositories.all { repo -> + try { + def urlStr = repo.respondsTo('getUrl') && repo.url != null ? repo.url.toString() : "" + if (urlStr.startsWith("http://") && repo.hasProperty("allowInsecureProtocol")) { + repo.allowInsecureProtocol = true + } + } catch (Throwable ignored) { + // Best-effort; ignore repositories that don't support URL/allowInsecureProtocol. + } + } +} + +group = 'org.jfrog.test' +version = '1.0' + +dependencies { + implementation "junit:junit:4.7" +} + +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + artifactId = 'civcs-example' + } + } + repositories { + maven { + name = "Artifactory" + // URL uses template variables replaced by test framework + url = uri("${URL}artifactory/${GRADLE_REPO}") + credentials { + username = "${USERNAME}" + password = "${PASSWORD}" + } + // Only set allowInsecureProtocol for Gradle 6.2+ (when using HTTP) + if (supportsInsecureProtocol) { + allowInsecureProtocol = true + } + } + } +} + +tasks.withType(GenerateModuleMetadata) { + enabled = false +} diff --git a/testdata/gradle/civcsproject/settings.gradle b/testdata/gradle/civcsproject/settings.gradle new file mode 100644 index 000000000..b002a8d19 --- /dev/null +++ b/testdata/gradle/civcsproject/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'civcs-example' From 01e7ed73182810c6c5b1541173c926f874ce1482 Mon Sep 17 00:00:00 2001 From: kfirh Date: Sun, 1 Feb 2026 17:38:50 +0200 Subject: [PATCH 03/12] Added e2e tests for create and update of a draft release bundle commands --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 89df4f273..247f3ffaa 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/docker/docker v28.5.2+incompatible github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 github.com/jfrog/archiver/v3 v3.6.1 - github.com/jfrog/build-info-go v1.13.1-0.20260120103048-d7f367bfa36e + github.com/jfrog/build-info-go v1.13.1-0.20260130140656-2d0d5593fccf github.com/jfrog/gofrog v1.7.6 github.com/jfrog/jfrog-cli-application v1.0.2-0.20260127112223-c5078af84b5a github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260201084712-af3845a393d3 diff --git a/go.sum b/go.sum index 10263b204..986c80a90 100644 --- a/go.sum +++ b/go.sum @@ -1206,8 +1206,8 @@ github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI= github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= -github.com/jfrog/build-info-go v1.13.1-0.20260120103048-d7f367bfa36e h1:STiWjuLtlEFR1H3kSKw6vDGhGdtUmV6O+ljPfrQ14sI= -github.com/jfrog/build-info-go v1.13.1-0.20260120103048-d7f367bfa36e/go.mod h1:+OCtMb22/D+u7Wne5lzkjJjaWr0LRZcHlDwTH86Mpwo= +github.com/jfrog/build-info-go v1.13.1-0.20260130140656-2d0d5593fccf h1:BDaC0fek3yu20zbCOSozoM5+NzZe6u7wXAvufCmTkO0= +github.com/jfrog/build-info-go v1.13.1-0.20260130140656-2d0d5593fccf/go.mod h1:+OCtMb22/D+u7Wne5lzkjJjaWr0LRZcHlDwTH86Mpwo= github.com/jfrog/froggit-go v1.20.6 h1:Xp7+LlEh0m1KGrQstb+u0aGfjRUtv1eh9xQBV3571jQ= github.com/jfrog/froggit-go v1.20.6/go.mod h1:obSG1SlsWjktkuqmKtpq7MNTTL63e0ot+ucTnlOMV88= github.com/jfrog/go-mockhttp v0.3.1 h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8= From c0668642e9ca4fe030cc0160cb7e375b60c3e9a1 Mon Sep 17 00:00:00 2001 From: kfirh Date: Sun, 1 Feb 2026 23:29:08 +0200 Subject: [PATCH 04/12] Added e2e tests for create and update of a draft release bundle commands --- .github/workflows/lifecycleTests.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/lifecycleTests.yml b/.github/workflows/lifecycleTests.yml index ce5c417a9..946abf5e4 100644 --- a/.github/workflows/lifecycleTests.yml +++ b/.github/workflows/lifecycleTests.yml @@ -55,6 +55,17 @@ jobs: if: matrix.os.name != 'macos' uses: jfrog/.github/actions/install-go-with-cache@main + - name: Force fresh module download + if: matrix.os.name != 'macos' + run: | + echo "=== Current jfrog-client-go in go.mod ===" + grep jfrog-client-go go.mod + echo "=== Clearing module cache and downloading fresh ===" + go clean -modcache + go mod download + echo "=== Resolved jfrog-client-go version ===" + go list -m github.com/jfrog/jfrog-client-go + - name: Debug macOS Environment and Set Timeout if: runner.os == 'macOS' run: | From cbe18f2b81506ab587597bde21cd251ba98b44c9 Mon Sep 17 00:00:00 2001 From: kfirh Date: Mon, 2 Feb 2026 12:23:51 +0200 Subject: [PATCH 05/12] Added e2e tests for create and update of a draft release bundle commands --- .github/workflows/lifecycleTests.yml | 11 --- go.mod | 2 +- go.sum | 4 +- lifecycle_test.go | 108 +++++++++++++-------------- 4 files changed, 57 insertions(+), 68 deletions(-) diff --git a/.github/workflows/lifecycleTests.yml b/.github/workflows/lifecycleTests.yml index 946abf5e4..ce5c417a9 100644 --- a/.github/workflows/lifecycleTests.yml +++ b/.github/workflows/lifecycleTests.yml @@ -55,17 +55,6 @@ jobs: if: matrix.os.name != 'macos' uses: jfrog/.github/actions/install-go-with-cache@main - - name: Force fresh module download - if: matrix.os.name != 'macos' - run: | - echo "=== Current jfrog-client-go in go.mod ===" - grep jfrog-client-go go.mod - echo "=== Clearing module cache and downloading fresh ===" - go clean -modcache - go mod download - echo "=== Resolved jfrog-client-go version ===" - go list -m github.com/jfrog/jfrog-client-go - - name: Debug macOS Environment and Set Timeout if: runner.os == 'macOS' run: | diff --git a/go.mod b/go.mod index 247f3ffaa..694993a37 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20260125120022-1c6f4f382dbb github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e github.com/jfrog/jfrog-cli-security v1.26.0 - github.com/jfrog/jfrog-client-go v1.55.1-0.20260201135506-ffd03518ef56 + github.com/jfrog/jfrog-client-go v1.55.1-0.20260202100450-1b20bddfdb3f github.com/jszwec/csvutil v1.10.0 github.com/manifoldco/promptui v0.9.0 github.com/spf13/viper v1.21.0 diff --git a/go.sum b/go.sum index 986c80a90..8222f90bd 100644 --- a/go.sum +++ b/go.sum @@ -1228,8 +1228,8 @@ github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b000 github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e/go.mod h1:qbu4iqBST9x8LgD8HhzUm91iOB3vHqtoGmaxOnmw0ok= github.com/jfrog/jfrog-cli-security v1.26.0 h1:FcLshS1Ahm0++nV5q7UluFTCVRxH2wEIbqO7ZBag++I= github.com/jfrog/jfrog-cli-security v1.26.0/go.mod h1:r9E0BdlNy6mq6gkRGslZRZaYe6WeGhLkpUm8+oEUOvU= -github.com/jfrog/jfrog-client-go v1.55.1-0.20260201135506-ffd03518ef56 h1:MLbEex8JxLDj4bh62ZjQu16Qgfu8BPcKnlSTtizipe8= -github.com/jfrog/jfrog-client-go v1.55.1-0.20260201135506-ffd03518ef56/go.mod h1:sCE06+GngPoyrGO0c+vmhgMoVSP83UMNiZnIuNPzU8U= +github.com/jfrog/jfrog-client-go v1.55.1-0.20260202100450-1b20bddfdb3f h1:A/5DenqKB4zv9jWhG777/UwhoGL8hCzIndKj0sJ7QSM= +github.com/jfrog/jfrog-client-go v1.55.1-0.20260202100450-1b20bddfdb3f/go.mod h1:sCE06+GngPoyrGO0c+vmhgMoVSP83UMNiZnIuNPzU8U= github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= diff --git a/lifecycle_test.go b/lifecycle_test.go index 6376da1db..1e27109ec 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -502,62 +502,62 @@ func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) assertStatusDraft(t, lcManager, tests.LcRbName1, number1) - // Test 2: Create draft bundle using build-name/build-number flags - createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) - defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - assertStatusDraft(t, lcManager, tests.LcRbName2, number2) -} - -func TestReleaseBundleUpdateWithSpec(t *testing.T) { - cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) - defer cleanCallback() - lcManager := getLcServiceManager(t) - - deleteBuilds := uploadBuilds(t) - defer deleteBuilds() - - // Create a draft bundle from build 1 - createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "default", true, true, true) - defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) - assertStatusDraft(t, lcManager, tests.LcRbName1, number1) - assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleBuild1Artifacts()) - - // Update the draft bundle by adding build 3 (which includes dependencies) using spec file - updateSpecFile, err := tests.CreateSpec(tests.LifecycleBuilds3) - assert.NoError(t, err) - updateRbWithFlags(t, updateSpecFile, tests.LcRbName1, number1, "default", "", true) - - // Verify the bundle is still in DRAFT status after update - assertStatusDraft(t, lcManager, tests.LcRbName1, number1) - - // Verify the bundle now contains artifacts from both build 1 and build 3 - assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleUpdateArtifacts()) + //// Test 2: Create draft bundle using build-name/build-number flags + //createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) + //defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + //assertStatusDraft(t, lcManager, tests.LcRbName2, number2) } -func TestReleaseBundleUpdateWithFlags(t *testing.T) { - cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) - defer cleanCallback() - lcManager := getLcServiceManager(t) - - deleteBuilds := uploadBuilds(t) - defer deleteBuilds() - - // Create a draft bundle from build 2 - createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) - defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - assertStatusDraft(t, lcManager, tests.LcRbName2, number2) - assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleBuild2Artifacts()) - - // Update draft using --source-type-builds flag to add build 3 - sourceBuildsFlag := fmt.Sprintf("name=%s,id=%s,include-deps=true", tests.LcBuildName3, number3) - updateRbWithFlags(t, "", tests.LcRbName2, number2, "default", sourceBuildsFlag, true) - - // Verify the bundle is still in DRAFT status after update - assertStatusDraft(t, lcManager, tests.LcRbName2, number2) - - // Verify the bundle now contains artifacts from both build 2 and build 3 - assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleUpdateBuild2Artifacts()) -} +//func TestReleaseBundleUpdateWithSpec(t *testing.T) { +// cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) +// defer cleanCallback() +// lcManager := getLcServiceManager(t) +// +// deleteBuilds := uploadBuilds(t) +// defer deleteBuilds() +// +// // Create a draft bundle from build 1 +// createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "default", true, true, true) +// defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) +// assertStatusDraft(t, lcManager, tests.LcRbName1, number1) +// assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleBuild1Artifacts()) +// +// // Update the draft bundle by adding build 3 (which includes dependencies) using spec file +// updateSpecFile, err := tests.CreateSpec(tests.LifecycleBuilds3) +// assert.NoError(t, err) +// updateRbWithFlags(t, updateSpecFile, tests.LcRbName1, number1, "default", "", true) +// +// // Verify the bundle is still in DRAFT status after update +// assertStatusDraft(t, lcManager, tests.LcRbName1, number1) +// +// // Verify the bundle now contains artifacts from both build 1 and build 3 +// assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleUpdateArtifacts()) +//} + +//func TestReleaseBundleUpdateWithFlags(t *testing.T) { +// cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) +// defer cleanCallback() +// lcManager := getLcServiceManager(t) +// +// deleteBuilds := uploadBuilds(t) +// defer deleteBuilds() +// +// // Create a draft bundle from build 2 +// createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) +// defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) +// assertStatusDraft(t, lcManager, tests.LcRbName2, number2) +// assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleBuild2Artifacts()) +// +// // Update draft using --source-type-builds flag to add build 3 +// sourceBuildsFlag := fmt.Sprintf("name=%s,id=%s,include-deps=true", tests.LcBuildName3, number3) +// updateRbWithFlags(t, "", tests.LcRbName2, number2, "default", sourceBuildsFlag, true) +// +// // Verify the bundle is still in DRAFT status after update +// assertStatusDraft(t, lcManager, tests.LcRbName2, number2) +// +// // Verify the bundle now contains artifacts from both build 2 and build 3 +// assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleUpdateBuild2Artifacts()) +//} /*func deleteExportedReleaseBundle(t *testing.T, rbName string) { assert.NoError(t, os.RemoveAll(rbName)) From 601fcaea455fd3e3c42b53e5bcc43006075b7afa Mon Sep 17 00:00:00 2001 From: kfirh Date: Mon, 2 Feb 2026 12:30:38 +0200 Subject: [PATCH 06/12] Added e2e tests for create and update of a draft release bundle commands --- lifecycle_test.go | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index 1e27109ec..641e3a582 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -503,12 +503,12 @@ func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { assertStatusDraft(t, lcManager, tests.LcRbName1, number1) //// Test 2: Create draft bundle using build-name/build-number flags - //createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) - //defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - //assertStatusDraft(t, lcManager, tests.LcRbName2, number2) + // createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) + // defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + // assertStatusDraft(t, lcManager, tests.LcRbName2, number2) } -//func TestReleaseBundleUpdateWithSpec(t *testing.T) { +// func TestReleaseBundleUpdateWithSpec(t *testing.T) { // cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) // defer cleanCallback() // lcManager := getLcServiceManager(t) @@ -534,7 +534,7 @@ func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { // assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleUpdateArtifacts()) //} -//func TestReleaseBundleUpdateWithFlags(t *testing.T) { +// func TestReleaseBundleUpdateWithFlags(t *testing.T) { // cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) // defer cleanCallback() // lcManager := getLcServiceManager(t) @@ -684,30 +684,30 @@ func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buil assert.NoError(t, lcCli.Exec(argsAndOptions...)) } -func updateRbWithFlags(t *testing.T, specFilePath, rbName, rbVersion, project, sourceTypeBuilds string, sync bool) { - argsAndOptions := []string{ - "rbu", - rbName, - rbVersion, - "--add", // Mandatory flag for rbu - } - - if specFilePath != "" { - argsAndOptions = append(argsAndOptions, getOption("spec", specFilePath)) - } - - if sourceTypeBuilds != "" { - argsAndOptions = append(argsAndOptions, getOption("source-type-builds", sourceTypeBuilds)) - } - - if project != "" { - argsAndOptions = append(argsAndOptions, getOption(cliutils.Project, project)) - } - - argsAndOptions = append(argsAndOptions, getOption(cliutils.Sync, strconv.FormatBool(sync))) - - assert.NoError(t, lcCli.Exec(argsAndOptions...)) -} +// func updateRbWithFlags(t *testing.T, specFilePath, rbName, rbVersion, project, sourceTypeBuilds string, sync bool) { +// argsAndOptions := []string{ +// "rbu", +// rbName, +// rbVersion, +// "--add", // Mandatory flag for rbu +// } +// +// if specFilePath != "" { +// argsAndOptions = append(argsAndOptions, getOption("spec", specFilePath)) +// } +// +// if sourceTypeBuilds != "" { +// argsAndOptions = append(argsAndOptions, getOption("source-type-builds", sourceTypeBuilds)) +// } +// +// if project != "" { +// argsAndOptions = append(argsAndOptions, getOption(cliutils.Project, project)) +// } +// +// argsAndOptions = append(argsAndOptions, getOption(cliutils.Sync, strconv.FormatBool(sync))) +// +// assert.NoError(t, lcCli.Exec(argsAndOptions...)) +//} /*func exportRb(t *testing.T, rbName, rbVersion, targetPath string) { lcCli.RunCliCmdWithOutput(t, "rbe", rbName, rbVersion, targetPath+"/") From 16bfd41ea459fd716e54e7e0a176682f7465caae Mon Sep 17 00:00:00 2001 From: kfirh Date: Mon, 2 Feb 2026 12:51:28 +0200 Subject: [PATCH 07/12] Added e2e tests for create and update of a draft release bundle commands --- lifecycle_test.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index 641e3a582..b7e1aa1a3 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -489,24 +489,24 @@ func TestPromoteReleaseBundleWithPromotionTypeFlag(t *testing.T) { assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") } -func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { - cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) - defer cleanCallback() - lcManager := getLcServiceManager(t) - - deleteBuilds := uploadBuilds(t) - defer deleteBuilds() - - // Test 1: Create draft bundle from spec - createRbFromSpecWithDraft(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true, true) - defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) - assertStatusDraft(t, lcManager, tests.LcRbName1, number1) - - //// Test 2: Create draft bundle using build-name/build-number flags - // createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) - // defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - // assertStatusDraft(t, lcManager, tests.LcRbName2, number2) -} +// func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { +// cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) +// defer cleanCallback() +// lcManager := getLcServiceManager(t) +// +// deleteBuilds := uploadBuilds(t) +// defer deleteBuilds() +// +// // Test 1: Create draft bundle from spec +// createRbFromSpecWithDraft(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true, true) +// defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) +// assertStatusDraft(t, lcManager, tests.LcRbName1, number1) +// +// //// Test 2: Create draft bundle using build-name/build-number flags +// // createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) +// // defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) +// // assertStatusDraft(t, lcManager, tests.LcRbName2, number2) +//} // func TestReleaseBundleUpdateWithSpec(t *testing.T) { // cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) From b46723b2c140e4fec384f50b23b9322698bfd472 Mon Sep 17 00:00:00 2001 From: kfirh Date: Mon, 2 Feb 2026 12:56:23 +0200 Subject: [PATCH 08/12] Added e2e tests for create and update of a draft release bundle commands --- lifecycle_test.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index b7e1aa1a3..3d35e7fff 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -603,11 +603,11 @@ func createRbFromSpec(t *testing.T, specName, rbName, rbVersion string, sync boo createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, false) } -func createRbFromSpecWithDraft(t *testing.T, specName, rbName, rbVersion string, sync, withoutSigningKey, draft bool) { - specFile, err := tests.CreateSpec(specName) - assert.NoError(t, err) - createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, draft) -} +// func createRbFromSpecWithDraft(t *testing.T, specName, rbName, rbVersion string, sync, withoutSigningKey, draft bool) { +// specFile, err := tests.CreateSpec(specName) +// assert.NoError(t, err) +// createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, draft) +//} func TestCreateBundleWithoutSpec(t *testing.T) { cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) @@ -770,13 +770,13 @@ func assertStatusCompleted(t *testing.T, lcManager *lifecycle.LifecycleServicesM assert.Equal(t, services.Completed, resp.Status) } -func assertStatusDraft(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) { - resp, err := getStatus(lcManager, rbName, rbVersion, "") - if !assert.NoError(t, err) { - return - } - assert.Equal(t, services.Draft, resp.Status) -} +// func assertStatusDraft(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) { +// resp, err := getStatus(lcManager, rbName, rbVersion, "") +// if !assert.NoError(t, err) { +// return +// } +// assert.Equal(t, services.Draft, resp.Status) +//} // If createdMillis is provided, assert status for promotion. If blank, assert for creation. // From 08fa760a5b1b875f6ee98fa35d89e9cc78d4b354 Mon Sep 17 00:00:00 2001 From: kfirh Date: Mon, 2 Feb 2026 13:09:38 +0200 Subject: [PATCH 09/12] Added e2e tests for create and update of a draft release bundle commands --- lifecycle_test.go | 60 +++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index 3d35e7fff..641e3a582 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -489,24 +489,24 @@ func TestPromoteReleaseBundleWithPromotionTypeFlag(t *testing.T) { assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") } -// func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { -// cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) -// defer cleanCallback() -// lcManager := getLcServiceManager(t) -// -// deleteBuilds := uploadBuilds(t) -// defer deleteBuilds() -// -// // Test 1: Create draft bundle from spec -// createRbFromSpecWithDraft(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true, true) -// defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) -// assertStatusDraft(t, lcManager, tests.LcRbName1, number1) -// -// //// Test 2: Create draft bundle using build-name/build-number flags -// // createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) -// // defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) -// // assertStatusDraft(t, lcManager, tests.LcRbName2, number2) -//} +func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { + cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // Test 1: Create draft bundle from spec + createRbFromSpecWithDraft(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + assertStatusDraft(t, lcManager, tests.LcRbName1, number1) + + //// Test 2: Create draft bundle using build-name/build-number flags + // createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) + // defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + // assertStatusDraft(t, lcManager, tests.LcRbName2, number2) +} // func TestReleaseBundleUpdateWithSpec(t *testing.T) { // cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) @@ -603,11 +603,11 @@ func createRbFromSpec(t *testing.T, specName, rbName, rbVersion string, sync boo createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, false) } -// func createRbFromSpecWithDraft(t *testing.T, specName, rbName, rbVersion string, sync, withoutSigningKey, draft bool) { -// specFile, err := tests.CreateSpec(specName) -// assert.NoError(t, err) -// createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, draft) -//} +func createRbFromSpecWithDraft(t *testing.T, specName, rbName, rbVersion string, sync, withoutSigningKey, draft bool) { + specFile, err := tests.CreateSpec(specName) + assert.NoError(t, err) + createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey, draft) +} func TestCreateBundleWithoutSpec(t *testing.T) { cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) @@ -770,13 +770,13 @@ func assertStatusCompleted(t *testing.T, lcManager *lifecycle.LifecycleServicesM assert.Equal(t, services.Completed, resp.Status) } -// func assertStatusDraft(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) { -// resp, err := getStatus(lcManager, rbName, rbVersion, "") -// if !assert.NoError(t, err) { -// return -// } -// assert.Equal(t, services.Draft, resp.Status) -//} +func assertStatusDraft(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) { + resp, err := getStatus(lcManager, rbName, rbVersion, "") + if !assert.NoError(t, err) { + return + } + assert.Equal(t, services.Draft, resp.Status) +} // If createdMillis is provided, assert status for promotion. If blank, assert for creation. // From 23a656a7ba3137abe163db1ddd21462d4f3f16ba Mon Sep 17 00:00:00 2001 From: kfirh Date: Mon, 2 Feb 2026 13:58:39 +0200 Subject: [PATCH 10/12] Added e2e tests for create and update of a draft release bundle commands --- lifecycle_test.go | 156 +++++++++++++++++++++++----------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index 641e3a582..6376da1db 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -502,62 +502,62 @@ func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) assertStatusDraft(t, lcManager, tests.LcRbName1, number1) - //// Test 2: Create draft bundle using build-name/build-number flags - // createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) - // defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - // assertStatusDraft(t, lcManager, tests.LcRbName2, number2) + // Test 2: Create draft bundle using build-name/build-number flags + createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + assertStatusDraft(t, lcManager, tests.LcRbName2, number2) } -// func TestReleaseBundleUpdateWithSpec(t *testing.T) { -// cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) -// defer cleanCallback() -// lcManager := getLcServiceManager(t) -// -// deleteBuilds := uploadBuilds(t) -// defer deleteBuilds() -// -// // Create a draft bundle from build 1 -// createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "default", true, true, true) -// defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) -// assertStatusDraft(t, lcManager, tests.LcRbName1, number1) -// assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleBuild1Artifacts()) -// -// // Update the draft bundle by adding build 3 (which includes dependencies) using spec file -// updateSpecFile, err := tests.CreateSpec(tests.LifecycleBuilds3) -// assert.NoError(t, err) -// updateRbWithFlags(t, updateSpecFile, tests.LcRbName1, number1, "default", "", true) -// -// // Verify the bundle is still in DRAFT status after update -// assertStatusDraft(t, lcManager, tests.LcRbName1, number1) -// -// // Verify the bundle now contains artifacts from both build 1 and build 3 -// assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleUpdateArtifacts()) -//} - -// func TestReleaseBundleUpdateWithFlags(t *testing.T) { -// cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) -// defer cleanCallback() -// lcManager := getLcServiceManager(t) -// -// deleteBuilds := uploadBuilds(t) -// defer deleteBuilds() -// -// // Create a draft bundle from build 2 -// createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) -// defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) -// assertStatusDraft(t, lcManager, tests.LcRbName2, number2) -// assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleBuild2Artifacts()) -// -// // Update draft using --source-type-builds flag to add build 3 -// sourceBuildsFlag := fmt.Sprintf("name=%s,id=%s,include-deps=true", tests.LcBuildName3, number3) -// updateRbWithFlags(t, "", tests.LcRbName2, number2, "default", sourceBuildsFlag, true) -// -// // Verify the bundle is still in DRAFT status after update -// assertStatusDraft(t, lcManager, tests.LcRbName2, number2) -// -// // Verify the bundle now contains artifacts from both build 2 and build 3 -// assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleUpdateBuild2Artifacts()) -//} +func TestReleaseBundleUpdateWithSpec(t *testing.T) { + cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // Create a draft bundle from build 1 + createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "default", true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + assertStatusDraft(t, lcManager, tests.LcRbName1, number1) + assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleBuild1Artifacts()) + + // Update the draft bundle by adding build 3 (which includes dependencies) using spec file + updateSpecFile, err := tests.CreateSpec(tests.LifecycleBuilds3) + assert.NoError(t, err) + updateRbWithFlags(t, updateSpecFile, tests.LcRbName1, number1, "default", "", true) + + // Verify the bundle is still in DRAFT status after update + assertStatusDraft(t, lcManager, tests.LcRbName1, number1) + + // Verify the bundle now contains artifacts from both build 1 and build 3 + assertRbArtifacts(t, lcManager, tests.LcRbName1, number1, tests.GetExpectedLifecycleUpdateArtifacts()) +} + +func TestReleaseBundleUpdateWithFlags(t *testing.T) { + cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // Create a draft bundle from build 2 + createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + assertStatusDraft(t, lcManager, tests.LcRbName2, number2) + assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleBuild2Artifacts()) + + // Update draft using --source-type-builds flag to add build 3 + sourceBuildsFlag := fmt.Sprintf("name=%s,id=%s,include-deps=true", tests.LcBuildName3, number3) + updateRbWithFlags(t, "", tests.LcRbName2, number2, "default", sourceBuildsFlag, true) + + // Verify the bundle is still in DRAFT status after update + assertStatusDraft(t, lcManager, tests.LcRbName2, number2) + + // Verify the bundle now contains artifacts from both build 2 and build 3 + assertRbArtifacts(t, lcManager, tests.LcRbName2, number2, tests.GetExpectedLifecycleUpdateBuild2Artifacts()) +} /*func deleteExportedReleaseBundle(t *testing.T, rbName string) { assert.NoError(t, os.RemoveAll(rbName)) @@ -684,30 +684,30 @@ func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buil assert.NoError(t, lcCli.Exec(argsAndOptions...)) } -// func updateRbWithFlags(t *testing.T, specFilePath, rbName, rbVersion, project, sourceTypeBuilds string, sync bool) { -// argsAndOptions := []string{ -// "rbu", -// rbName, -// rbVersion, -// "--add", // Mandatory flag for rbu -// } -// -// if specFilePath != "" { -// argsAndOptions = append(argsAndOptions, getOption("spec", specFilePath)) -// } -// -// if sourceTypeBuilds != "" { -// argsAndOptions = append(argsAndOptions, getOption("source-type-builds", sourceTypeBuilds)) -// } -// -// if project != "" { -// argsAndOptions = append(argsAndOptions, getOption(cliutils.Project, project)) -// } -// -// argsAndOptions = append(argsAndOptions, getOption(cliutils.Sync, strconv.FormatBool(sync))) -// -// assert.NoError(t, lcCli.Exec(argsAndOptions...)) -//} +func updateRbWithFlags(t *testing.T, specFilePath, rbName, rbVersion, project, sourceTypeBuilds string, sync bool) { + argsAndOptions := []string{ + "rbu", + rbName, + rbVersion, + "--add", // Mandatory flag for rbu + } + + if specFilePath != "" { + argsAndOptions = append(argsAndOptions, getOption("spec", specFilePath)) + } + + if sourceTypeBuilds != "" { + argsAndOptions = append(argsAndOptions, getOption("source-type-builds", sourceTypeBuilds)) + } + + if project != "" { + argsAndOptions = append(argsAndOptions, getOption(cliutils.Project, project)) + } + + argsAndOptions = append(argsAndOptions, getOption(cliutils.Sync, strconv.FormatBool(sync))) + + assert.NoError(t, lcCli.Exec(argsAndOptions...)) +} /*func exportRb(t *testing.T, rbName, rbVersion, targetPath string) { lcCli.RunCliCmdWithOutput(t, "rbe", rbName, rbVersion, targetPath+"/") From a7ec1ba3d7084806a7aecf9193166ce505d0f477 Mon Sep 17 00:00:00 2001 From: kfirh Date: Mon, 2 Feb 2026 15:29:02 +0200 Subject: [PATCH 11/12] Added e2e tests for create and update of a draft release bundle commands --- lifecycle_test.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index 6376da1db..e61e76aa2 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -38,6 +38,7 @@ const ( artifactoryLifecycleMinVersion = "7.68.3" signingKeyOptionalArtifactoryMinVersion = "7.104.1" promotionTypeFlagArtifactoryMinVersion = "7.106.1" + draftBundleArtifactoryMinVersion = "7.136.0" gpgKeyPairName = "lc-tests-key-pair" lcTestdataPath = "lifecycle" releaseBundlesSpec = "release-bundles-spec.json" @@ -489,27 +490,36 @@ func TestPromoteReleaseBundleWithPromotionTypeFlag(t *testing.T) { assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") } -func TestReleaseBundleCreationWithDraftFlag(t *testing.T) { - cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) +func TestReleaseBundleCreationWithDraftFlagFromSpec(t *testing.T) { + cleanCallback := initLifecycleTest(t, draftBundleArtifactoryMinVersion) defer cleanCallback() lcManager := getLcServiceManager(t) deleteBuilds := uploadBuilds(t) defer deleteBuilds() - // Test 1: Create draft bundle from spec + // Create draft bundle from spec createRbFromSpecWithDraft(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) assertStatusDraft(t, lcManager, tests.LcRbName1, number1) +} + +func TestReleaseBundleCreationWithDraftFlagFromFlags(t *testing.T) { + cleanCallback := initLifecycleTest(t, draftBundleArtifactoryMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) - // Test 2: Create draft bundle using build-name/build-number flags + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // Create draft bundle using build-name/build-number flags createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "default", true, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) assertStatusDraft(t, lcManager, tests.LcRbName2, number2) } func TestReleaseBundleUpdateWithSpec(t *testing.T) { - cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + cleanCallback := initLifecycleTest(t, draftBundleArtifactoryMinVersion) defer cleanCallback() lcManager := getLcServiceManager(t) @@ -535,7 +545,7 @@ func TestReleaseBundleUpdateWithSpec(t *testing.T) { } func TestReleaseBundleUpdateWithFlags(t *testing.T) { - cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion) + cleanCallback := initLifecycleTest(t, draftBundleArtifactoryMinVersion) defer cleanCallback() lcManager := getLcServiceManager(t) From 58026757175a9ffd11a9f553a5fea7d50eff7b68 Mon Sep 17 00:00:00 2001 From: kfirh Date: Tue, 3 Feb 2026 11:41:56 +0200 Subject: [PATCH 12/12] Added e2e tests for create and update of a draft release bundle commands --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 694993a37..4ab4625e5 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/jfrog/build-info-go v1.13.1-0.20260130140656-2d0d5593fccf github.com/jfrog/gofrog v1.7.6 github.com/jfrog/jfrog-cli-application v1.0.2-0.20260127112223-c5078af84b5a - github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260201084712-af3845a393d3 + github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260203090305-f5f8aed71eaf github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260128134755-624b659a398e github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20260125120022-1c6f4f382dbb github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e diff --git a/go.sum b/go.sum index 8222f90bd..e92dc9886 100644 --- a/go.sum +++ b/go.sum @@ -1218,8 +1218,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.20260127112223-c5078af84b5a h1:Yvl7XuMoI1cXk3jzB1oWcZvFy5K3aUAIin9o5GRaqzE= github.com/jfrog/jfrog-cli-application v1.0.2-0.20260127112223-c5078af84b5a/go.mod h1:xum2HquWO5uExa/A7MQs3TgJJVEeoqTR+6Z4mfBr1Xw= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260201084712-af3845a393d3 h1:CGPRVKhCXuDAoK78RyACO04ohI0vvCDfnAk8FUheJJw= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260201084712-af3845a393d3/go.mod h1:+3MYwa3NE2GR10uegJTdfKKvVXURXftN6N3/45OipRM= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260203090305-f5f8aed71eaf h1:3W7qIxrkJkC1K0vB/By3fVyCkU3qgY9SdHQs7o5RNRo= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260203090305-f5f8aed71eaf/go.mod h1:DkLAN+AvZ4v6jcuUStufi9DuhAS1dvSRJhILJyRa9kg= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260128134755-624b659a398e h1:jGtYjWMMfCINDl1JbRtvAijtVwD+j+yvR5BuYMZvRrA= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260128134755-624b659a398e/go.mod h1:+Hnaikp/xCSPD/q7txxRy4Zc0wzjW/usrCSf+6uONSQ= github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20260125120022-1c6f4f382dbb h1:4nGzxRxVcXxkFg95jr+zMjESisZGqSYecXfHsA37rpA=