From 85df6825f1df8dcb77468b4c0f4a17ef1ee10676 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Sun, 4 May 2025 21:27:41 +0300 Subject: [PATCH 01/41] Introduce e2e tests for lifecycle anotate command. --- go.mod | 8 +-- go.sum | 16 ++--- lifecycle_test.go | 173 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 475de67c2..535e94a4e 100644 --- a/go.mod +++ b/go.mod @@ -189,10 +189,10 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) -// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250505105213-0ba559a374cb +replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250508140039-bfb5e9a50dfe -// replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250406105605-ee90d11546f9 +replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a -// replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.2.2-0.20250414045808-41544959f9b9 +replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250509052840-40acf11c6080 -// replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.16.3-0.20250402121228-12cce9f88504 +replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020 diff --git a/go.sum b/go.sum index c8baf6581..80b63068f 100644 --- a/go.sum +++ b/go.sum @@ -186,16 +186,16 @@ github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s= github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4= github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYLipdsOFMY= github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= -github.com/jfrog/jfrog-cli-artifactory v0.2.4 h1:n/BlqkH20jW8T1JPr/QHw+D+wsPZsDU0Qq/+eSGzgAg= -github.com/jfrog/jfrog-cli-artifactory v0.2.4/go.mod h1:tXlrvTtG4l0dPdKFG7nlteuSv7vggF/OVwsq44sgVgA= -github.com/jfrog/jfrog-cli-core/v2 v2.58.5 h1:q6HeK1NHgpjAtgNQ0mfX4buovo/CAGTP5C0s7UMg7aQ= -github.com/jfrog/jfrog-cli-core/v2 v2.58.5/go.mod h1:JbLdMCWL0xVZZ0FY7jd+iTi/gKYqRmRpeLBhAFtldfQ= +github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250509052840-40acf11c6080 h1:UWqfVXAvKdfru1k7PwNjZXuufcJR6HukzfThz+J2nFw= +github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250509052840-40acf11c6080/go.mod h1:MVap+qb0Gft98yJdPe2si2GqtxQczDVEuC8oxbUTDLk= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250508140039-bfb5e9a50dfe h1:17ZlsX/X4orRHqFoyGnEBHIfKFu49AVvyVoRqk7635E= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250508140039-bfb5e9a50dfe/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= github.com/jfrog/jfrog-cli-platform-services v1.9.0 h1:r/ETgJuMUOUu12w20ydsF6paqEaj0khH6bxMRsdNz1Y= github.com/jfrog/jfrog-cli-platform-services v1.9.0/go.mod h1:pMZMSwhj7yA4VKyj0Skr2lObIyGpZUxNJ40DSLKXU38= -github.com/jfrog/jfrog-cli-security v1.17.1 h1:4gXZ9Q59DOBkntMBDjlcVdZ1jaJUn1bFy4Rhr+SAeqA= -github.com/jfrog/jfrog-cli-security v1.17.1/go.mod h1:655eM28gQHUdT6IC6uQf677tqrN1wEcPRzc+8vcM/vA= -github.com/jfrog/jfrog-client-go v1.52.0 h1:MCmHviUqj3X7iqyOokTkyvV5yBWFwZYDPVXYikl4nf0= -github.com/jfrog/jfrog-client-go v1.52.0/go.mod h1:uRmT8Q1SJymIzId01v0W1o8mGqrRfrwUF53CgEMsH0U= +github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020 h1:CoWRc7ZLXfHojcyzifFG8fwaTniOLg/cDTPhAqQh/dc= +github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020/go.mod h1:9E95ny3WrNoOtMWTtq//SDc0PEnDZxZr3E2o+f90uMk= +github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a h1:QkebmsUWuurSgp4Lx7k6GtQ0sX3RmJ/d2n+NQ2l2g/E= +github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a/go.mod h1:uRmT8Q1SJymIzId01v0W1o8mGqrRfrwUF53CgEMsH0U= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jszwec/csvutil v1.10.0 h1:upMDUxhQKqZ5ZDCs/wy+8Kib8rZR8I8lOR34yJkdqhI= diff --git a/lifecycle_test.go b/lifecycle_test.go index b91ef9d75..14153264b 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -12,12 +12,14 @@ import ( "github.com/jfrog/jfrog-cli/inttestutils" "github.com/jfrog/jfrog-cli/utils/cliutils" "github.com/jfrog/jfrog-cli/utils/tests" + artifactoryclientUtils "github.com/jfrog/jfrog-client-go/artifactory/services/utils" "github.com/jfrog/jfrog-client-go/http/httpclient" "github.com/jfrog/jfrog-client-go/lifecycle" "github.com/jfrog/jfrog-client-go/lifecycle/services" clientUtils "github.com/jfrog/jfrog-client-go/utils" "github.com/jfrog/jfrog-client-go/utils/errorutils" "github.com/jfrog/jfrog-client-go/utils/io/fileutils" + "github.com/jfrog/jfrog-client-go/utils/log" clientTestUtils "github.com/jfrog/jfrog-client-go/utils/tests" "github.com/stretchr/testify/assert" "net/http" @@ -40,6 +42,9 @@ const ( prodEnvironment = "PROD" number1, number2, number3 = "111", "222", "333" withoutSigningKey = true + artifactoryLifecycleSetTagMinVersion = "7.111.0" + rbManifestName = "release-bundle.json.evd" + releaseBundlesV2 = "release-bundles-v2" ) var ( @@ -456,6 +461,174 @@ func deleteReleaseBundleWithProject(t *testing.T, lcManager *lifecycle.Lifecycle time.Sleep(5 * time.Second) } +func TestSetReleaseBundleTag(t *testing.T) { + cleanCallback := initLifecycleTest(t, artifactoryLifecycleSetTagMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // set tag + createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + + assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") + setReleaseBundleTag(t, lcManager, tests.LcRbName1, number1, "", "bundle-tag") + + // unset tag + createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName2, number1, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number1) + assertStatusCompleted(t, lcManager, tests.LcRbName2, number1, "") + setReleaseBundleTag(t, lcManager, tests.LcRbName1, number1, "", "bundle-tag") + unsetReleaseBundleTag(t, lcManager, tests.LcRbName1, number1) +} + +func unsetReleaseBundleTag(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, version string) { + setReleaseBundleTag(t, lcManager, rbName, version, "", "") +} + +func TestReleaseBundleCreateOrUpdateProperties(t *testing.T) { + cleanCallback := initLifecycleTest(t, artifactoryLifecycleSetTagMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // set properties + createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") + setReleaseBundleProperties(t, lcManager, tests.LcRbName1, number1, "default", + "key1=value1;key2=value2") + setReleaseBundleProperties(t, lcManager, tests.LcRbName1, number1, "default", + "key1=value1;key2=''") +} + +func TestReleaseBundleDeleteProperties(t *testing.T) { + cleanCallback := initLifecycleTest(t, artifactoryLifecycleSetTagMinVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + // set and delete properties + createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") + setReleaseBundleProperties(t, lcManager, tests.LcRbName1, number1, "default", + "key1=value1;key2=value2") + deleteReleaseBundleProperties(t, lcManager, tests.LcRbName1, number1, "default", "key1,key2") +} + +func deleteReleaseBundleProperties(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, + rbVersion, projectKey, delProps string) { + rbDetails := services.ReleaseBundleDetails{ + ReleaseBundleName: rbName, + ReleaseBundleVersion: rbVersion, + } + queryParams := services.CommonOptionalQueryParams{ + Async: false, + ProjectKey: projectKey, + } + + annotateParams := buildAnnotateParams("", "", delProps, false, false, + true, rbDetails, queryParams) + assert.NoError(t, lcManager.AnnotateReleaseBundle(annotateParams)) + // Wait after remote deleting. Can be removed once remote deleting supports sync. + time.Sleep(5 * time.Second) +} + +func setReleaseBundleTag(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion, + projectKey, tag string) { + log.Info(fmt.Sprintf("Setting release bundle tag=%s to: %s/%s", tag, rbName, rbVersion)) + rbDetails := services.ReleaseBundleDetails{ + ReleaseBundleName: rbName, + ReleaseBundleVersion: rbVersion, + } + queryParams := services.CommonOptionalQueryParams{ + Async: false, + ProjectKey: projectKey, + } + + annotateParams := buildAnnotateParams(tag, "", "", true, false, false, + rbDetails, queryParams) + assert.NoError(t, lcManager.AnnotateReleaseBundle(annotateParams)) + // Wait after remote deleting. Can be removed once remote deleting supports sync. + time.Sleep(5 * time.Second) +} + +func setReleaseBundleProperties(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion, + projectKey, properties string) { + rbDetails := services.ReleaseBundleDetails{ + ReleaseBundleName: rbName, + ReleaseBundleVersion: rbVersion, + } + queryParams := services.CommonOptionalQueryParams{ + Async: false, + ProjectKey: projectKey, + } + + annotateParams := buildAnnotateParams("", properties, "", false, true, + false, rbDetails, queryParams) + assert.NoError(t, lcManager.AnnotateReleaseBundle(annotateParams)) + // Wait after remote deleting. Can be removed once remote deleting supports sync. + time.Sleep(5 * time.Second) +} + +func buildAnnotateParams(tag, properties, keysToDelete string, tagExists, propsExist, delExist bool, rbDetails services.ReleaseBundleDetails, + queryParams services.CommonOptionalQueryParams) services.AnnotateOperationParams { + return services.AnnotateOperationParams{ + RbTag: services.RbAnnotationTag{ + Tag: tag, + Exist: tagExists, + }, + RbProps: services.RbAnnotationProps{ + Properties: resolveProps(properties), + Exist: propsExist, + }, + RbDelProps: services.RbDelProps{ + Keys: keysToDelete, + Exist: delExist, + }, + RbDetails: rbDetails, + QueryParams: queryParams, + PropertyParams: services.CommonPropParams{ + Path: buildManifestPath(queryParams.ProjectKey, rbDetails.ReleaseBundleName, rbDetails.ReleaseBundleVersion), + Recursive: false, + }, + ArtifactoryUrl: services.ArtCommonParams{ + Url: serverDetails.ArtifactoryUrl, + }, + } +} + +func buildManifestPath(projectKey, bundleName, bundleVersion string) string { + return fmt.Sprintf("%s/%s/%s/%s", buildRepoKey(projectKey), bundleName, bundleVersion, rbManifestName) +} + +func buildRepoKey(project string) string { + if project == "" || project == "default" { + return releaseBundlesV2 + } + return fmt.Sprintf("%s-%s", project, releaseBundlesV2) +} + +func resolveProps(properties string) map[string][]string { + if properties == "" { + return make(map[string][]string) + } + + props, err := artifactoryclientUtils.ParseProperties(properties) + if err != nil { + return make(map[string][]string) + } + + return props.ToMap() +} + /* func remoteDeleteReleaseBundle(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) { params := distribution.NewDistributeReleaseBundleParams(rbName, rbVersion) From 96c55b8608bd43cabda639f2e0f1a30528e34917 Mon Sep 17 00:00:00 2001 From: Kanishk Gupta Date: Wed, 14 May 2025 12:46:00 +0530 Subject: [PATCH 02/41] Support npm operations using native npm client with .npmrc via --run-native flag (#2952) * New npm native implementation --- .github/workflows/accessTests.yml | 1 + .github/workflows/artifactoryTests.yml | 1 + .github/workflows/gradleTests.yml | 1 + .github/workflows/mavenTests.yml | 1 + .github/workflows/npmTests.yml | 1 + .github/workflows/nugetTests.yml | 1 + .github/workflows/pluginsTests.yml | 1 + .github/workflows/pythonTests.yml | 1 + .github/workflows/transferTests.yml | 2 +- buildtools/cli.go | 14 +- go.mod | 6 +- go.sum | 8 +- npm_test.go | 168 +++++++++++++++++- testdata/npm/npmpublishrcproject/package.json | 17 ++ .../npmpublishrcscopedproject/package.json | 17 ++ .../npm_local_scoped_repository_config.json | 5 + utils/cliutils/commandsflags.go | 9 +- utils/tests/consts.go | 7 +- utils/tests/utils.go | 5 +- 19 files changed, 248 insertions(+), 18 deletions(-) create mode 100755 testdata/npm/npmpublishrcproject/package.json create mode 100755 testdata/npm/npmpublishrcscopedproject/package.json create mode 100644 testdata/npm_local_scoped_repository_config.json diff --git a/.github/workflows/accessTests.yml b/.github/workflows/accessTests.yml index 16f290757..4d443ac37 100644 --- a/.github/workflows/accessTests.yml +++ b/.github/workflows/accessTests.yml @@ -37,6 +37,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Get ID Token and Exchange Token shell: bash diff --git a/.github/workflows/artifactoryTests.yml b/.github/workflows/artifactoryTests.yml index c4e380e3e..bc833c3f0 100644 --- a/.github/workflows/artifactoryTests.yml +++ b/.github/workflows/artifactoryTests.yml @@ -37,6 +37,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Run Artifactory tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.artifactory --jfrog.url=http://127.0.0.1:8082 --jfrog.adminToken=${{ env.JFROG_TESTS_LOCAL_ACCESS_TOKEN }} diff --git a/.github/workflows/gradleTests.yml b/.github/workflows/gradleTests.yml index 3f5d6a21a..05b42eff3 100644 --- a/.github/workflows/gradleTests.yml +++ b/.github/workflows/gradleTests.yml @@ -48,6 +48,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Run Gradle tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.gradle diff --git a/.github/workflows/mavenTests.yml b/.github/workflows/mavenTests.yml index 88b438b19..67c7da938 100644 --- a/.github/workflows/mavenTests.yml +++ b/.github/workflows/mavenTests.yml @@ -40,6 +40,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Run Maven tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.maven diff --git a/.github/workflows/npmTests.yml b/.github/workflows/npmTests.yml index 792e26def..70794b2fa 100644 --- a/.github/workflows/npmTests.yml +++ b/.github/workflows/npmTests.yml @@ -39,6 +39,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Run npm tests env: diff --git a/.github/workflows/nugetTests.yml b/.github/workflows/nugetTests.yml index fd8ee9ca1..29e1d1720 100644 --- a/.github/workflows/nugetTests.yml +++ b/.github/workflows/nugetTests.yml @@ -63,6 +63,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Run NuGet tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.nuget diff --git a/.github/workflows/pluginsTests.yml b/.github/workflows/pluginsTests.yml index e3c1fcca6..c92150dad 100644 --- a/.github/workflows/pluginsTests.yml +++ b/.github/workflows/pluginsTests.yml @@ -34,6 +34,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Run plugins tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.plugins diff --git a/.github/workflows/pythonTests.yml b/.github/workflows/pythonTests.yml index 926dc4444..cbeff536e 100644 --- a/.github/workflows/pythonTests.yml +++ b/.github/workflows/pythonTests.yml @@ -49,6 +49,7 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} + VERSION: 7.104.15 - name: Run Python tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.${{ matrix.suite }} diff --git a/.github/workflows/transferTests.yml b/.github/workflows/transferTests.yml index e2326897b..70b8c2d59 100644 --- a/.github/workflows/transferTests.yml +++ b/.github/workflows/transferTests.yml @@ -58,7 +58,7 @@ jobs: with: RTLIC: ${{ secrets.RTLIC_V6 }} JFROG_HOME: ${{ runner.temp }} - VERSION: 6.23.21 + VERSION: 7.104.15 - name: Run transfer tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.transfer --test.installDataTransferPlugin --jfrog.targetUrl=${{ secrets.PLATFORM_URL }} --jfrog.targetAdminToken=${{ secrets.PLATFORM_ADMIN_TOKEN }} --jfrog.home=${{ runner.temp }} --ci.runId=${{ runner.os }}-transfer-6 diff --git a/buildtools/cli.go b/buildtools/cli.go index cb38e74ce..44e4182d2 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -934,9 +934,17 @@ func NpmPublishCmd(c *cli.Context) (err error) { if npmCmd.GetXrayScan() { commandsUtils.ConditionalUploadScanFunc = scan.ConditionalUploadDefaultScanFunc } - printDeploymentView, detailedSummary := log.IsStdErrTerminal(), npmCmd.IsDetailedSummary() - if !detailedSummary { - npmCmd.SetDetailedSummary(printDeploymentView) + + var printDeploymentView, detailedSummary bool + + // Deployment view and Detailed summary is not supported when using npmrc for publishing since transfer details are not available. + if npmCmd.UseNative() { + printDeploymentView, detailedSummary = false, false + } else { + printDeploymentView, detailedSummary = log.IsStdErrTerminal(), npmCmd.IsDetailedSummary() + if !detailedSummary { + npmCmd.SetDetailedSummary(printDeploymentView) + } } err = commands.Exec(npmCmd) result := npmCmd.Result() diff --git a/go.mod b/go.mod index 535e94a4e..f9517d612 100644 --- a/go.mod +++ b/go.mod @@ -189,10 +189,10 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) -replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250508140039-bfb5e9a50dfe +replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250514065555-2ad0e403ae04 -replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a +replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250514055103-d3d0d25f7c85 -replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250509052840-40acf11c6080 +replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020 diff --git a/go.sum b/go.sum index 80b63068f..464f6498a 100644 --- a/go.sum +++ b/go.sum @@ -186,10 +186,10 @@ github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s= github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4= github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYLipdsOFMY= github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= -github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250509052840-40acf11c6080 h1:UWqfVXAvKdfru1k7PwNjZXuufcJR6HukzfThz+J2nFw= -github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250509052840-40acf11c6080/go.mod h1:MVap+qb0Gft98yJdPe2si2GqtxQczDVEuC8oxbUTDLk= -github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250508140039-bfb5e9a50dfe h1:17ZlsX/X4orRHqFoyGnEBHIfKFu49AVvyVoRqk7635E= -github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250508140039-bfb5e9a50dfe/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= +github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250514065555-2ad0e403ae04 h1:TtRvALfZVzm0PRyEg816TbuPU4pbFITEnSOQRgqNScg= +github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250514065555-2ad0e403ae04/go.mod h1:A2HKG/6ICMzgUrhO0N1cl8x6rces0JP2GcaiQP2dpbI= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250514055103-d3d0d25f7c85 h1:8MP9xgYm9bT6LeznzhyrecjpfTZQr2pBa4hxXEV36CI= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250514055103-d3d0d25f7c85/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= github.com/jfrog/jfrog-cli-platform-services v1.9.0 h1:r/ETgJuMUOUu12w20ydsF6paqEaj0khH6bxMRsdNz1Y= github.com/jfrog/jfrog-cli-platform-services v1.9.0/go.mod h1:pMZMSwhj7yA4VKyj0Skr2lObIyGpZUxNJ40DSLKXU38= github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020 h1:CoWRc7ZLXfHojcyzifFG8fwaTniOLg/cDTPhAqQh/dc= diff --git a/npm_test.go b/npm_test.go index 38a74038c..f980af23a 100644 --- a/npm_test.go +++ b/npm_test.go @@ -3,6 +3,7 @@ package main import ( "fmt" "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/generic" + utils2 "github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/utils" "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" "github.com/jfrog/jfrog-client-go/http/httpclient" "github.com/stretchr/testify/require" @@ -148,12 +149,162 @@ func testNpm(t *testing.T, isLegacy bool) { inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.NpmBuildName, artHttpDetails) } +func TestNpmPublishWithNpmrc(t *testing.T) { + testNpmPublishWithNpmrc(t, validateNpmPublish, "npmpublishrcproject", tests.NpmRepo, false) +} + +func TestNpmPublishWithNpmrcScoped(t *testing.T) { + testNpmPublishWithNpmrc(t, validateNpmScopedPublish, "npmpublishrcscopedproject", tests.NpmScopedRepo, true) +} + +func testNpmPublishWithNpmrc(t *testing.T, validationFunc func(t *testing.T, npmTest npmTestParams, isNpm7 bool), projectName string, repoName string, isScoped bool) { + initNpmTest(t) + defer cleanNpmTest(t) + wd, err := os.Getwd() + assert.NoError(t, err, "Failed to get current dir") + defer clientTestUtils.ChangeDirAndAssert(t, wd) + buildNumber := "1" + npmVersion, _, err := buildutils.GetNpmVersionAndExecPath(log.Logger) + if err != nil { + assert.NoError(t, err) + return + } + + // Init npm project & npmp command for testing + npmProjectPath := initNpmPublishRcProjectTest(t, projectName) + configFilePath := filepath.Join(npmProjectPath, ".jfrog", "projects", "npm.yaml") + + // fetch module id + packageJsonPath := npmProjectPath + "/package.json" + moduleName := readModuleId(t, packageJsonPath, npmVersion) + + err = createNpmrcForTesting(t, configFilePath) + assert.NoError(t, err) + + if isScoped { + addNpmScopeRegistryToNpmRc(t, npmProjectPath, packageJsonPath, npmVersion) + } + + npmpCmd, err := publishUsingNpmrc(configFilePath, buildNumber) + assert.NoError(t, err) + + result := npmpCmd.Result() + assert.NotNil(t, result) + + validateNpmLocalBuildInfo(t, tests.NpmBuildName, buildNumber, moduleName) + assert.NoError(t, artifactoryCli.Exec("bp", tests.NpmBuildName, buildNumber)) + + // validation + testParams := npmTestParams{testName: "npm p", + nativeCommand: "npm publish", + legacyCommand: "rt npm-publish", + repo: repoName, + wd: npmProjectPath, + validationFunc: validateNpmPublish, + buildNumber: buildNumber, + moduleName: moduleName, + } + validationFunc(t, testParams, false) +} + +func TestNpmInstallClientNative(t *testing.T) { + initNpmTest(t) + defer cleanNpmTest(t) + wd, err := os.Getwd() + assert.NoError(t, err, "Failed to get current dir") + defer clientTestUtils.ChangeDirAndAssert(t, wd) + + npmVersion, _, err := buildutils.GetNpmVersionAndExecPath(log.Logger) + if err != nil { + assert.NoError(t, err) + return + } + buildNumber := "1" + + npmProjectDirectory := initNpmProjectTest(t) + configFilePath := filepath.Join(npmProjectDirectory, ".jfrog", "projects", "npm.yaml") + err = createNpmrcForTesting(t, configFilePath) + assert.NoError(t, err) + + clientTestUtils.ChangeDirAndAssert(t, npmProjectDirectory) + npmrcFileInfo, err := os.Stat(".npmrc") + if err != nil && os.IsNotExist(err) { + assert.Fail(t, err.Error()) + } + + packageJsonPath := npmProjectDirectory + "/package.json" + moduleName := readModuleId(t, packageJsonPath, npmVersion) + runJfrogCli(t, "npm", "i", "--run-native=true", "--build-name="+tests.NpmBuildName, "--build-number="+buildNumber) + validateNpmLocalBuildInfo(t, tests.NpmBuildName, buildNumber, moduleName) + assert.NoError(t, artifactoryCli.Exec("bp", tests.NpmBuildName, buildNumber)) + + npmTest := npmTestParams{ + testName: "npm with run-native", + buildNumber: buildNumber, + npmArgs: "--run-native=true", + } + + validateNpmInstall(t, npmTest, isNpm7(npmVersion)) + postTestFileInfo, postTestFileInfoErr := os.Stat(".npmrc") + validateNpmrcFileInfo(t, npmTest, npmrcFileInfo, postTestFileInfo, err, postTestFileInfoErr) + validateIfFileWasEverModified(t, npmrcFileInfo, postTestFileInfo) +} + +func createNpmrcForTesting(t *testing.T, configFilePath string) (err error) { + // Creation of npmrc - npmCommand.CreateTempNpmrc() function is used to create a npmrc file + npmCommand := npm.NewNpmCommand("install", true) + npmCommand.SetConfigFilePath(configFilePath) + npmCommand.SetServerDetails(serverDetails) + err = npmCommand.Init() + assert.NoError(t, err) + err = npmCommand.PreparePrerequisites(tests.NpmRepo) + assert.NoError(t, err) + err = npmCommand.CreateTempNpmrc() + return +} + +func publishUsingNpmrc(configFilePath string, buildNumber string) (npm.NpmPublishCommand, error) { + args := []string{"--run-native=true", "--build-name=" + tests.NpmBuildName, "--build-number=" + buildNumber} + npmpCmd := npm.NewNpmPublishCommand() + npmpCmd.SetConfigFilePath(configFilePath).SetArgs(args) + err := npmpCmd.Init() + if err != nil { + return *npmpCmd, err + } + err = commands.Exec(npmpCmd) + if err != nil { + return *npmpCmd, err + } + return *npmpCmd, err +} + func readModuleId(t *testing.T, wd string, npmVersion *version.Version) string { packageInfo, err := buildutils.ReadPackageInfoFromPackageJsonIfExists(filepath.Dir(wd), npmVersion) assert.NoError(t, err) return packageInfo.BuildInfoModuleId() } +func addNpmScopeRegistryToNpmRc(t *testing.T, projectPath string, packageJsonPath string, npmVersion *version.Version) { + scope := getScopeFromPackageJson(t, packageJsonPath, npmVersion) + authConfig, err := serverDetails.CreateArtAuthConfig() + assert.NoError(t, err) + _, registry, err := utils2.GetArtifactoryNpmRepoDetails(tests.NpmScopedRepo, authConfig, false) + assert.NoError(t, err) + scopedRegistry := scope + ":registry=" + registry + npmrcFilePath := filepath.Join(projectPath, ".npmrc") + npmrcFile, err := os.OpenFile(npmrcFilePath, os.O_APPEND|os.O_WRONLY, 0644) + assert.NoError(t, err) + defer npmrcFile.Close() + _, err = npmrcFile.WriteString(scopedRegistry) + assert.NoError(t, err) +} + +func getScopeFromPackageJson(t *testing.T, wd string, npmVersion *version.Version) string { + packageInfo, err := buildutils.ReadPackageInfoFromPackageJsonIfExists(filepath.Dir(wd), npmVersion) + assert.NoError(t, err) + return packageInfo.Scope +} + func TestNpmWithGlobalConfig(t *testing.T) { initNpmTest(t) defer cleanNpmTest(t) @@ -261,6 +412,11 @@ func validateNpmrcFileInfo(t *testing.T, npmTest npmTestParams, npmrcFileInfo, p assert.Nil(t, bcpNpmrc, "The file 'jfrog.npmrc.backup' was supposed to be deleted but it was not when running the configuration:\n%v", npmTest) } +// if file was backed up then it's mod time should be changed +func validateIfFileWasEverModified(t *testing.T, fileInfo, postTestFileInfo os.FileInfo) { + assert.Equal(t, fileInfo.ModTime(), postTestFileInfo.ModTime()) +} + func initNpmFilesTest(t *testing.T) (npmProjectPath, npmScopedProjectPath, npmNpmrcProjectPath, npmProjectCi, npmPostInstallProjectPath string) { npmProjectPath = createNpmProject(t, "npmproject") npmScopedProjectPath = createNpmProject(t, "npmscopedproject") @@ -285,6 +441,14 @@ func initNpmProjectTest(t *testing.T) (npmProjectPath string) { return } +func initNpmPublishRcProjectTest(t *testing.T, projectName string) (npmProjectPath string) { + npmProjectPath = filepath.Dir(createNpmProject(t, projectName)) + err := createConfigFileForTest([]string{npmProjectPath}, tests.NpmRemoteRepo, tests.NpmRepo, t, project.Npm, false) + assert.NoError(t, err) + prepareArtifactoryForNpmBuild(t, npmProjectPath) + return +} + func initNpmWorkspacesProjectTest(t *testing.T) (npmProjectPath string) { npmProjectPath = filepath.Dir(createNpmProject(t, "npmworkspaces")) err := createConfigFileForTest([]string{npmProjectPath}, tests.NpmRemoteRepo, tests.NpmRepo, t, project.Npm, false) @@ -361,8 +525,8 @@ func validateNpmPublish(t *testing.T, npmTestParams npmTestParams, isNpm7 bool) } func validateNpmScopedPublish(t *testing.T, npmTestParams npmTestParams, isNpm7 bool) { - verifyExistInArtifactoryByProps(tests.GetNpmDeployedScopedArtifacts(isNpm7), - tests.NpmRepo+"/*", + verifyExistInArtifactoryByProps(tests.GetNpmDeployedScopedArtifacts(npmTestParams.repo, isNpm7), + npmTestParams.repo+"/*", fmt.Sprintf("build.name=%v;build.number=%v;build.timestamp=*", tests.NpmBuildName, npmTestParams.buildNumber), t) validateNpmCommonPublish(t, npmTestParams, isNpm7, true) } diff --git a/testdata/npm/npmpublishrcproject/package.json b/testdata/npm/npmpublishrcproject/package.json new file mode 100755 index 000000000..7797f3f38 --- /dev/null +++ b/testdata/npm/npmpublishrcproject/package.json @@ -0,0 +1,17 @@ +{ + "name": "jfrog-cli-tests", + "version": "1.0.0", + "description": "test package", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "xml": "1.0.1" + }, + "devDependencies": { + "json": "9.0.6" + } +} \ No newline at end of file diff --git a/testdata/npm/npmpublishrcscopedproject/package.json b/testdata/npm/npmpublishrcscopedproject/package.json new file mode 100755 index 000000000..bc63c2ec0 --- /dev/null +++ b/testdata/npm/npmpublishrcscopedproject/package.json @@ -0,0 +1,17 @@ +{ + "name": "@jscope/jfrog-cli-tests", + "version": "1.0.0", + "description": "test package", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "xml": "1.0.1" + }, + "devDependencies": { + "json": "9.0.6" + } +} \ No newline at end of file diff --git a/testdata/npm_local_scoped_repository_config.json b/testdata/npm_local_scoped_repository_config.json new file mode 100644 index 000000000..e11794546 --- /dev/null +++ b/testdata/npm_local_scoped_repository_config.json @@ -0,0 +1,5 @@ +{ + "key": "${NPM_SCOPED_REPO}", + "rclass": "local", + "packageType": "npm" +} diff --git a/utils/cliutils/commandsflags.go b/utils/cliutils/commandsflags.go index ea6598c43..15b786258 100644 --- a/utils/cliutils/commandsflags.go +++ b/utils/cliutils/commandsflags.go @@ -363,6 +363,7 @@ const ( // Unique npm flags npmPrefix = "npm-" npmDetailedSummary = npmPrefix + detailedSummary + runNative = "run-native" // Unique nuget/dotnet config flags nugetV2 = "nuget-v2" @@ -1704,6 +1705,10 @@ var flagsMap = map[string]cli.Flag{ Name: ApplicationKey, Usage: "[Optional] JFrog ApplicationKey Key` ` ", }, + runNative: cli.BoolFlag{ + Name: runNative, + Usage: "[Default: false] Set to true if you'd like to use the native client configurations. Note: This flag would invoke native client behind the scenes, has performance implications and does not support deployment view and detailed summary` `", + }, } var commandFlags = map[string][]string{ @@ -1850,10 +1855,10 @@ var commandFlags = map[string][]string{ global, serverIdResolve, serverIdDeploy, repoResolve, repoDeploy, }, NpmInstallCi: { - BuildName, BuildNumber, module, Project, + BuildName, BuildNumber, module, Project, runNative, }, NpmPublish: { - BuildName, BuildNumber, module, Project, npmDetailedSummary, xrayScan, xrOutput, + BuildName, BuildNumber, module, Project, npmDetailedSummary, xrayScan, xrOutput, runNative, }, PnpmConfig: { global, serverIdResolve, repoResolve, diff --git a/utils/tests/consts.go b/utils/tests/consts.go index 2efa5b889..5fae5710b 100644 --- a/utils/tests/consts.go +++ b/utils/tests/consts.go @@ -88,6 +88,7 @@ const ( MavenWithoutDeployerConfig = "maven_without_deployer.yaml" MoveCopySpecExclusions = "move_copy_spec_exclusions.json" NpmLocalRepositoryConfig = "npm_local_repository_config.json" + NpmLocalScopedRespositoryConfig = "npm_local_scoped_repository_config.json" NpmRemoteRepositoryConfig = "npm_remote_repository_config.json" NugetRemoteRepositoryConfig = "nuget_remote_repository_config.json" Out = "out" @@ -165,6 +166,7 @@ const ( XrayEndpoint = "xray/" YarnRemoteRepositoryConfig = "yarn_remote_repository_config.json" ReleaseLifecycleImportDependencySpec = "import_bundle_repo_dependency.json" + UseNpmRcFlag = "--use-npmrc" ) var ( @@ -181,6 +183,7 @@ var ( MvnRepo1 = "cli-mvn1" MvnRepo2 = "cli-mvn2" NpmRepo = "cli-npm" + NpmScopedRepo = "cli-npm-scoped" NpmRemoteRepo = "cli-npm-remote" NugetRemoteRepo = "cli-nuget-remote" YarnRemoteRepo = "cli-yarn-remote" @@ -1797,8 +1800,8 @@ func GetGradleDeployedArtifacts() []string { } } -func GetNpmDeployedScopedArtifacts(isNpm7 bool) []string { - path := NpmRepo + "/@jscope/jfrog-cli-tests/-/@jscope/" +func GetNpmDeployedScopedArtifacts(npmRepo string, isNpm7 bool) []string { + path := npmRepo + "/@jscope/jfrog-cli-tests/-/@jscope/" path += GetNpmArtifactName(isNpm7, true) return []string{ path, diff --git a/utils/tests/utils.go b/utils/tests/utils.go index a4b289395..392945692 100644 --- a/utils/tests/utils.go +++ b/utils/tests/utils.go @@ -262,6 +262,7 @@ var reposConfigMap = map[*string]string{ &MvnRemoteRepo: MavenRemoteRepositoryConfig, &GradleRemoteRepo: GradleRemoteRepositoryConfig, &NpmRepo: NpmLocalRepositoryConfig, + &NpmScopedRepo: NpmLocalScopedRespositoryConfig, &NpmRemoteRepo: NpmRemoteRepositoryConfig, &NugetRemoteRepo: NugetRemoteRepositoryConfig, &YarnRemoteRepo: YarnRemoteRepositoryConfig, @@ -325,7 +326,7 @@ func GetNonVirtualRepositories() map[*string]string { TestGo: {&GoRepo, &GoRemoteRepo}, TestGradle: {&GradleRepo, &GradleRemoteRepo}, TestMaven: {&MvnRepo1, &MvnRepo2, &MvnRemoteRepo}, - TestNpm: {&NpmRepo, &NpmRemoteRepo}, + TestNpm: {&NpmRepo, &NpmScopedRepo, &NpmRemoteRepo}, TestNuget: {&NugetRemoteRepo}, TestPip: {&PypiLocalRepo, &PypiRemoteRepo}, TestPipenv: {&PipenvRemoteRepo}, @@ -419,6 +420,7 @@ func getSubstitutionMap() map[string]string { "${GRADLE_REMOTE_REPO}": GradleRemoteRepo, "${GRADLE_REPO}": GradleRepo, "${NPM_REPO}": NpmRepo, + "${NPM_SCOPED_REPO}": NpmScopedRepo, "${NPM_REMOTE_REPO}": NpmRemoteRepo, "${NUGET_REMOTE_REPO}": NugetRemoteRepo, "${YARN_REMOTE_REPO}": YarnRemoteRepo, @@ -488,6 +490,7 @@ func AddTimestampToGlobalVars() { MvnRepo1 += uniqueSuffix MvnRepo2 += uniqueSuffix NpmRepo += uniqueSuffix + NpmScopedRepo += uniqueSuffix NpmRemoteRepo += uniqueSuffix NugetRemoteRepo += uniqueSuffix YarnRemoteRepo += uniqueSuffix From 906ca7333a6e8bee4500dc04a8eacb1433ff6193 Mon Sep 17 00:00:00 2001 From: Agrasth Naman Date: Wed, 14 May 2025 13:29:04 +0530 Subject: [PATCH 03/41] Add test case for multiple image tags in build-docker-create (#2957) * Add test case for multiple image tags in build-docker-create * Reverted updated artifactory versions in tests --- .github/workflows/accessTests.yml | 1 - .github/workflows/artifactoryTests.yml | 1 - .github/workflows/gradleTests.yml | 1 - .github/workflows/mavenTests.yml | 1 - .github/workflows/npmTests.yml | 1 - .github/workflows/nugetTests.yml | 1 - .github/workflows/pluginsTests.yml | 1 - .github/workflows/pythonTests.yml | 1 - .github/workflows/transferTests.yml | 2 +- docker_test.go | 155 ++++++++++++++++++------- 10 files changed, 115 insertions(+), 50 deletions(-) diff --git a/.github/workflows/accessTests.yml b/.github/workflows/accessTests.yml index 4d443ac37..16f290757 100644 --- a/.github/workflows/accessTests.yml +++ b/.github/workflows/accessTests.yml @@ -37,7 +37,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Get ID Token and Exchange Token shell: bash diff --git a/.github/workflows/artifactoryTests.yml b/.github/workflows/artifactoryTests.yml index bc833c3f0..c4e380e3e 100644 --- a/.github/workflows/artifactoryTests.yml +++ b/.github/workflows/artifactoryTests.yml @@ -37,7 +37,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Run Artifactory tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.artifactory --jfrog.url=http://127.0.0.1:8082 --jfrog.adminToken=${{ env.JFROG_TESTS_LOCAL_ACCESS_TOKEN }} diff --git a/.github/workflows/gradleTests.yml b/.github/workflows/gradleTests.yml index 05b42eff3..3f5d6a21a 100644 --- a/.github/workflows/gradleTests.yml +++ b/.github/workflows/gradleTests.yml @@ -48,7 +48,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Run Gradle tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.gradle diff --git a/.github/workflows/mavenTests.yml b/.github/workflows/mavenTests.yml index 67c7da938..88b438b19 100644 --- a/.github/workflows/mavenTests.yml +++ b/.github/workflows/mavenTests.yml @@ -40,7 +40,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Run Maven tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.maven diff --git a/.github/workflows/npmTests.yml b/.github/workflows/npmTests.yml index 70794b2fa..792e26def 100644 --- a/.github/workflows/npmTests.yml +++ b/.github/workflows/npmTests.yml @@ -39,7 +39,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Run npm tests env: diff --git a/.github/workflows/nugetTests.yml b/.github/workflows/nugetTests.yml index 29e1d1720..fd8ee9ca1 100644 --- a/.github/workflows/nugetTests.yml +++ b/.github/workflows/nugetTests.yml @@ -63,7 +63,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Run NuGet tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.nuget diff --git a/.github/workflows/pluginsTests.yml b/.github/workflows/pluginsTests.yml index c92150dad..e3c1fcca6 100644 --- a/.github/workflows/pluginsTests.yml +++ b/.github/workflows/pluginsTests.yml @@ -34,7 +34,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Run plugins tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.plugins diff --git a/.github/workflows/pythonTests.yml b/.github/workflows/pythonTests.yml index cbeff536e..926dc4444 100644 --- a/.github/workflows/pythonTests.yml +++ b/.github/workflows/pythonTests.yml @@ -49,7 +49,6 @@ jobs: uses: jfrog/.github/actions/install-local-artifactory@main with: RTLIC: ${{ secrets.RTLIC }} - VERSION: 7.104.15 - name: Run Python tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.${{ matrix.suite }} diff --git a/.github/workflows/transferTests.yml b/.github/workflows/transferTests.yml index 70b8c2d59..e2326897b 100644 --- a/.github/workflows/transferTests.yml +++ b/.github/workflows/transferTests.yml @@ -58,7 +58,7 @@ jobs: with: RTLIC: ${{ secrets.RTLIC_V6 }} JFROG_HOME: ${{ runner.temp }} - VERSION: 7.104.15 + VERSION: 6.23.21 - name: Run transfer tests run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.transfer --test.installDataTransferPlugin --jfrog.targetUrl=${{ secrets.PLATFORM_URL }} --jfrog.targetAdminToken=${{ secrets.PLATFORM_ADMIN_TOKEN }} --jfrog.home=${{ runner.temp }} --ci.runId=${{ runner.os }}-transfer-6 diff --git a/docker_test.go b/docker_test.go index 10552460c..7b6f7a47e 100644 --- a/docker_test.go +++ b/docker_test.go @@ -179,6 +179,39 @@ func runPushTest(containerManager container.ContainerManagerType, imageName, mod validateContainerBuild(tests.DockerBuildName, buildNumber, imagePath, module, 7, 5, 7, t) } +func loginToArtifactory(t *testing.T, container *tests.TestContainer) { + password := *tests.JfrogPassword + user := *tests.JfrogUser + if *tests.JfrogAccessToken != "" { + user = auth.ExtractUsernameFromAccessToken(*tests.JfrogAccessToken) + password = *tests.JfrogAccessToken + } + assert.NoError(t, container.Exec( + context.Background(), + "docker", + "login", + tests.RtContainerHostName, + "--username="+user, + "--password="+password, + )) +} + +func buildBuilderImage(t *testing.T, workspace, dockerfile, containerName string) *tests.TestContainer { + ctx := context.Background() + testContainer, err := tests.NewContainerRequest(). + SetDockerfile(workspace, dockerfile, nil). + Privileged(). + Networks(rtNetwork). + Name(containerName). + Mount(mount.Mount{Type: mount.TypeBind, Source: workspace, Target: "/workspace", ReadOnly: false}). + Cmd("--insecure-registry", tests.RtContainerHostName). + WaitFor(wait.ForLog("API listen on /var/run/docker.sock").WithStartupTimeout(5*time.Minute)). + Remove(). + Build(ctx, true) + assert.NoError(t, err, "Couldn't create builder image.") + return testContainer +} + // This test validate the collect build-info flow for fat-manifest images. // The way we build the fat manifest and push it to Artifactory is not important. // Therefore, this test runs only with docker. @@ -194,7 +227,6 @@ func TestPushFatManifestImage(t *testing.T) { assert.NoError(t, fileutils.CreateDirIfNotExist(workspace)) testDataDir := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "docker") files, err := os.ReadDir(testDataDir) - assert.NoError(t, err) for _, file := range files { if !file.IsDir() { @@ -202,45 +234,23 @@ func TestPushFatManifestImage(t *testing.T) { assert.NoError(t, err) } } + // Build the builder image locally. - ctx := context.Background() - testContainer, err := tests.NewContainerRequest(). - SetDockerfile(workspace, "Dockerfile.Buildx.Fatmanifest", nil). - Privileged(). - Networks(rtNetwork). - Name("buildx_container"). - Mount(mount.Mount{Type: mount.TypeBind, Source: workspace, Target: "/workspace", ReadOnly: false}). - Cmd("--insecure-registry", tests.RtContainerHostName). - // Docker daemon take times to load. In order to check if it's available we wait for a log message to indications that the Docker daemon has finished initializing. - WaitFor(wait.ForLog("API listen on /var/run/docker.sock").WithStartupTimeout(5*time.Minute)). - Remove(). - Build(ctx, true) - assert.NoError(t, err, "Couldn't run create buildx image.") - defer func() { assert.NoError(t, testContainer.Terminate(ctx)) }() + testContainer := buildBuilderImage(t, workspace, "Dockerfile.Buildx.Fatmanifest", "buildx_container") + defer func() { assert.NoError(t, testContainer.Terminate(context.Background())) }() // Enable the builder util in the container. - err = testContainer.Exec(ctx, "sh", "script.sh") + err = testContainer.Exec(context.Background(), "sh", "script.sh") assert.NoError(t, err) - // login from the builder container toward the Artifactory. - password := *tests.JfrogPassword - user := *tests.JfrogUser - if *tests.JfrogAccessToken != "" { - user = auth.ExtractUsernameFromAccessToken(*tests.JfrogAccessToken) - password = *tests.JfrogAccessToken - } - assert.NoError(t, testContainer.Exec( - ctx, - "docker", - "login", - tests.RtContainerHostName, - "--username="+user, - "--password="+password)) + // Login to Artifactory + loginToArtifactory(t, testContainer) + buildxOutputFile := "buildmetadata" - // Run the builder in the container and push the fat-manifest image to artifactory + // Run the builder in the container and push the fat-manifest image to Artifactory assert.NoError(t, testContainer.Exec( - ctx, + context.Background(), "docker", "buildx", "build", @@ -263,20 +273,83 @@ func TestPushFatManifestImage(t *testing.T) { assert.NoError(t, artifactoryCli.Exec("build-docker-create", tests.DockerLocalRepo, "--image-file="+buildxOutput, "--build-name="+buildName, "--build-number="+buildNumber)) assert.NoError(t, artifactoryCli.Exec("build-publish", buildName, buildNumber)) - // Validate the published build-info exits + // Validate the published build-info exists publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) - if err != nil { - assert.NoError(t, err) - return + assert.NoError(t, err) + assert.True(t, found, "build info was expected to be found") + assert.True(t, len(publishedBuildInfo.BuildInfo.Modules) > 1) + + // Validate build-name & build-number properties in all image layers + searchSpec := spec.NewBuilder().Pattern(tests.DockerLocalRepo + "/*").Build(buildName).Recursive(true).BuildSpec() + searchCmd := generic.NewSearchCommand() + searchCmd.SetServerDetails(serverDetails).SetSpec(searchSpec) + reader, err := searchCmd.Search() + assert.NoError(t, err) + totalResults, err := reader.Length() + assert.NoError(t, err) + assert.True(t, totalResults > 1) +} + +func TestPushMultiTaggedImage(t *testing.T) { + if !*tests.TestDocker { + t.Skip("Skipping test. To run it, add the '-test.docker=true' option.") } - if !found { - assert.True(t, found, "build info was expected to be found") - return + + buildName := "push-multi-tagged" + tests.DockerBuildName + buildNumber := "1" + + // Setup workspace + workspace, err := filepath.Abs(tests.Out) + assert.NoError(t, err) + assert.NoError(t, fileutils.CreateDirIfNotExist(workspace)) + testDataDir := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "docker") + files, err := os.ReadDir(testDataDir) + assert.NoError(t, err) + for _, file := range files { + if !file.IsDir() { + _, err := tests.ReplaceTemplateVariables(filepath.Join(testDataDir, file.Name()), tests.Out) + assert.NoError(t, err) + } } - assert.True(t, len(publishedBuildInfo.BuildInfo.Modules) > 1) + // Build the builder image locally + testContainer := buildBuilderImage(t, workspace, "Dockerfile.Buildx.Fatmanifest", "buildx_multi_tag_container") + defer func() { assert.NoError(t, testContainer.Terminate(context.Background())) }() - // Validate build-name & build-number properties in all image layers + // Enable builder + assert.NoError(t, testContainer.Exec(context.Background(), "sh", "script.sh")) + + // Login to Artifactory + loginToArtifactory(t, testContainer) + + // Build & push image with multiple tags + imageName1 := path.Join(tests.RtContainerHostName, tests.DockerLocalRepo, tests.DockerImageName+"-multi:v1") + imageName2 := path.Join(tests.RtContainerHostName, tests.DockerLocalRepo, tests.DockerImageName+"-multi:latest") + buildxOutputFile := "multi-build-metadata" + + assert.NoError(t, testContainer.Exec( + context.Background(), + "docker", "buildx", "build", + "--platform", "linux/amd64,linux/arm64", + "-t", imageName1, + "-t", imageName2, + "-f", "Dockerfile.Fatmanifest", + "--metadata-file", "/workspace/"+buildxOutputFile, + "--push", ".", + )) + + // Run build-docker-create & publish + buildxOutput := filepath.Join(workspace, buildxOutputFile) + assert.NoError(t, artifactoryCli.Exec("build-docker-create", tests.DockerLocalRepo, "--image-file="+buildxOutput, "--build-name="+buildName, "--build-number="+buildNumber)) + assert.NoError(t, artifactoryCli.Exec("build-publish", buildName, buildNumber)) + + // Validate build-info is published + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + assert.NoError(t, err) + assert.True(t, found, "build info was expected to be found") + assert.True(t, len(publishedBuildInfo.BuildInfo.Modules) >= 1) + + // Validate build-name & build-number properties in all layers searchSpec := spec.NewBuilder().Pattern(tests.DockerLocalRepo + "/*").Build(buildName).Recursive(true).BuildSpec() searchCmd := generic.NewSearchCommand() searchCmd.SetServerDetails(serverDetails).SetSpec(searchSpec) From 62da26d8e6dcce3e42347685af056583cc5008af Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Mon, 30 Jun 2025 17:01:12 +0300 Subject: [PATCH 04/41] Update dependencies --- go.mod | 22 ++++++++++++---------- go.sum | 24 ++++++++++++------------ utils/tests/consts.go | 2 ++ 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index f9517d612..2f1b77bd9 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/jfrog/jfrog-cli -go 1.23.7 +go 1.24.2 + +toolchain go1.24.3 replace ( // Should not be updated to 0.2.6 due to a bug (https://github.com/jfrog/jfrog-cli-core/pull/372) @@ -16,13 +18,13 @@ require ( github.com/docker/docker v27.5.1+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.10.10 + github.com/jfrog/build-info-go v1.10.14 github.com/jfrog/gofrog v1.7.6 - github.com/jfrog/jfrog-cli-artifactory v0.2.4 - github.com/jfrog/jfrog-cli-core/v2 v2.58.5 + github.com/jfrog/jfrog-cli-artifactory v0.3.2 + github.com/jfrog/jfrog-cli-core/v2 v2.59.0 github.com/jfrog/jfrog-cli-platform-services v1.9.0 github.com/jfrog/jfrog-cli-security v1.17.1 - github.com/jfrog/jfrog-client-go v1.52.0 + github.com/jfrog/jfrog-client-go v1.54.1 github.com/jszwec/csvutil v1.10.0 github.com/manifoldco/promptui v0.9.0 github.com/stretchr/testify v1.10.0 @@ -49,7 +51,7 @@ require ( github.com/c-bata/go-prompt v0.2.6 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect - github.com/cloudflare/circl v1.6.0 // indirect + github.com/cloudflare/circl v1.6.1 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v0.2.1 // indirect github.com/cpuguy83/dockercfg v0.3.2 // indirect @@ -189,10 +191,10 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) -replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250514065555-2ad0e403ae04 +replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad -replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250514055103-d3d0d25f7c85 +replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd -replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a +replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 -replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020 +replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 diff --git a/go.sum b/go.sum index 464f6498a..5615515a2 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,8 @@ github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObk github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= -github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= @@ -176,8 +176,8 @@ github.com/jedib0t/go-pretty/v6 v6.6.5 h1:9PgMJOVBedpgYLI56jQRJYqngxYAAzfEUua+3N github.com/jedib0t/go-pretty/v6 v6.6.5/go.mod h1:Uq/HrbhuFty5WSVNfjpQQe47x16RwVGXIveNGEyGtHs= 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.10.10 h1:2nOFjV7SX1uisi2rQK7fb4Evm7YkSOdmssrm6Tf4ipc= -github.com/jfrog/build-info-go v1.10.10/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE= +github.com/jfrog/build-info-go v1.10.14 h1:PWnw+rBwiQTHZ5q+84+E8MHFjtAQkB3+Oc2sKwBSSGE= +github.com/jfrog/build-info-go v1.10.14/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE= github.com/jfrog/froggit-go v1.17.0 h1:20Ie787WO27SwB2MOHDvsR6yN7fA5WfRnuAbmUqz1Zs= github.com/jfrog/froggit-go v1.17.0/go.mod h1:HvDkfFfJwIdsXFdqaB+utvD2cLDRmaC3kF8otYb6Chw= github.com/jfrog/go-mockhttp v0.3.1 h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8= @@ -186,16 +186,16 @@ github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s= github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4= github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYLipdsOFMY= github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= -github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250514065555-2ad0e403ae04 h1:TtRvALfZVzm0PRyEg816TbuPU4pbFITEnSOQRgqNScg= -github.com/jfrog/jfrog-cli-artifactory v0.2.5-0.20250514065555-2ad0e403ae04/go.mod h1:A2HKG/6ICMzgUrhO0N1cl8x6rces0JP2GcaiQP2dpbI= -github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250514055103-d3d0d25f7c85 h1:8MP9xgYm9bT6LeznzhyrecjpfTZQr2pBa4hxXEV36CI= -github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250514055103-d3d0d25f7c85/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= +github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad h1:cnbcCK0VTHdLdmmv/9fYTRjuR1ewrYBW/S87pVE+d+s= +github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad/go.mod h1:hnXaevmDyQpyhpH5kwDufIjUUXXuKs54i+AX2CEywKE= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd h1:1Nw+HKbtQZGEogerQBNM77RvbUwHYNKFNYJk4lmNF9w= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd/go.mod h1:BkDHfCVecjcRNC+aqmHtTrKe+/K8MyjzmHYe5rER5Yg= github.com/jfrog/jfrog-cli-platform-services v1.9.0 h1:r/ETgJuMUOUu12w20ydsF6paqEaj0khH6bxMRsdNz1Y= github.com/jfrog/jfrog-cli-platform-services v1.9.0/go.mod h1:pMZMSwhj7yA4VKyj0Skr2lObIyGpZUxNJ40DSLKXU38= -github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020 h1:CoWRc7ZLXfHojcyzifFG8fwaTniOLg/cDTPhAqQh/dc= -github.com/jfrog/jfrog-cli-security v1.17.2-0.20250511132918-d9cc4cd50020/go.mod h1:9E95ny3WrNoOtMWTtq//SDc0PEnDZxZr3E2o+f90uMk= -github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a h1:QkebmsUWuurSgp4Lx7k6GtQ0sX3RmJ/d2n+NQ2l2g/E= -github.com/jfrog/jfrog-client-go v1.28.1-0.20250508130334-f159cff9b11a/go.mod h1:uRmT8Q1SJymIzId01v0W1o8mGqrRfrwUF53CgEMsH0U= +github.com/jfrog/jfrog-cli-security v1.19.0 h1:4qggon1biuOvjMjHZ5IWDA4Mh+qp2qecWEdeX6s4Xv8= +github.com/jfrog/jfrog-cli-security v1.19.0/go.mod h1:QMoGTGfKMSnXOuWv3/IclZU+M/AshoJMt68Ft6l7EdE= +github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 h1:0t6dQHoalUDNVrfZujD3iCmDGLDl+ndHclFkmONSpq0= +github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1/go.mod h1:1v0eih4thdPA4clBo9TuvAMT25sGDr1IQJ81DXQ/lBY= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jszwec/csvutil v1.10.0 h1:upMDUxhQKqZ5ZDCs/wy+8Kib8rZR8I8lOR34yJkdqhI= diff --git a/utils/tests/consts.go b/utils/tests/consts.go index 5fae5710b..16e6ba868 100644 --- a/utils/tests/consts.go +++ b/utils/tests/consts.go @@ -80,6 +80,7 @@ const ( LifecycleBuilds12 = "lifecycle-builds-1-2.json" LifecycleBuilds3 = "lifecycle-builds-3.json" LifecycleReleaseBundles = "lifecycle-release-bundles.json" + LifecycleMultipleSources = "lifecycle-multiple-sources.json" MavenConfig = "maven.yaml" MavenIncludeExcludePatternsConfig = "maven_include_exclude_patterns.yaml" MavenRemoteRepositoryConfig = "maven_remote_repository_config.json" @@ -167,6 +168,7 @@ const ( YarnRemoteRepositoryConfig = "yarn_remote_repository_config.json" ReleaseLifecycleImportDependencySpec = "import_bundle_repo_dependency.json" UseNpmRcFlag = "--use-npmrc" + MultipleBuilds = "name=cli-lc-build1, id=111, include-deps=true; name=cli-lc-build2, id=222" ) var ( From fae66453a77f6cec13b5f30c29217c3abec963a3 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Sun, 18 May 2025 19:07:57 +0300 Subject: [PATCH 05/41] Introduce e2e tests for create release bundle with multiple sources --- go.sum | 6 ++ lifecycle_test.go | 177 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) diff --git a/go.sum b/go.sum index 5615515a2..3c3f8a164 100644 --- a/go.sum +++ b/go.sum @@ -307,6 +307,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250508151803-478427ca9cb3 h1:82noQEs1SCA6lSzOMBtPNO32N+pfjZFLSeq94Oq9Rh4= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250508151803-478427ca9cb3/go.mod h1:MVap+qb0Gft98yJdPe2si2GqtxQczDVEuC8oxbUTDLk= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c h1:NTFV7lRdjkGaF52pweS4XN3bZWR4PqQwwLHruXPqLXc= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= +github.com/rimapol/jfrog-client-go v0.0.0-20250508103333-1551b7df1785 h1:ZfqjHUZPhY1gnOYDaJr57mtZureehnWhC3KS6h2lrTc= +github.com/rimapol/jfrog-client-go v0.0.0-20250508103333-1551b7df1785/go.mod h1:uRmT8Q1SJymIzId01v0W1o8mGqrRfrwUF53CgEMsH0U= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= diff --git a/lifecycle_test.go b/lifecycle_test.go index 14153264b..31a24b966 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -26,6 +26,8 @@ import ( "os" "path" "path/filepath" + "strconv" + "strings" "testing" "time" ) @@ -45,6 +47,7 @@ const ( artifactoryLifecycleSetTagMinVersion = "7.111.0" rbManifestName = "release-bundle.json.evd" releaseBundlesV2 = "release-bundles-v2" + minMultiSourcesArtifactoryVersion = "7.114.0" ) var ( @@ -94,6 +97,68 @@ func compareRbArtifacts(t *testing.T, actual services.ReleaseBundleSpecResponse, assert.ElementsMatch(t, actualArtifactsPaths, expected) } +func TestReleaseBundleCreationFromMultipleBuilds(t *testing.T) { + + cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + createRbFromMultiSources(t, lcManager, GetMultiSourcesForBuilds(), "", tests.LcRbName1, number1, "default", true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") +} + +func TestReleaseBundleCreationFromMultipleBundles(t *testing.T) { + + cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + + createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + + createRbFromMultiSources(t, lcManager, "", GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) + assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") +} + +func TestReleaseBundleCreationFromMultipleBuildsAndBundles(t *testing.T) { + + cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + + createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + + createRbFromMultiSources(t, lcManager, GetMultiSourcesForBuilds(), GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) + assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") +} + +func GetMultiSourcesForBuilds() string { + return fmt.Sprintf("name=%s, id=%s, include-deps=%s; name=%s, id=%s", tests.LcBuildName1, number1, "true", tests.LcBuildName2, number2) +} + +func GetMultiSourcesForBundles() string { + return fmt.Sprintf("name=%s, version=%s; name=%s, version=%s", tests.LcRbName1, number1, tests.LcRbName2, number2) +} + func TestReleaseBundleCreationFromAql(t *testing.T) { testReleaseBundleCreation(t, tests.UploadDevSpecA, tests.LifecycleAql, tests.GetExpectedLifecycleCreationByAql(), false) } @@ -282,6 +347,118 @@ func TestCreateBundleWithoutSpecAndWithProject(t *testing.T) { defer deleteReleaseBundleWithProject(t, lcManager, tests.LcRbName1, number1, tests.ProjectKey) } +func createRbFromMultiSources(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, buildsSourcesOption, bundlesSourcesOption, + rbName, rbVersion, project string, sync bool) { + var sources []services.RbSource + sources = buildMultiSources(sources, buildsSourcesOption, bundlesSourcesOption, project) + + rbDetails := services.ReleaseBundleDetails{ + ReleaseBundleName: rbName, + ReleaseBundleVersion: rbVersion, + } + queryParams := services.CommonOptionalQueryParams{ + Async: !sync, + ProjectKey: project, + } + + assert.NoError(t, lcManager.CreateReleaseBundlesFromMultipleSources(rbDetails, queryParams, gpgKeyPairName, sources)) +} + +func buildMultiSources(sources []services.RbSource, buildsSourcesStr, bundlesSourcesStr, projectKey string) []services.RbSource { + // Process Builds + if buildsSourcesStr != "" { + sources = buildMultiBuildSources(sources, buildsSourcesStr) + } + + // Process Release Bundles + if bundlesSourcesStr != "" { + sources = buildMultiBundleSources(sources, bundlesSourcesStr, projectKey) + } + + return sources +} + +func buildMultiBundleSources(sources []services.RbSource, bundlesSourcesStr, projectKey string) []services.RbSource { + var releaseBundleSources []services.ReleaseBundleSource + bundleEntries := strings.Split(bundlesSourcesStr, ";") + for _, entry := range bundleEntries { + entry = strings.TrimSpace(entry) + if entry == "" { + continue + } + // Assuming the format "name=xxx, version=xxx" + components := strings.Split(entry, ",") + if len(components) != 2 { + continue + } + name := strings.TrimSpace(strings.Split(components[0], "=")[1]) + version := strings.TrimSpace(strings.Split(components[1], "=")[1]) + + releaseBundleSources = append(releaseBundleSources, services.ReleaseBundleSource{ + ProjectKey: projectKey, + ReleaseBundleName: name, + ReleaseBundleVersion: version, + }) + } + if len(releaseBundleSources) > 0 { + sources = append(sources, services.RbSource{ + SourceType: "release_bundles", + ReleaseBundles: releaseBundleSources, + }) + } + return sources +} + +func buildMultiBuildSources(sources []services.RbSource, sourcesStr string) []services.RbSource { + var buildSources []services.BuildSource + buildEntries := strings.Split(sourcesStr, ";") + for _, entry := range buildEntries { + entry = strings.TrimSpace(entry) + if entry == "" { + continue + } + // Assuming the format "name=xxx, number=xxx, include-dep=true" + components := strings.Split(entry, ",") + if len(components) < 2 { + continue + } + + name := strings.TrimSpace(strings.Split(components[0], "=")[1]) + number := strings.TrimSpace(strings.Split(components[1], "=")[1]) + + includeDepStr := "false" + if len(components) >= 3 { + parts := strings.Split(components[2], "=") + if len(parts) > 1 { + includeDepStr = strings.TrimSpace(parts[1]) + } + } + + includeDep, _ := strconv.ParseBool(includeDepStr) + + buildSources = append(buildSources, services.BuildSource{ + BuildRepository: getBuildInfoRepositoryByProject("default"), + BuildName: name, + BuildNumber: number, + IncludeDependencies: includeDep, + }) + } + if len(buildSources) > 0 { + sources = append(sources, services.RbSource{ + SourceType: "builds", + Builds: buildSources, + }) + } + return sources +} + +func getBuildInfoRepositoryByProject(projectKey string) string { + buildRepo := "artifactory" + if projectKey != "" && projectKey != "default" { + buildRepo = projectKey + } + return buildRepo + "-build-info" +} func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buildNumber, rbName, rbVersion, project string, sync, withoutSigningKey bool) { argsAndOptions := []string{ From 375c9bbed26d06fdf34d7b92890062808f246d01 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Thu, 22 May 2025 14:23:54 +0300 Subject: [PATCH 06/41] Introduce support for create release bundle from multiple sources defined in spec and support a new source type --- lifecycle_test.go | 63 +++++++++++++++---- .../filespecs/lifecycle-multiple-sources.json | 26 ++++++++ testdata/filespecs/lifecycle-packages.json | 10 +++ 3 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 testdata/filespecs/lifecycle-multiple-sources.json create mode 100644 testdata/filespecs/lifecycle-packages.json diff --git a/lifecycle_test.go b/lifecycle_test.go index 31a24b966..433985a63 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -97,7 +97,7 @@ func compareRbArtifacts(t *testing.T, actual services.ReleaseBundleSpecResponse, assert.ElementsMatch(t, actualArtifactsPaths, expected) } -func TestReleaseBundleCreationFromMultipleBuilds(t *testing.T) { +func TestReleaseBundleCreationFromMultipleBuildsUsingCommandFlag(t *testing.T) { cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) defer cleanCallback() @@ -106,12 +106,12 @@ func TestReleaseBundleCreationFromMultipleBuilds(t *testing.T) { deleteBuilds := uploadBuilds(t) defer deleteBuilds() - createRbFromMultiSources(t, lcManager, GetMultiSourcesForBuilds(), "", tests.LcRbName1, number1, "default", true) + createRbFromMultiSourcesUsingCommandFlags(t, lcManager, GetMultiSourcesForBuilds(), "", tests.LcRbName1, number1, "default", true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") } -func TestReleaseBundleCreationFromMultipleBundles(t *testing.T) { +func TestReleaseBundleCreationFromMultipleBundlesUsingCommandFlag(t *testing.T) { cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) defer cleanCallback() @@ -126,12 +126,12 @@ func TestReleaseBundleCreationFromMultipleBundles(t *testing.T) { createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - createRbFromMultiSources(t, lcManager, "", GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) + createRbFromMultiSourcesUsingCommandFlags(t, lcManager, "", GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") } -func TestReleaseBundleCreationFromMultipleBuildsAndBundles(t *testing.T) { +func TestReleaseBundleCreationFromMultipleBuildsAndBundlesUsingCommandFlag(t *testing.T) { cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) defer cleanCallback() @@ -146,7 +146,47 @@ func TestReleaseBundleCreationFromMultipleBuildsAndBundles(t *testing.T) { createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - createRbFromMultiSources(t, lcManager, GetMultiSourcesForBuilds(), GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) + createRbFromMultiSourcesUsingCommandFlags(t, lcManager, GetMultiSourcesForBuilds(), GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) + assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") +} + +func TestReleaseBundleCreationFromMultipleSourcesUsingSpec(t *testing.T) { + + cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + + createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + + createRbFromSpec(t, tests.LifecycleMultipleSources, tests.LcRbName3, number3, true, true) + defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) + assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") +} + +func TestReleaseBundleCreationFromPackages(t *testing.T) { + + cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) + defer cleanCallback() + lcManager := getLcServiceManager(t) + + deleteBuilds := uploadBuilds(t) + defer deleteBuilds() + + //createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) + //defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) + + //createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) + //defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) + + createRbFromSpec(t, tests.LifecyclePackages, tests.LcRbName3, number3, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") } @@ -223,11 +263,12 @@ func TestLifecycleFullFlow(t *testing.T) { // Export release lifecycle bundle archive - tempDir, cleanUp := coreTests.CreateTempDirWithCallbackAndAssert(t) - defer cleanUp() + //Temporary disabled + /*tempDir, cleanUp := coreTests.CreateTempDirWithCallbackAndAssert(t) + defer cleanUp()*/ - exportRb(t, tests.LcRbName2, number2, tempDir) - defer deleteExportedReleaseBundle(t, tests.LcRbName2) + /*exportRb(t, tests.LcRbName2, number2, tempDir) + defer deleteExportedReleaseBundle(t, tests.LcRbName2)*/ // TODO Temporarily disabling till distribution on testing suite is stable. /* @@ -347,7 +388,7 @@ func TestCreateBundleWithoutSpecAndWithProject(t *testing.T) { defer deleteReleaseBundleWithProject(t, lcManager, tests.LcRbName1, number1, tests.ProjectKey) } -func createRbFromMultiSources(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, buildsSourcesOption, bundlesSourcesOption, +func createRbFromMultiSourcesUsingCommandFlags(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, buildsSourcesOption, bundlesSourcesOption, rbName, rbVersion, project string, sync bool) { var sources []services.RbSource sources = buildMultiSources(sources, buildsSourcesOption, bundlesSourcesOption, project) diff --git a/testdata/filespecs/lifecycle-multiple-sources.json b/testdata/filespecs/lifecycle-multiple-sources.json new file mode 100644 index 000000000..4a043ad05 --- /dev/null +++ b/testdata/filespecs/lifecycle-multiple-sources.json @@ -0,0 +1,26 @@ +{ + "files": [ + { + "build": "${LC_BUILD_NAME3}", + "includeDeps": "true" + }, + { + "bundle": "${RB_NAME1}/111" + }, + { + "bundle": "${RB_NAME2}/222" + }, + { + "pattern": "${DEV_REPO}/b*" + }, + { + "aql": { + "items.find": { + "repo": "${DEV_REPO}", + "path": ".", + "name": "a2.in" + } + } + } + ] +} \ No newline at end of file diff --git a/testdata/filespecs/lifecycle-packages.json b/testdata/filespecs/lifecycle-packages.json new file mode 100644 index 000000000..dc333dcef --- /dev/null +++ b/testdata/filespecs/lifecycle-packages.json @@ -0,0 +1,10 @@ +{ + "files": [ + { + "package": "commons", + "version": "1.0.0", + "type": "maven", + "repoKey": "commons-dev-maven-local" + } + ] +} \ No newline at end of file From 3374fd18f97b1d2f1eb6ed2142c9da74e638503d Mon Sep 17 00:00:00 2001 From: Eyal Delarea Date: Sun, 18 May 2025 10:50:23 +0300 Subject: [PATCH 07/41] Bump ver from 2.75.1 to 2.76.0 (#2974) --- build/npm/v2-jf/package-lock.json | 2 +- build/npm/v2-jf/package.json | 2 +- build/npm/v2/package-lock.json | 2 +- build/npm/v2/package.json | 2 +- go.mod | 8 ++++---- utils/cliutils/cli_consts.go | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/build/npm/v2-jf/package-lock.json b/build/npm/v2-jf/package-lock.json index bfee82354..e145ee580 100644 --- a/build/npm/v2-jf/package-lock.json +++ b/build/npm/v2-jf/package-lock.json @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.75.1", + "version": "2.76.0", "lockfileVersion": 1 } diff --git a/build/npm/v2-jf/package.json b/build/npm/v2-jf/package.json index c549b4380..13cb5cc9a 100644 --- a/build/npm/v2-jf/package.json +++ b/build/npm/v2-jf/package.json @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.75.1", + "version": "2.76.0", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff --git a/build/npm/v2/package-lock.json b/build/npm/v2/package-lock.json index 7af3af9aa..139dd4791 100644 --- a/build/npm/v2/package-lock.json +++ b/build/npm/v2/package-lock.json @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2", - "version": "2.75.1", + "version": "2.76.0", "lockfileVersion": 2 } diff --git a/build/npm/v2/package.json b/build/npm/v2/package.json index 34d94fc8b..009185733 100644 --- a/build/npm/v2/package.json +++ b/build/npm/v2/package.json @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2", - "version": "2.75.1", + "version": "2.76.0", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff --git a/go.mod b/go.mod index 2f1b77bd9..402b98225 100644 --- a/go.mod +++ b/go.mod @@ -191,10 +191,10 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) -replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad +//replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad -replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd +//replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd -replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 +//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 -replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 +//replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 diff --git a/utils/cliutils/cli_consts.go b/utils/cliutils/cli_consts.go index 71e33077f..98c50b840 100644 --- a/utils/cliutils/cli_consts.go +++ b/utils/cliutils/cli_consts.go @@ -4,7 +4,7 @@ import "time" const ( // General CLI constants - CliVersion = "2.75.1" + CliVersion = "2.76.0" ClientAgent = "jfrog-cli-go" // CLI base commands constants: From c8f7fef808cbd1c5aee7446267b4f30aefd2a6ab Mon Sep 17 00:00:00 2001 From: Eyal Delarea Date: Sun, 18 May 2025 11:25:29 +0300 Subject: [PATCH 08/41] Update go version to `v1.23.9` (#2975) --- Jenkinsfile | 2 +- build/docker/slim/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b365eee6c..a6fe14efe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -31,7 +31,7 @@ node("docker-ubuntu20-xlarge") { repo = 'jfrog-cli' sh 'rm -rf temp' sh 'mkdir temp' - def goRoot = tool 'go-1.23.7' + def goRoot = tool 'go-1.23.9' env.GOROOT="$goRoot" env.PATH+=":${goRoot}/bin:/tmp/node-${nodeVersion}-linux-x64/bin" env.GO111MODULE="on" diff --git a/build/docker/slim/Dockerfile b/build/docker/slim/Dockerfile index 0391d27c2..975a8f769 100644 --- a/build/docker/slim/Dockerfile +++ b/build/docker/slim/Dockerfile @@ -1,6 +1,6 @@ ARG repo_name_21 # Remove ${repo_name_21} to pull from Docker Hub. -FROM ${repo_name_21}/jfrog-docker/golang:1.23.7-alpine as builder +FROM ${repo_name_21}/jfrog-docker/golang:1.23.9-alpine as builder ARG image_name=jfrog-cli ARG cli_executable_name WORKDIR /${image_name} From 7f216e414a6276f1147c9b7b63ba0560058a84ff Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Thu, 22 May 2025 20:05:07 +0300 Subject: [PATCH 09/41] Update dependencies --- go.sum | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index 3c3f8a164..bb4d749fe 100644 --- a/go.sum +++ b/go.sum @@ -311,8 +311,8 @@ github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250508151803-478427ca9cb3 h1:8 github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250508151803-478427ca9cb3/go.mod h1:MVap+qb0Gft98yJdPe2si2GqtxQczDVEuC8oxbUTDLk= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c h1:NTFV7lRdjkGaF52pweS4XN3bZWR4PqQwwLHruXPqLXc= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= -github.com/rimapol/jfrog-client-go v0.0.0-20250508103333-1551b7df1785 h1:ZfqjHUZPhY1gnOYDaJr57mtZureehnWhC3KS6h2lrTc= -github.com/rimapol/jfrog-client-go v0.0.0-20250508103333-1551b7df1785/go.mod h1:uRmT8Q1SJymIzId01v0W1o8mGqrRfrwUF53CgEMsH0U= +github.com/rimapol/jfrog-client-go v0.0.0-20250514094816-8eb9b6915976 h1:67ATEE7YXYyr3GX0BjOGV2YOKuMrEm/HQCYgQk6VEd0= +github.com/rimapol/jfrog-client-go v0.0.0-20250514094816-8eb9b6915976/go.mod h1:IKmGx4sYeaiSKBnVzp/j6lVrmyRAXTABfo3B02SPxXI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= From 0e11a9e5bc8714ab221e5eb7bf8914a3c3003721 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Thu, 22 May 2025 21:55:51 +0300 Subject: [PATCH 10/41] Update dependencies --- go.sum | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/go.sum b/go.sum index bb4d749fe..632c020cf 100644 --- a/go.sum +++ b/go.sum @@ -307,12 +307,14 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250508151803-478427ca9cb3 h1:82noQEs1SCA6lSzOMBtPNO32N+pfjZFLSeq94Oq9Rh4= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250508151803-478427ca9cb3/go.mod h1:MVap+qb0Gft98yJdPe2si2GqtxQczDVEuC8oxbUTDLk= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522170414-a043a12a9877 h1:eA2k4p6j5QGCs2bPDGZHF74XGEs5fR2zmhFWuiITyVM= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522170414-a043a12a9877/go.mod h1:p7OY3+SCd0mg8773VZWV9iR8NO0VlzTAEopt3RHm0tg= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c h1:NTFV7lRdjkGaF52pweS4XN3bZWR4PqQwwLHruXPqLXc= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= -github.com/rimapol/jfrog-client-go v0.0.0-20250514094816-8eb9b6915976 h1:67ATEE7YXYyr3GX0BjOGV2YOKuMrEm/HQCYgQk6VEd0= -github.com/rimapol/jfrog-client-go v0.0.0-20250514094816-8eb9b6915976/go.mod h1:IKmGx4sYeaiSKBnVzp/j6lVrmyRAXTABfo3B02SPxXI= +github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522184433-a2431050f9b2 h1:nDRYsm2/KFHTYCeNAXrV/Cr9IdWnh4IcjvUq7wWFXUI= +github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522184433-a2431050f9b2/go.mod h1:pHvN6UAcJovrft8xxrAfP8PFiCzkXhUW15+s/V18eH0= +github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b h1:GwX69R0rU/zfLYCkngpcpHh/6xMXt5oL0f/LMUF0orM= +github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b/go.mod h1:IKmGx4sYeaiSKBnVzp/j6lVrmyRAXTABfo3B02SPxXI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= From e30bfa0046a8b468a85023d58249e62d9e25089d Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Thu, 22 May 2025 22:12:38 +0300 Subject: [PATCH 11/41] Update dependencies --- go.sum | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go.sum b/go.sum index 632c020cf..f79bae988 100644 --- a/go.sum +++ b/go.sum @@ -309,10 +309,13 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522170414-a043a12a9877 h1:eA2k4p6j5QGCs2bPDGZHF74XGEs5fR2zmhFWuiITyVM= github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522170414-a043a12a9877/go.mod h1:p7OY3+SCd0mg8773VZWV9iR8NO0VlzTAEopt3RHm0tg= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522190754-4f57f1e65ad2/go.mod h1:ZIY4HcEzmLssI6BDwolfeOeTEcUucFDK8SLtVHoNdp0= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c h1:NTFV7lRdjkGaF52pweS4XN3bZWR4PqQwwLHruXPqLXc= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250522185315-738a9866af5d/go.mod h1:nakW0TMiS7627SEvccDuersLc8OKhKJ1sPc/QePaPVE= github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522184433-a2431050f9b2 h1:nDRYsm2/KFHTYCeNAXrV/Cr9IdWnh4IcjvUq7wWFXUI= github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522184433-a2431050f9b2/go.mod h1:pHvN6UAcJovrft8xxrAfP8PFiCzkXhUW15+s/V18eH0= +github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522191036-4d4fc3a1ac3c/go.mod h1:a2cAU1DAY8DOXCyP2D5h6OdVfW1PMzwPGMbwmsg/2mk= github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b h1:GwX69R0rU/zfLYCkngpcpHh/6xMXt5oL0f/LMUF0orM= github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b/go.mod h1:IKmGx4sYeaiSKBnVzp/j6lVrmyRAXTABfo3B02SPxXI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= From f766ec3c002c071106f99c623d734f4cb85b05bf Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 23 May 2025 00:12:38 +0300 Subject: [PATCH 12/41] Update dependency --- go.sum | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/go.sum b/go.sum index f79bae988..b0e118b13 100644 --- a/go.sum +++ b/go.sum @@ -313,8 +313,7 @@ github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522190754-4f57f1e65ad2/go.m github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c h1:NTFV7lRdjkGaF52pweS4XN3bZWR4PqQwwLHruXPqLXc= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250522185315-738a9866af5d/go.mod h1:nakW0TMiS7627SEvccDuersLc8OKhKJ1sPc/QePaPVE= -github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522184433-a2431050f9b2 h1:nDRYsm2/KFHTYCeNAXrV/Cr9IdWnh4IcjvUq7wWFXUI= -github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522184433-a2431050f9b2/go.mod h1:pHvN6UAcJovrft8xxrAfP8PFiCzkXhUW15+s/V18eH0= +github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522191036-4d4fc3a1ac3c h1:SOt1gERrDYavjyh8Au0hSTcj1QONFzw+/aZ3641ech0= github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522191036-4d4fc3a1ac3c/go.mod h1:a2cAU1DAY8DOXCyP2D5h6OdVfW1PMzwPGMbwmsg/2mk= github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b h1:GwX69R0rU/zfLYCkngpcpHh/6xMXt5oL0f/LMUF0orM= github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b/go.mod h1:IKmGx4sYeaiSKBnVzp/j6lVrmyRAXTABfo3B02SPxXI= From ee8bb9478d32af47a1d168ff217ce63e3c4b18a7 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 23 May 2025 00:27:54 +0300 Subject: [PATCH 13/41] Fix lynt errors --- lifecycle_test.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index 433985a63..aecf7a88a 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -180,12 +180,6 @@ func TestReleaseBundleCreationFromPackages(t *testing.T) { deleteBuilds := uploadBuilds(t) defer deleteBuilds() - //createRbFromSpec(t, tests.LifecycleBuilds12, tests.LcRbName1, number1, true, true) - //defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) - - //createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) - //defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - createRbFromSpec(t, tests.LifecyclePackages, tests.LcRbName3, number3, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") @@ -263,12 +257,11 @@ func TestLifecycleFullFlow(t *testing.T) { // Export release lifecycle bundle archive - //Temporary disabled - /*tempDir, cleanUp := coreTests.CreateTempDirWithCallbackAndAssert(t) - defer cleanUp()*/ + tempDir, cleanUp := coreTests.CreateTempDirWithCallbackAndAssert(t) + defer cleanUp() - /*exportRb(t, tests.LcRbName2, number2, tempDir) - defer deleteExportedReleaseBundle(t, tests.LcRbName2)*/ + exportRb(t, tests.LcRbName2, number2, tempDir) + defer deleteExportedReleaseBundle(t, tests.LcRbName2) // TODO Temporarily disabling till distribution on testing suite is stable. /* From e9caff069b747546fcc3e35773b4864ed01fed61 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 23 May 2025 00:46:56 +0300 Subject: [PATCH 14/41] Fix lynt errors --- buildtools/cli.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 44e4182d2..4f0a0b39d 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -1086,7 +1086,7 @@ func terraformCmd(c *cli.Context) error { case "publish", "p": return terraformPublishCmd(configFilePath, filteredArgs, c) default: - return errorutils.CheckErrorf("Terraform command:\"" + cmdName + "\" is not supported. " + cliutils.GetDocumentationMessage()) + return errorutils.CheckErrorf(fmt.Sprintf("Terraform command: \"%s\" is not supported. %s", cmdName, cliutils.GetDocumentationMessage())) } } From b8cc35090b6d769390bb42c89e438646bcd8fee5 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 23 May 2025 00:57:09 +0300 Subject: [PATCH 15/41] Fix lynt errors --- buildtools/cli.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 4f0a0b39d..6ef5b767a 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -1086,7 +1086,8 @@ func terraformCmd(c *cli.Context) error { case "publish", "p": return terraformPublishCmd(configFilePath, filteredArgs, c) default: - return errorutils.CheckErrorf(fmt.Sprintf("Terraform command: \"%s\" is not supported. %s", cmdName, cliutils.GetDocumentationMessage())) + msg := fmt.Sprintf("Terraform command: \"%s\" is not supported. %s", cmdName, cliutils.GetDocumentationMessage()) + return errorutils.CheckError(errors.New(msg)) } } From 91a8ad0d9a99060d8738981937a2b44e54d6de4d Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 23 May 2025 01:03:29 +0300 Subject: [PATCH 16/41] Revert format changes --- buildtools/cli.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 6ef5b767a..44e4182d2 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -1086,8 +1086,7 @@ func terraformCmd(c *cli.Context) error { case "publish", "p": return terraformPublishCmd(configFilePath, filteredArgs, c) default: - msg := fmt.Sprintf("Terraform command: \"%s\" is not supported. %s", cmdName, cliutils.GetDocumentationMessage()) - return errorutils.CheckError(errors.New(msg)) + return errorutils.CheckErrorf("Terraform command:\"" + cmdName + "\" is not supported. " + cliutils.GetDocumentationMessage()) } } From 733e96fb7ce1882d2ad8d5c4cec873e09fe37d70 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 23 May 2025 01:15:19 +0300 Subject: [PATCH 17/41] Remove unused --- utils/tests/consts.go | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/tests/consts.go b/utils/tests/consts.go index 16e6ba868..f1e344cff 100644 --- a/utils/tests/consts.go +++ b/utils/tests/consts.go @@ -168,7 +168,6 @@ const ( YarnRemoteRepositoryConfig = "yarn_remote_repository_config.json" ReleaseLifecycleImportDependencySpec = "import_bundle_repo_dependency.json" UseNpmRcFlag = "--use-npmrc" - MultipleBuilds = "name=cli-lc-build1, id=111, include-deps=true; name=cli-lc-build2, id=222" ) var ( From 64cb12adf7352b78b8a7e1d05bab2db8afd78399 Mon Sep 17 00:00:00 2001 From: Eyal Delarea Date: Wed, 28 May 2025 11:11:54 +0300 Subject: [PATCH 18/41] Bump ver from 2.76.0 to 2.76.1 (#2986) --- build/npm/v2-jf/package-lock.json | 2 +- build/npm/v2-jf/package.json | 2 +- build/npm/v2/package-lock.json | 2 +- build/npm/v2/package.json | 2 +- utils/cliutils/cli_consts.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/npm/v2-jf/package-lock.json b/build/npm/v2-jf/package-lock.json index e145ee580..4df8b441a 100644 --- a/build/npm/v2-jf/package-lock.json +++ b/build/npm/v2-jf/package-lock.json @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.76.0", + "version": "2.76.1", "lockfileVersion": 1 } diff --git a/build/npm/v2-jf/package.json b/build/npm/v2-jf/package.json index 13cb5cc9a..e1038551c 100644 --- a/build/npm/v2-jf/package.json +++ b/build/npm/v2-jf/package.json @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.76.0", + "version": "2.76.1", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff --git a/build/npm/v2/package-lock.json b/build/npm/v2/package-lock.json index 139dd4791..a807a3086 100644 --- a/build/npm/v2/package-lock.json +++ b/build/npm/v2/package-lock.json @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2", - "version": "2.76.0", + "version": "2.76.1", "lockfileVersion": 2 } diff --git a/build/npm/v2/package.json b/build/npm/v2/package.json index 009185733..d64246552 100644 --- a/build/npm/v2/package.json +++ b/build/npm/v2/package.json @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2", - "version": "2.76.0", + "version": "2.76.1", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff --git a/utils/cliutils/cli_consts.go b/utils/cliutils/cli_consts.go index 98c50b840..436d213b8 100644 --- a/utils/cliutils/cli_consts.go +++ b/utils/cliutils/cli_consts.go @@ -4,7 +4,7 @@ import "time" const ( // General CLI constants - CliVersion = "2.76.0" + CliVersion = "2.76.1" ClientAgent = "jfrog-cli-go" // CLI base commands constants: From 6f93bbe12a2bb0a8515d54d3eeb29027fe79cea4 Mon Sep 17 00:00:00 2001 From: reshmifrog Date: Thu, 29 May 2025 17:11:09 +0530 Subject: [PATCH 19/41] Add tests for twine (#2985) --- go.mod | 2 ++ pip_test.go | 2 ++ ....test.in.artifactorydev.rc.6-py3-none-any.whl | Bin 0 -> 1181 bytes ...0+pr.17.br.test.in.artifactorydev.rc.6.tar.gz | Bin 0 -> 961 bytes .../twine/pyprojectlongfilename/pyproject.toml | 15 +++++++++++++++ 5 files changed, 19 insertions(+) create mode 100644 testdata/twine/pyprojectlongfilename/dist/jfrog-python-example-long-filename-2.0.0.dev0+pr.17.br.test.in.artifactorydev.rc.6-py3-none-any.whl create mode 100644 testdata/twine/pyprojectlongfilename/dist/jfrog-python-example-long-filename-2.0.0.dev0+pr.17.br.test.in.artifactorydev.rc.6.tar.gz create mode 100644 testdata/twine/pyprojectlongfilename/pyproject.toml diff --git a/go.mod b/go.mod index 402b98225..eab68ee64 100644 --- a/go.mod +++ b/go.mod @@ -191,6 +191,8 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) +replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20250529104758-6d769a684388 + //replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd diff --git a/pip_test.go b/pip_test.go index 53de3db1a..311f179b8 100644 --- a/pip_test.go +++ b/pip_test.go @@ -223,6 +223,8 @@ func TestTwine(t *testing.T) { }{ {"twine", "pyproject", "twine", "jfrog-python-example:1.0", []string{}, 2}, {"twine-with-module", "pyproject", "twine-with-module", "twine-with-module", []string{"--module=twine-with-module"}, 2}, + {"twine-columns-env-long-filename", "pyprojectlongfilename", "twine-with-long-filename", + "twine-with-long-filename", []string{"--module=twine-with-long-filename"}, 2}, } // Run test cases. diff --git a/testdata/twine/pyprojectlongfilename/dist/jfrog-python-example-long-filename-2.0.0.dev0+pr.17.br.test.in.artifactorydev.rc.6-py3-none-any.whl b/testdata/twine/pyprojectlongfilename/dist/jfrog-python-example-long-filename-2.0.0.dev0+pr.17.br.test.in.artifactorydev.rc.6-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..be3eea6469ff0a155051d7ff4f0d6ebb98c2c3f9 GIT binary patch literal 1181 zcmWIWW@Zs#U|`^22(~hcbZD9xaT>@|WMp8_2GUt+MfvIR1(hWk`FZiF6^Xe8IjOpa zdIowanZ+f#nR#jX`o69qjxLTNj!e&$J8BAWji?J}%AW^_)Ho$APWy?eWExpHaQgC9$K zUQhg6xU?ei{Y8nV?wsoR>m!6yxb&_awtThkqBHmMlMH&s{Jyep%ufE5G2OWAz_x1& z<*R(-t(C-60=IB>rw2v{`#5&h{GY9|A=D>MzdmN?cf5B z!}sh(UTg#2Fam>g*rn(tCDySrgC+ z7w+bBifD>RTCsRIYleBRl!+)3P(Gop+1XH2tN#2K^Y?4d8>hD1PdQrU^nA}_-Oy{R zmd(?1(whG7%)D(HZE`(|0-@_>>#q;aygGCKr-nODPiCIo^zqiuxtnz4#21UDna@1) zacX`}ro;UktAG7h`Y6ct-p=mEPqTH)Yz=QL*LHvMYD>kxzn<$i`DnzDw>CI3vF(t4m>1H}5h3aH2M5%EQ1+CBX-ERnEORYhEAPJU7~6Wva%?VktYmh=%rQ z96NWPU{3hT9^lQ$B*Kh4lK=w<43;#4C=#*^y20ov4Pq<3E;fAxm5TL|UoGwwh*;yZ6&}UBfzVp>eAQ7O+@)$uoHl1Y2H7&q;eV^yDI7E(W`&V9Fd zoem)#vtPNNvP^#OXIz}`OYK4TZj6uG5(LOMgKRz|7-Doyy*WLI6wIRa{pheI$XQ{ z!-fb&sQ;k;gZdBn5BvxIgZ?xApB#NZe)r)-;bZ=M{u{)Y<3AyyTm=5tpp5Z6QId(Y z+V!5aa#;MO=a3~V8nS3GaRWcP%2qfetth=hR~{#Bz^+-aT7WiKz<=OB@E`cUCjTF@ z?>&pgABL1O@m`a_34s4l|8IN!uXk`) zm@w4;!2etRCzB23|1$nh7kdf*8`#1cHuNd~4RJ{T{I5Z;U#WSPs^Yh+EV@QzAV`vk ziVzhcz~eZ`kRK*-%F7l>DmHH@g1FPfjZ za-bTL77zbB?PBLln_Dahs7~>2K|s|fPsOg4R~%FaC3J8_J(fAAXJvyQiRcId_hwei jIc?9(tF(7e``*+_TO9TltOo=Fy|DfOmMIjx08jt`K6~}2 literal 0 HcmV?d00001 diff --git a/testdata/twine/pyprojectlongfilename/pyproject.toml b/testdata/twine/pyprojectlongfilename/pyproject.toml new file mode 100644 index 000000000..2e8aae132 --- /dev/null +++ b/testdata/twine/pyprojectlongfilename/pyproject.toml @@ -0,0 +1,15 @@ +[build-system] +requires = ["setuptools>=42", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "jfrog-python-example-long-filename" +version = "2.0.0.dev0+pr.17.br.test.in.artifactorydev.rc.6" +description = "Project example for building Python project with JFrog products with long filename" +authors = [ + { name="JFrog", email="jfrog@jfrog.com" } +] +dependencies = [ + "PyYAML>3.11", + "nltk" +] From 5c35371cb37fbbd40b1446f0227aceb82157b8d7 Mon Sep 17 00:00:00 2001 From: Agrasth Naman Date: Fri, 30 May 2025 10:18:21 +0530 Subject: [PATCH 20/41] Feature/docker validate sha (#2971) * Add --validate-sha flag for Docker push command * Fix SetValidateSha method ordering in push command * Reverted updated artifactory versions in tests * Update help.go --- buildtools/cli.go | 46 ++++++++++++++++----------------- utils/cliutils/commandsflags.go | 15 ++++++++--- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 44e4182d2..1ee4c8e74 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -3,15 +3,16 @@ package buildtools import ( "errors" "fmt" + "os" + "strconv" + "strings" + "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/python" "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/setup" "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" "github.com/jfrog/jfrog-cli-core/v2/utils/ioutils" "github.com/jfrog/jfrog-cli-security/utils/techutils" setupdocs "github.com/jfrog/jfrog-cli/docs/buildtools/setup" - "os" - "strconv" - "strings" "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/container" "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/dotnet" @@ -768,7 +769,7 @@ func pullCmd(c *cli.Context, image string) error { if show, err := cliutils.ShowGenericCmdHelpIfNeeded(c, c.Args(), "dockerpullhelp"); show || err != nil { return err } - _, rtDetails, _, skipLogin, filteredDockerArgs, buildConfiguration, err := extractDockerOptionsFromArgs(c.Args()) + _, rtDetails, _, skipLogin, _, filteredDockerArgs, buildConfiguration, err := extractDockerOptionsFromArgs(c.Args()) if err != nil { return err } @@ -791,24 +792,24 @@ func pushCmd(c *cli.Context, image string) (err error) { if show, err := cliutils.ShowCmdHelpIfNeeded(c, c.Args()); show || err != nil { return err } - threads, rtDetails, detailedSummary, skipLogin, filteredDockerArgs, buildConfiguration, err := extractDockerOptionsFromArgs(c.Args()) + threads, rtDetails, detailedSummary, skipLogin, validateSha, filteredDockerArgs, buildConfiguration, err := extractDockerOptionsFromArgs(c.Args()) if err != nil { return } printDeploymentView := log.IsStdErrTerminal() - PushCommand := container.NewPushCommand(containerutils.DockerClient) - PushCommand.SetThreads(threads).SetDetailedSummary(detailedSummary || printDeploymentView).SetCmdParams(filteredDockerArgs).SetSkipLogin(skipLogin).SetBuildConfiguration(buildConfiguration).SetServerDetails(rtDetails).SetImageTag(image) - supported, err := PushCommand.IsGetRepoSupported() + pushCommand := container.NewPushCommand(containerutils.DockerClient) + pushCommand.SetThreads(threads).SetDetailedSummary(detailedSummary || printDeploymentView).SetCmdParams(filteredDockerArgs).SetSkipLogin(skipLogin).SetBuildConfiguration(buildConfiguration).SetServerDetails(rtDetails).SetValidateSha(validateSha).SetImageTag(image) + supported, err := pushCommand.IsGetRepoSupported() if err != nil { return err } if !supported { return cliutils.NotSupportedNativeDockerCommand("docker-push") } - err = commands.Exec(PushCommand) - result := PushCommand.Result() + err = commands.Exec(pushCommand) + result := pushCommand.Result() defer cliutils.CleanupResult(result, &err) - err = cliutils.PrintCommandSummary(PushCommand.Result(), detailedSummary, printDeploymentView, false, err) + err = cliutils.PrintCommandSummary(pushCommand.Result(), detailedSummary, printDeploymentView, false, err) return } @@ -824,7 +825,7 @@ func dockerNativeCmd(c *cli.Context) error { if show, err := cliutils.ShowCmdHelpIfNeeded(c, c.Args()); show || err != nil { return err } - _, _, _, _, cleanArgs, _, err := extractDockerOptionsFromArgs(c.Args()) + _, _, _, _, _, cleanArgs, _, err := extractDockerOptionsFromArgs(c.Args()) if err != nil { return err } @@ -833,7 +834,7 @@ func dockerNativeCmd(c *cli.Context) error { } // Remove all the none docker CLI flags from args. -func extractDockerOptionsFromArgs(args []string) (threads int, serverDetails *coreConfig.ServerDetails, detailedSummary, skipLogin bool, cleanArgs []string, buildConfig *build.BuildConfiguration, err error) { +func extractDockerOptionsFromArgs(args []string) (threads int, serverDetails *coreConfig.ServerDetails, detailedSummary, skipLogin bool, validateSha bool, cleanArgs []string, buildConfig *build.BuildConfiguration, err error) { cleanArgs = append([]string(nil), args...) var serverId string cleanArgs, serverId, err = coreutils.ExtractServerIdFromCommand(cleanArgs) @@ -856,6 +857,11 @@ func extractDockerOptionsFromArgs(args []string) (threads int, serverDetails *co if err != nil { return } + // Extract validateSha flag + cleanArgs, validateSha, err = coreutils.ExtractBoolFlagFromArgs(cleanArgs, "validate-sha") + if err != nil { + return + } cleanArgs, buildConfig, err = build.ExtractBuildDetailsFromArgs(cleanArgs) return } @@ -934,17 +940,9 @@ func NpmPublishCmd(c *cli.Context) (err error) { if npmCmd.GetXrayScan() { commandsUtils.ConditionalUploadScanFunc = scan.ConditionalUploadDefaultScanFunc } - - var printDeploymentView, detailedSummary bool - - // Deployment view and Detailed summary is not supported when using npmrc for publishing since transfer details are not available. - if npmCmd.UseNative() { - printDeploymentView, detailedSummary = false, false - } else { - printDeploymentView, detailedSummary = log.IsStdErrTerminal(), npmCmd.IsDetailedSummary() - if !detailedSummary { - npmCmd.SetDetailedSummary(printDeploymentView) - } + printDeploymentView, detailedSummary := log.IsStdErrTerminal(), npmCmd.IsDetailedSummary() + if !detailedSummary { + npmCmd.SetDetailedSummary(printDeploymentView) } err = commands.Exec(npmCmd) result := npmCmd.Result() diff --git a/utils/cliutils/commandsflags.go b/utils/cliutils/commandsflags.go index 15b786258..37f34f462 100644 --- a/utils/cliutils/commandsflags.go +++ b/utils/cliutils/commandsflags.go @@ -2,10 +2,11 @@ package cliutils import ( "fmt" - "github.com/jfrog/jfrog-cli-artifactory/cliutils/flagkit" "sort" "strconv" + "github.com/jfrog/jfrog-cli-artifactory/cliutils/flagkit" + commonCliUtils "github.com/jfrog/jfrog-cli-core/v2/common/cliutils" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" @@ -345,6 +346,7 @@ const ( // Build tool flags deploymentThreads = "deployment-threads" skipLogin = "skip-login" + validateSha = "validate-sha" // Unique docker promote flags dockerPromotePrefix = "docker-promote-" @@ -1708,6 +1710,11 @@ var flagsMap = map[string]cli.Flag{ runNative: cli.BoolFlag{ Name: runNative, Usage: "[Default: false] Set to true if you'd like to use the native client configurations. Note: This flag would invoke native client behind the scenes, has performance implications and does not support deployment view and detailed summary` `", + + }, + validateSha: cli.BoolFlag{ + Name: validateSha, + Usage: "[Default: false] Set to true to enable SHA validation during Docker push.` `", }, } @@ -1829,11 +1836,11 @@ var commandFlags = map[string][]string{ }, Docker: { BuildName, BuildNumber, module, Project, - serverId, skipLogin, threads, detailedSummary, watches, repoPath, licenses, xrOutput, fail, ExtendedTable, BypassArchiveLimits, MinSeverity, FixableOnly, vuln, + serverId, skipLogin, threads, detailedSummary, watches, repoPath, licenses, xrOutput, fail, ExtendedTable, BypassArchiveLimits, MinSeverity, FixableOnly, vuln, validateSha, }, DockerPush: { BuildName, BuildNumber, module, Project, - serverId, skipLogin, threads, detailedSummary, + serverId, skipLogin, threads, detailedSummary, validateSha, }, DockerPull: { BuildName, BuildNumber, module, Project, @@ -1845,7 +1852,7 @@ var commandFlags = map[string][]string{ }, ContainerPush: { BuildName, BuildNumber, module, url, user, password, accessToken, sshPassphrase, sshKeyPath, - serverId, skipLogin, threads, Project, detailedSummary, + serverId, skipLogin, threads, Project, detailedSummary, validateSha, }, ContainerPull: { BuildName, BuildNumber, module, url, user, password, accessToken, sshPassphrase, sshKeyPath, From df444ec38c3ca00b528224dabf621e9ee41ff5a9 Mon Sep 17 00:00:00 2001 From: Bhanu Reddy Date: Mon, 9 Jun 2025 12:55:21 +0530 Subject: [PATCH 21/41] Fix for mismatching cpu type (#2993) --- build/apple_release/scripts/download-signed-mac-OS-binaries.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/apple_release/scripts/download-signed-mac-OS-binaries.sh b/build/apple_release/scripts/download-signed-mac-OS-binaries.sh index 1c1d22f38..60b534e2a 100755 --- a/build/apple_release/scripts/download-signed-mac-OS-binaries.sh +++ b/build/apple_release/scripts/download-signed-mac-OS-binaries.sh @@ -70,7 +70,7 @@ downloadSignedMacOSBinaries() { apt-get install unzip # Extract the artifact and clean up - unzip artifact.zip + unzip -o artifact.zip rm -rf artifact.zip # Check if the executable exists From b2658f13d5a96aca649ccd25b58574fde5a2b13a Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Thu, 12 Jun 2025 12:01:43 +0300 Subject: [PATCH 22/41] Update tests after change source flags names --- lifecycle_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index aecf7a88a..7287caa5d 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -97,7 +97,7 @@ func compareRbArtifacts(t *testing.T, actual services.ReleaseBundleSpecResponse, assert.ElementsMatch(t, actualArtifactsPaths, expected) } -func TestReleaseBundleCreationFromMultipleBuildsUsingCommandFlag(t *testing.T) { +func TestReleaseBundleCreationFromMultiBuildsUsingCommandFlag(t *testing.T) { cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) defer cleanCallback() @@ -106,12 +106,12 @@ func TestReleaseBundleCreationFromMultipleBuildsUsingCommandFlag(t *testing.T) { deleteBuilds := uploadBuilds(t) defer deleteBuilds() - createRbFromMultiSourcesUsingCommandFlags(t, lcManager, GetMultiSourcesForBuilds(), "", tests.LcRbName1, number1, "default", true) + createRbFromMultiSourcesUsingCommandFlags(t, lcManager, createBuildsSource(), "", tests.LcRbName1, number1, "default", true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1) assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") } -func TestReleaseBundleCreationFromMultipleBundlesUsingCommandFlag(t *testing.T) { +func TestReleaseBundleCreationFromMultiBundlesUsingCommandFlag(t *testing.T) { cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) defer cleanCallback() @@ -126,12 +126,12 @@ func TestReleaseBundleCreationFromMultipleBundlesUsingCommandFlag(t *testing.T) createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - createRbFromMultiSourcesUsingCommandFlags(t, lcManager, "", GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) + createRbFromMultiSourcesUsingCommandFlags(t, lcManager, "", createReleaseBundlesSource(), tests.LcRbName3, number3, "default", true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") } -func TestReleaseBundleCreationFromMultipleBuildsAndBundlesUsingCommandFlag(t *testing.T) { +func TestReleaseBundleCreationFromMultipleBuildsAndBundlesUsingCommandFlags(t *testing.T) { cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) defer cleanCallback() @@ -146,7 +146,7 @@ func TestReleaseBundleCreationFromMultipleBuildsAndBundlesUsingCommandFlag(t *te createRbFromSpec(t, tests.LifecycleBuilds3, tests.LcRbName2, number2, true, true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2) - createRbFromMultiSourcesUsingCommandFlags(t, lcManager, GetMultiSourcesForBuilds(), GetMultiSourcesForBundles(), tests.LcRbName3, number3, "default", true) + createRbFromMultiSourcesUsingCommandFlags(t, lcManager, createBuildsSource(), createReleaseBundlesSource(), tests.LcRbName3, number3, "default", true) defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") } @@ -185,11 +185,11 @@ func TestReleaseBundleCreationFromPackages(t *testing.T) { assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") } -func GetMultiSourcesForBuilds() string { +func createBuildsSource() string { return fmt.Sprintf("name=%s, id=%s, include-deps=%s; name=%s, id=%s", tests.LcBuildName1, number1, "true", tests.LcBuildName2, number2) } -func GetMultiSourcesForBundles() string { +func createReleaseBundlesSource() string { return fmt.Sprintf("name=%s, version=%s; name=%s, version=%s", tests.LcRbName1, number1, tests.LcRbName2, number2) } From f9a4976fe0194da0d75a931413a92b96eac62e70 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Thu, 12 Jun 2025 16:53:10 +0300 Subject: [PATCH 23/41] Update tests --- go.mod | 2 +- lifecycle_test.go | 14 -------------- testdata/filespecs/lifecycle-packages.json | 10 ---------- 3 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 testdata/filespecs/lifecycle-packages.json diff --git a/go.mod b/go.mod index eab68ee64..56a227b22 100644 --- a/go.mod +++ b/go.mod @@ -197,6 +197,6 @@ replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9- //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd -//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 +replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 //replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 diff --git a/lifecycle_test.go b/lifecycle_test.go index 7287caa5d..e6742de55 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -171,20 +171,6 @@ func TestReleaseBundleCreationFromMultipleSourcesUsingSpec(t *testing.T) { assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") } -func TestReleaseBundleCreationFromPackages(t *testing.T) { - - cleanCallback := initLifecycleTest(t, minMultiSourcesArtifactoryVersion) - defer cleanCallback() - lcManager := getLcServiceManager(t) - - deleteBuilds := uploadBuilds(t) - defer deleteBuilds() - - createRbFromSpec(t, tests.LifecyclePackages, tests.LcRbName3, number3, true, true) - defer deleteReleaseBundle(t, lcManager, tests.LcRbName3, number3) - assertStatusCompleted(t, lcManager, tests.LcRbName3, number3, "") -} - func createBuildsSource() string { return fmt.Sprintf("name=%s, id=%s, include-deps=%s; name=%s, id=%s", tests.LcBuildName1, number1, "true", tests.LcBuildName2, number2) } diff --git a/testdata/filespecs/lifecycle-packages.json b/testdata/filespecs/lifecycle-packages.json deleted file mode 100644 index dc333dcef..000000000 --- a/testdata/filespecs/lifecycle-packages.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "files": [ - { - "package": "commons", - "version": "1.0.0", - "type": "maven", - "repoKey": "commons-dev-maven-local" - } - ] -} \ No newline at end of file From 641f6703c215517e9408f66a4a505b2115e2e8e5 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Thu, 12 Jun 2025 17:02:01 +0300 Subject: [PATCH 24/41] Update dependencies --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 56a227b22..eab68ee64 100644 --- a/go.mod +++ b/go.mod @@ -197,6 +197,6 @@ replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9- //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd -replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 +//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 //replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 From 9f2c44ee6ec2637eb2b7452b78aebcbf49ac4d90 Mon Sep 17 00:00:00 2001 From: Eyal Delarea Date: Thu, 12 Jun 2025 12:28:42 +0300 Subject: [PATCH 25/41] Bump ver from 2.76.1 to 2.77.0 (#3001) --- build/npm/v2-jf/package-lock.json | 2 +- build/npm/v2-jf/package.json | 2 +- build/npm/v2/package-lock.json | 2 +- build/npm/v2/package.json | 2 +- go.mod | 6 +++--- utils/cliutils/cli_consts.go | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build/npm/v2-jf/package-lock.json b/build/npm/v2-jf/package-lock.json index 4df8b441a..fec4157bf 100644 --- a/build/npm/v2-jf/package-lock.json +++ b/build/npm/v2-jf/package-lock.json @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.76.1", + "version": "2.77.0", "lockfileVersion": 1 } diff --git a/build/npm/v2-jf/package.json b/build/npm/v2-jf/package.json index e1038551c..e293971a7 100644 --- a/build/npm/v2-jf/package.json +++ b/build/npm/v2-jf/package.json @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.76.1", + "version": "2.77.0", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff --git a/build/npm/v2/package-lock.json b/build/npm/v2/package-lock.json index a807a3086..b2c287ac6 100644 --- a/build/npm/v2/package-lock.json +++ b/build/npm/v2/package-lock.json @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2", - "version": "2.76.1", + "version": "2.77.0", "lockfileVersion": 2 } diff --git a/build/npm/v2/package.json b/build/npm/v2/package.json index d64246552..1ef04039c 100644 --- a/build/npm/v2/package.json +++ b/build/npm/v2/package.json @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2", - "version": "2.76.1", + "version": "2.77.0", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff --git a/go.mod b/go.mod index eab68ee64..07e59b062 100644 --- a/go.mod +++ b/go.mod @@ -191,11 +191,11 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) -replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20250529104758-6d769a684388 +// replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20250529104758-6d769a684388 -//replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad +// replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad -//replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd +// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd //replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 diff --git a/utils/cliutils/cli_consts.go b/utils/cliutils/cli_consts.go index 436d213b8..eae27c03d 100644 --- a/utils/cliutils/cli_consts.go +++ b/utils/cliutils/cli_consts.go @@ -4,7 +4,7 @@ import "time" const ( // General CLI constants - CliVersion = "2.76.1" + CliVersion = "2.77.0" ClientAgent = "jfrog-cli-go" // CLI base commands constants: From 2908326bd71959f764941ba5f603063566b65523 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 13 Jun 2025 00:11:14 +0300 Subject: [PATCH 26/41] Fix CheckError issue --- buildtools/cli.go | 6 +++--- config/cli.go | 3 ++- general/ai/cli.go | 8 ++++---- plugins/commands/uninstall.go | 3 ++- plugins/commands/utils/utils.go | 7 ++++--- utils/cliutils/persistence.go | 13 +++++++------ 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 1ee4c8e74..ff508744b 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -1084,7 +1084,7 @@ func terraformCmd(c *cli.Context) error { case "publish", "p": return terraformPublishCmd(configFilePath, filteredArgs, c) default: - return errorutils.CheckErrorf("Terraform command:\"" + cmdName + "\" is not supported. " + cliutils.GetDocumentationMessage()) + return errorutils.CheckError(errors.New("Terraform command:\"" + cmdName + "\" is not supported. " + cliutils.GetDocumentationMessage())) } } @@ -1114,7 +1114,7 @@ func getProjectConfigPathOrThrow(projectType project.ProjectType, cmdName, confi return } if !exists { - return "", errorutils.CheckErrorf(getMissingConfigErrMsg(cmdName, configCmdName)) + return "", errorutils.CheckError(errors.New(getMissingConfigErrMsg(cmdName, configCmdName))) } return } @@ -1165,5 +1165,5 @@ func getTwineConfigPath() (configFilePath string, err error) { return } } - return "", errorutils.CheckErrorf(getMissingConfigErrMsg("twine", "pip-config OR pipenv-config")) + return "", errorutils.CheckError(errors.New(getMissingConfigErrMsg("twine", "pip-config OR pipenv-config"))) } diff --git a/config/cli.go b/config/cli.go index 6761d58fc..ac3c59c3b 100644 --- a/config/cli.go +++ b/config/cli.go @@ -1,6 +1,7 @@ package config import ( + "errors" "fmt" "github.com/jfrog/jfrog-cli-core/v2/general/token" "os" @@ -297,7 +298,7 @@ func validatePathsExist(paths ...string) error { return err } if !exists { - return errorutils.CheckErrorf("file does not exit at " + path) + return errorutils.CheckError(errors.New("file does not exit at " + path)) } } } diff --git a/general/ai/cli.go b/general/ai/cli.go index 8ef6c0e71..fd4ca6c3b 100644 --- a/general/ai/cli.go +++ b/general/ai/cli.go @@ -175,12 +175,12 @@ func sendRestAPI(apiType ApiType, content interface{}) (response string, err err if err = errorutils.CheckResponseStatus(resp, http.StatusOK); err != nil { switch resp.StatusCode { case http.StatusInternalServerError: - err = errorutils.CheckErrorf("JFrog CLI-AI model endpoint is not available. Please try again later.") + err = errorutils.CheckError(errors.New("JFrog CLI-AI model endpoint is not available. Please try again later")) case http.StatusNotAcceptable: - err = errorutils.CheckErrorf("The system is currently handling multiple requests from other users\n" + - "Please try submitting your question again in a few minutes. Thank you for your patience!") + err = errorutils.CheckError(errors.New("The system is currently handling multiple requests from other users\n" + + "Please try submitting your question again in a few minutes. Thank you for your patience!")) default: - err = errorutils.CheckErrorf("JFrog CLI-AI server is not available. Please check your network or try again later:\n" + err.Error()) + err = errorutils.CheckError(errors.New("JFrog CLI-AI server is not available. Please check your network or try again later:\n" + err.Error())) } return } diff --git a/plugins/commands/uninstall.go b/plugins/commands/uninstall.go index c99cb50cd..5e19ad4e4 100644 --- a/plugins/commands/uninstall.go +++ b/plugins/commands/uninstall.go @@ -1,6 +1,7 @@ package commands import ( + "errors" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-core/v2/utils/plugins" "github.com/jfrog/jfrog-cli/utils/cliutils" @@ -50,5 +51,5 @@ func runUninstallCmd(requestedPlugin string) error { } func generateNoPluginFoundError(pluginName string) error { - return errorutils.CheckErrorf("plugin '" + pluginName + "' could not be found") + return errorutils.CheckError(errors.New("plugin '" + pluginName + "' could not be found")) } diff --git a/plugins/commands/utils/utils.go b/plugins/commands/utils/utils.go index efa871b51..c125749db 100644 --- a/plugins/commands/utils/utils.go +++ b/plugins/commands/utils/utils.go @@ -1,6 +1,7 @@ package utils import ( + "errors" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-client-go/utils/errorutils" "github.com/jfrog/jfrog-client-go/utils/io/httputils" @@ -119,11 +120,11 @@ func AssertPluginVersion(versionCmdOut string, expectedPluginVersion string) err // Get the actual version which is after the last space. (expected output to -v for example: "plugin-name version v1.0.0") split := strings.Split(strings.TrimSpace(versionCmdOut), " ") if len(split) != 3 { - return errorutils.CheckErrorf("failed verifying plugin version. Unexpected plugin output for version command: '" + versionCmdOut + "'") + return errorutils.CheckError(errors.New("failed verifying plugin version. Unexpected plugin output for version command: '" + versionCmdOut + "'")) } if split[2] != expectedPluginVersion { - return errorutils.CheckErrorf("provided version does not match the plugin's actual version. " + - "Provided: '" + expectedPluginVersion + "', Actual: '" + split[2] + "'") + return errorutils.CheckError(errors.New("provided version does not match the plugin's actual version. " + + "Provided: '" + expectedPluginVersion + "', Actual: '" + split[2] + "'")) } return nil } diff --git a/utils/cliutils/persistence.go b/utils/cliutils/persistence.go index ef7747c97..a36f897c5 100644 --- a/utils/cliutils/persistence.go +++ b/utils/cliutils/persistence.go @@ -2,6 +2,7 @@ package cliutils import ( "encoding/json" + "errors" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-client-go/utils/errorutils" "github.com/jfrog/jfrog-client-go/utils/io/fileutils" @@ -28,7 +29,7 @@ func getPersistenceFilePath() error { if persistenceFilePath == "" { homeDir, err := coreutils.GetJfrogHomeDir() if err != nil { - return errorutils.CheckErrorf("failed to get JFrog home directory: " + err.Error()) + return errorutils.CheckError(errors.New("failed to get JFrog home directory: " + err.Error())) } persistenceFilePath = filepath.Join(homeDir, persistenceFileName) } @@ -101,19 +102,19 @@ func getPersistenceInfo() (*PersistenceFile, error) { // Create an empty persistence file if it doesn't exist pFile := &PersistenceFile{} if err = setPersistenceInfo(pFile); err != nil { - return nil, errorutils.CheckErrorf("failed while attempting to initialize persistence file: " + err.Error()) + return nil, errorutils.CheckError(errors.New("failed while attempting to initialize persistence file: " + err.Error())) } return pFile, nil } data, err := os.ReadFile(persistenceFilePath) if err != nil { - return nil, errorutils.CheckErrorf("failed while attempting to read persistence file: " + err.Error()) + return nil, errorutils.CheckError(errors.New("failed while attempting to read persistence file: " + err.Error())) } var info PersistenceFile if err = json.Unmarshal(data, &info); err != nil { - return nil, errorutils.CheckErrorf("failed while attempting to parse persistence file: " + err.Error()) + return nil, errorutils.CheckError(errors.New("failed while attempting to parse persistence file: " + err.Error())) } return &info, nil @@ -126,11 +127,11 @@ func setPersistenceInfo(info *PersistenceFile) error { } data, err := json.MarshalIndent(info, "", " ") if err != nil { - return errorutils.CheckErrorf("failed while attempting to create persistence file: " + err.Error()) + return errorutils.CheckError(errors.New("failed while attempting to create persistence file: " + err.Error())) } if err = os.WriteFile(persistenceFilePath, data, 0644); err != nil { - return errorutils.CheckErrorf("failed while attempting to write persistence file: " + err.Error()) + return errorutils.CheckError(errors.New("failed while attempting to write persistence file: " + err.Error())) } return nil } From 6897b527c9377d062c495aa0302093dd5409f8ec Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 13 Jun 2025 01:04:25 +0300 Subject: [PATCH 27/41] Update dependencies --- go.mod | 2 +- go.sum | 18 ++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 07e59b062..79c594bcc 100644 --- a/go.mod +++ b/go.mod @@ -197,6 +197,6 @@ require ( // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd -//replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 +// replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 //replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 diff --git a/go.sum b/go.sum index b0e118b13..71e80ede6 100644 --- a/go.sum +++ b/go.sum @@ -307,16 +307,14 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522170414-a043a12a9877 h1:eA2k4p6j5QGCs2bPDGZHF74XGEs5fR2zmhFWuiITyVM= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522170414-a043a12a9877/go.mod h1:p7OY3+SCd0mg8773VZWV9iR8NO0VlzTAEopt3RHm0tg= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250522190754-4f57f1e65ad2/go.mod h1:ZIY4HcEzmLssI6BDwolfeOeTEcUucFDK8SLtVHoNdp0= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c h1:NTFV7lRdjkGaF52pweS4XN3bZWR4PqQwwLHruXPqLXc= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250508133212-7f177c33005c/go.mod h1:8ODu50AZkrP5xXvUGLizFTL1+qJknSShHNGhGl7OtFQ= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250522185315-738a9866af5d/go.mod h1:nakW0TMiS7627SEvccDuersLc8OKhKJ1sPc/QePaPVE= -github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522191036-4d4fc3a1ac3c h1:SOt1gERrDYavjyh8Au0hSTcj1QONFzw+/aZ3641ech0= -github.com/rimapol/jfrog-cli-security v1.17.2-0.20250522191036-4d4fc3a1ac3c/go.mod h1:a2cAU1DAY8DOXCyP2D5h6OdVfW1PMzwPGMbwmsg/2mk= -github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b h1:GwX69R0rU/zfLYCkngpcpHh/6xMXt5oL0f/LMUF0orM= -github.com/rimapol/jfrog-client-go v0.0.0-20250522165200-837cf45d086b/go.mod h1:IKmGx4sYeaiSKBnVzp/j6lVrmyRAXTABfo3B02SPxXI= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa h1:2CSXNrMa1AzJf8b+gIn0rRA61wsiMHVYzqnbcv1MGpo= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa/go.mod h1:p3TnA61PSXO3BAYC+180o85UaOg+Zkd4WNGgUGy5d7Y= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8 h1:ppBwpjTJ3M+Moby9CO76GZg/BBh1/TjzkeOQP7/LJsI= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8/go.mod h1:PKPfjwsOA5D/Fgi4bD6/8SwtCtnF/lub3/CMLua615Y= +github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2 h1:I/b6Q6AoDKdTWEJMt48jHQ9Ps3AnsVE+JI5WxVnGJGA= +github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2/go.mod h1:zZzVMQRUqbJx7SvFsNfYolJN4Wpq+H1zzmIbxyT1GDk= +github.com/rimapol/jfrog-client-go v0.0.0-20250606121944-5c0f425fc4ca h1:yiv+LsxW3W3wUqDc6yVWEw2aCHT/YXlixvxbhJA3b+A= +github.com/rimapol/jfrog-client-go v0.0.0-20250606121944-5c0f425fc4ca/go.mod h1:XxYs2QtlTm92yqJ5O4j4vzWI8d4sDtKQUT1miNHMgnw= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= From 2dc1d718bd021c0a9d2e9180b19b24e8b143eb9b Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 13 Jun 2025 01:12:54 +0300 Subject: [PATCH 28/41] Update dependencies --- go.sum | 1 + 1 file changed, 1 insertion(+) diff --git a/go.sum b/go.sum index 71e80ede6..67eb19f7a 100644 --- a/go.sum +++ b/go.sum @@ -307,6 +307,7 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612143644-d23f7d691cd5 h1:ABQWX1F1wP0MJt/hp/hhNqIvx7tEksBO73E3sYGsRac= github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa h1:2CSXNrMa1AzJf8b+gIn0rRA61wsiMHVYzqnbcv1MGpo= github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa/go.mod h1:p3TnA61PSXO3BAYC+180o85UaOg+Zkd4WNGgUGy5d7Y= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8 h1:ppBwpjTJ3M+Moby9CO76GZg/BBh1/TjzkeOQP7/LJsI= From ea5dafbfdfc7291ffa075cee48dcbe3566554447 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 13 Jun 2025 03:33:10 +0300 Subject: [PATCH 29/41] Update dependencies --- go.sum | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go.sum b/go.sum index 67eb19f7a..203cdc5a3 100644 --- a/go.sum +++ b/go.sum @@ -312,6 +312,8 @@ github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa h1:2 github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa/go.mod h1:p3TnA61PSXO3BAYC+180o85UaOg+Zkd4WNGgUGy5d7Y= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8 h1:ppBwpjTJ3M+Moby9CO76GZg/BBh1/TjzkeOQP7/LJsI= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8/go.mod h1:PKPfjwsOA5D/Fgi4bD6/8SwtCtnF/lub3/CMLua615Y= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250613000840-75a0253c1164 h1:My2TNxqTLNs/9l5gqn21MkmjsD4hpIiR5hoViLn9Dlw= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250613000840-75a0253c1164/go.mod h1:jmmyqO42y83CfmMJ5DK+6wAIoibb97FFDNq8r3RGGqU= github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2 h1:I/b6Q6AoDKdTWEJMt48jHQ9Ps3AnsVE+JI5WxVnGJGA= github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2/go.mod h1:zZzVMQRUqbJx7SvFsNfYolJN4Wpq+H1zzmIbxyT1GDk= github.com/rimapol/jfrog-client-go v0.0.0-20250606121944-5c0f425fc4ca h1:yiv+LsxW3W3wUqDc6yVWEw2aCHT/YXlixvxbhJA3b+A= From 3173ae1f83a65202f7fd302caaef4918621e996b Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Fri, 13 Jun 2025 03:47:07 +0300 Subject: [PATCH 30/41] Fix lint --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 3aec5037a..a3c0f8b4d 100644 --- a/main.go +++ b/main.go @@ -95,7 +95,7 @@ func execMain() error { cli.CommandHelpTemplate = commandHelpTemplate cli.AppHelpTemplate = getAppHelpTemplate() app.CommandNotFound = func(c *cli.Context, command string) { - _, err = fmt.Fprintf(c.App.Writer, "'"+c.App.Name+" "+command+"' is not a jf command. See --help\n") + _, err = fmt.Fprintf(c.App.Writer, "%s", `'`+c.App.Name+" "+command+"' is not a jf command. See --help\n") if err != nil { clientlog.Debug(err) os.Exit(1) From c7084305166dbb8d4bdb9c37bc99596ee3c3bf16 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Tue, 17 Jun 2025 18:05:42 +0300 Subject: [PATCH 31/41] Code review changes and update dependencies --- go.mod | 4 +--- lifecycle_test.go | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 79c594bcc..0aac8c2cc 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/jfrog/jfrog-cli -go 1.24.2 - -toolchain go1.24.3 +go 1.23.7 replace ( // Should not be updated to 0.2.6 due to a bug (https://github.com/jfrog/jfrog-cli-core/pull/372) diff --git a/lifecycle_test.go b/lifecycle_test.go index e6742de55..17c3cf80d 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -381,7 +381,8 @@ func createRbFromMultiSourcesUsingCommandFlags(t *testing.T, lcManager *lifecycl ProjectKey: project, } - assert.NoError(t, lcManager.CreateReleaseBundlesFromMultipleSources(rbDetails, queryParams, gpgKeyPairName, sources)) + _, err := lcManager.CreateReleaseBundlesFromMultipleSources(rbDetails, queryParams, gpgKeyPairName, sources) + assert.NoError(t, err) } func buildMultiSources(sources []services.RbSource, buildsSourcesStr, bundlesSourcesStr, projectKey string) []services.RbSource { From 5d05d0734696e9d80efe70a856a3f836e74c52a6 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Wed, 18 Jun 2025 00:08:07 +0300 Subject: [PATCH 32/41] Temp --- lifecycle_test.go | 6 +++--- utils/tests/utils.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index 17c3cf80d..cb55f820b 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -242,12 +242,12 @@ func TestLifecycleFullFlow(t *testing.T) { assertExpectedArtifacts(t, tests.SearchAllProdRepo2, []string{}) // Export release lifecycle bundle archive - - tempDir, cleanUp := coreTests.CreateTempDirWithCallbackAndAssert(t) + // TODO Temporarily disabling till distribution on testing suite is stable. + /*tempDir, cleanUp := coreTests.CreateTempDirWithCallbackAndAssert(t) defer cleanUp() exportRb(t, tests.LcRbName2, number2, tempDir) - defer deleteExportedReleaseBundle(t, tests.LcRbName2) + defer deleteExportedReleaseBundle(t, tests.LcRbName2)*/ // TODO Temporarily disabling till distribution on testing suite is stable. /* diff --git a/utils/tests/utils.go b/utils/tests/utils.go index 392945692..feb25c638 100644 --- a/utils/tests/utils.go +++ b/utils/tests/utils.go @@ -78,7 +78,7 @@ var ( ) func init() { - JfrogUrl = flag.String("jfrog.url", "http://localhost:8081/", "JFrog platform url") + JfrogUrl = flag.String("jfrog.url", "http://localhost:8082/", "JFrog platform url") JfrogUser = flag.String("jfrog.user", "admin", "JFrog platform username") JfrogPassword = flag.String("jfrog.password", "password", "JFrog platform password") JfrogSshKeyPath = flag.String("jfrog.sshKeyPath", "", "Ssh key file path") @@ -105,7 +105,7 @@ func init() { TestXray = flag.Bool("test.xray", false, "Test Xray") TestAccess = flag.Bool("test.access", false, "Test Access") TestTransfer = flag.Bool("test.transfer", false, "Test files transfer") - TestLifecycle = flag.Bool("test.lifecycle", false, "Test lifecycle") + TestLifecycle = flag.Bool("test.lifecycle", true, "Test lifecycle") ContainerRegistry = flag.String("test.containerRegistry", "localhost:8082", "Container registry") HideUnitTestLog = flag.Bool("test.hideUnitTestLog", false, "Hide unit tests logs and print it in a file") InstallDataTransferPlugin = flag.Bool("test.installDataTransferPlugin", false, "Install data-transfer plugin on the source Artifactory server") From e7e5a1da47075bdbbefa0a3dcb378b221f23c3f4 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Wed, 18 Jun 2025 01:13:06 +0300 Subject: [PATCH 33/41] ExportRb is commented --- lifecycle_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lifecycle_test.go b/lifecycle_test.go index cb55f820b..1e90511ee 100644 --- a/lifecycle_test.go +++ b/lifecycle_test.go @@ -287,9 +287,9 @@ func TestPromoteReleaseBundleWithPromotionTypeFlag(t *testing.T) { assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "") } -func deleteExportedReleaseBundle(t *testing.T, rbName string) { +/*func deleteExportedReleaseBundle(t *testing.T, rbName string) { assert.NoError(t, os.RemoveAll(rbName)) -} +}*/ func assertExpectedArtifacts(t *testing.T, specFileName string, expected []string) { searchProdSpec, err := tests.CreateSpec(specFileName) @@ -512,12 +512,12 @@ func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buil assert.NoError(t, lcCli.Exec(argsAndOptions...)) } -func exportRb(t *testing.T, rbName, rbVersion, targetPath string) { +/*func exportRb(t *testing.T, rbName, rbVersion, targetPath string) { lcCli.RunCliCmdWithOutput(t, "rbe", rbName, rbVersion, targetPath+"/") exists, err := fileutils.IsDirExists(path.Join(targetPath, rbName), false) assert.NoError(t, err) assert.Equal(t, true, exists) -} +}*/ /* func distributeRb(t *testing.T) { From 1663683fa4bd3b21b824e58af4d8937e7f45f0ee Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Wed, 18 Jun 2025 10:05:47 +0300 Subject: [PATCH 34/41] Revert useless small --- utils/tests/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/tests/utils.go b/utils/tests/utils.go index feb25c638..fef14496a 100644 --- a/utils/tests/utils.go +++ b/utils/tests/utils.go @@ -78,7 +78,7 @@ var ( ) func init() { - JfrogUrl = flag.String("jfrog.url", "http://localhost:8082/", "JFrog platform url") + JfrogUrl = flag.String("jfrog.url", "http://localhost:8081/", "JFrog platform url") JfrogUser = flag.String("jfrog.user", "admin", "JFrog platform username") JfrogPassword = flag.String("jfrog.password", "password", "JFrog platform password") JfrogSshKeyPath = flag.String("jfrog.sshKeyPath", "", "Ssh key file path") From 8aacddc0877c90319dc85534a44f9b8819649f28 Mon Sep 17 00:00:00 2001 From: Naveen Kumar Date: Thu, 19 Jun 2025 18:18:37 +0530 Subject: [PATCH 35/41] Added Jenkins File and github workflow action's yaml file (#3004) * Added Jenkins File and github workflow action's yaml file * Addressing comments * Addressing comments * Addressing comments * Upading env variable name * Upading env variable name * Upading env variable name * Upading env variable name * formatting * formatting * formatting * adding jfrog-ignore * adding jfrog-ignore * Intentionally failing the build to test the failure notification * Reversing Intentionally failing the build to test the failure notification * Added scan binaries and artifacts * Added scan binaries and artifacts --------- Co-authored-by: IL-Automation --- Jenkinsfile-dev-build | 278 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 Jenkinsfile-dev-build diff --git a/Jenkinsfile-dev-build b/Jenkinsfile-dev-build new file mode 100644 index 000000000..b4536588f --- /dev/null +++ b/Jenkinsfile-dev-build @@ -0,0 +1,278 @@ +node("docker-ubuntu20-xlarge") { + properties([ + pipelineTriggers([ + cron('H 0 * * *') + ]) + ]) + try { + stage('Setup Environment and Tools') { + def goRoot = tool name: 'go-1.23.9', type: 'go' + withEnv(["GOROOT=${goRoot}", "PATH+GO=${goRoot}/bin"]) { + withCredentials([string(credentialsId: 'repo21-url', variable: 'REPO21_URL')]) { + echo "${REPO21_URL}" + def repo21Name = "${REPO21_URL}".substring(8, "${REPO21_URL}".length()) + env.REPO_NAME_21 = "$repo21Name" + } + def architectures = [ + [pkg: 'jfrog-cli-windows-amd64', goos: 'windows', goarch: 'amd64', fileExtension: '.exe', chocoImage: '${REPO_NAME_21}/jfrog-docker/linuturk/mono-choco'], + [pkg: 'jfrog-cli-linux-386', goos: 'linux', goarch: '386', fileExtension: '', debianImage: '${REPO_NAME_21}/jfrog-docker/i386/ubuntu:20.04', debianArch: 'i386'], + [pkg: 'jfrog-cli-linux-amd64', goos: 'linux', goarch: 'amd64', fileExtension: '', debianImage: '${REPO_NAME_21}/jfrog-docker/ubuntu:20.04', debianArch: 'x86_64', rpmImage: 'almalinux:8.10'], + [pkg: 'jfrog-cli-linux-arm64', goos: 'linux', goarch: 'arm64', fileExtension: ''], + [pkg: 'jfrog-cli-linux-arm', goos: 'linux', goarch: 'arm', fileExtension: ''], + [pkg: 'jfrog-cli-mac-386', goos: 'darwin', goarch: 'amd64', fileExtension: ''], + [pkg: 'jfrog-cli-mac-arm64', goos: 'darwin', goarch: 'arm64', fileExtension: ''], + [pkg: 'jfrog-cli-linux-s390x', goos: 'linux', goarch: 's390x', fileExtension: ''], + [pkg: 'jfrog-cli-linux-ppc64', goos: 'linux', goarch: 'ppc64', fileExtension: ''], + [pkg: 'jfrog-cli-linux-ppc64le', goos: 'linux', goarch: 'ppc64le', fileExtension: ''] + ] + identifier = 'v2' + cliExecutableName = 'jfrog' + devBranch = "dev" + devRepo = "https://github.com/jfrog/jfrog-cli.git" + buildStatus = 'SUCCESS' + repo = 'jfrog-cli' + env.CI = true + env.JFROG_CLI_LOG_LEVEL = "DEBUG" + dir('temp') { + sh "cat /etc/lsb-release" + cliWorkspace = pwd() + sh "echo cliWorkspace=$cliWorkspace" + builderDir = "${cliExecutableName}-builder/" + sh "mkdir $builderDir" + builderPath = "${cliWorkspace}/${builderDir}${cliExecutableName}" + jfrogCliRepoDir = "${cliWorkspace}/${repo}/" + repoDeployName = env.CLI_DEV_REPO_DEPLOY_NAME + repoResolveName = env.CLI_DEV_REPO_RESOLVE_NAME + repoDeployId = env.REPO_DEPLOY_ID + repoResolveId = env.REPO_RESOLVE_ID + artifactoryNameToUpload = env.REPO_FOR_CLI_DEV_UPLOAD + project = env.PROJECT + slackChannelName = env.SLACK_CHANNEL_FOR_CLI_DEV_BUILD_NOTIFICATION + buildNumber = env.BUILD_NUMBER + buildName = "jfrog-cli-dev-build" + stage('Clone Source Repo') { + try { + dir("${cliWorkspace}") { + sh "git clone ${devRepo}" + dir("${repo}") { + sh "git checkout ${devBranch}" + } + } + } + catch (e) { + notifyFailure('Clone Source Repo', e) + throw e + } + } + stage('Build JFrog CLI') { + try { + sh 'go version' + dir("$jfrogCliRepoDir") { + sh "build/build.sh $cliExecutableName" + } + sh "mv $jfrogCliRepoDir/$cliExecutableName $builderDir" + version = getCliVersion(builderPath) + print "CLI version: $version" + version = getCLINextVersion(version) + "-beta" + print "Next CLI version: $version" + } + catch (e) { + notifyFailure('Build JFrog CLI', e) + throw e + } + } + stage('Setting JF-Config') { + try { + setJfConfigure() + } + catch (e) { + notifyFailure('Setting JF-Config', e) + throw e + } + } + stage('jf build and upload binaries phase') { + try { + buildAndUploadBinaryAndBuildInfo(architectures) + } + catch (e) { + notifyFailure('jf build and upload binaries phase', e) + throw e + } + } + } + } + } + } catch (e) { + echo "ERROR: Pipeline failed with exception: ${e}" + buildStatus = 'FAILURE' + throw e + } + finally { + stage('Send Notifications') { + message = '' + if (buildStatus == 'SUCCESS') { + message = "Dev Build Jenkins Pipeline for Jfrog-CLI has successfully completed.\n<${env.BUILD_URL}|View Build>" + slackSend(channel: "#${slackChannelName}", message: message, color: 'good') + } else { + message = """@here Dev Build Jenkins Pipeline has a problem. + *Status* : *${buildStatus}*. + *Build* : <${env.BUILD_URL}|${env.JOB_NAME} #${env.BUILD_NUMBER}> + """ + slackSend(channel: "#${slackChannelName}", message: message, color: 'danger') + } + echo "Final notification message would be: \n${message}" + } + } +} + +def notifyFailure(String stageName, error) { + def message = """@here :x: *Build FAILED!* + *Job:* `${env.JOB_NAME}` #${env.BUILD_NUMBER} + *Failed Stage:* `${stageName}` + *Error:* `${error.message.trim()}` + *<${env.BUILD_URL}|Open Build Log>*""" + echo "Sending failure notification for stage: ${stageName}" + slackSend( + channel: "#${slackChannelName}", + color: 'danger', + message: message + ) +} + +def setJfConfigure() { + sh """#!/bin/bash + $builderPath go-config --repo-deploy ${repoDeployName} --repo-resolve ${repoResolveName} --server-id-deploy ${repoDeployId} --server-id-resolve ${repoResolveId} + """ +} + +def getCLINextVersion(String currentVersion) { + if (currentVersion.startsWith('v')) { + currentVersion = currentVersion.substring(1) + } + def parts = currentVersion.split('\\.') + if (parts.size() != 3) { + error("Invalid version format. Expected MAJOR.MINOR.PATCH, but got: ${currentVersion}") + } + def major = parts[0].toInteger() + def minor = parts[1].toInteger() + def patch = parts[2].toInteger() + minor++ + patch = 0 + def nextVersion = "${major}.${minor}.${patch}" + return nextVersion +} + +def getCliVersion(exePath) { + version = sh(script: "$exePath -v | tr -d 'jfrog version' | tr -d '\n'", returnStdout: true) + return version +} + +def buildAndUploadBinaryAndBuildInfo(architectures) { + configRepo21() + try { + makeBuildInfo() + uploadCliBinary(architectures) + uploadAndScanBuildInfo() + } finally { + cleanupRepo21() + } +} + +def configRepo21() { + withCredentials([ + // jfrog-ignore + usernamePassword(credentialsId: 'repo21', usernameVariable: 'REPO21_USER', passwordVariable: 'REPO21_PASSWORD'), + string(credentialsId: 'repo21-url', variable: 'REPO21_URL') + ]) { + sh """#!/bin/bash + $builderPath c add repo21 --url=$REPO21_URL --user=$REPO21_USER --password=$REPO21_PASSWORD --overwrite + $builderPath c use repo21 + """ + } +} + +def cleanupRepo21() { + sh """#!/bin/bash + $builderPath c rm repo21 + """ +} + +def uploadCliBinary(architectures) { + for (int i = 0; i < architectures.size(); i++) { + def currentBuild = architectures[i] + try { + stage("Build and upload ${currentBuild.pkg}") { + buildAndUpload(currentBuild.goos, currentBuild.goarch, currentBuild.pkg, currentBuild.fileExtension) + } + } + catch (e) { + notifyFailure('Build and upload ${currentBuild.pkg}', e) + throw e + } + } +} + +def uploadBinaryToJfrogRepo21(pkg, fileName) { + sh """#!/bin/bash + set -e + $builderPath rt u ${jfrogCliRepoDir}/${fileName} ${artifactoryNameToUpload}/dev/$identifier/$version/$pkg/ --build-name=${buildName} --build-number=${buildNumber} --project=${project} --fail-no-op --flat + echo Uploaded the binary here: ${artifactoryNameToUpload}/dev/$identifier/$version/$pkg/ + """ +} + +def makeBuildInfo() { + sh """#!/bin/bash + cd ${jfrogCliRepoDir} + $builderPath go build --build-name="${buildName}" --build-number="${buildNumber}" --project="${project}" + """ +} + +def uploadAndScanBuildInfo() { + try { + stage('Upload Build-Info') { + sh """#!/bin/bash + $builderPath rt build-publish "${buildName}" "${buildNumber}" --project=${project} + """ + } + } catch (e) { + notifyFailure('Upload Build-Info', e) + throw e + } + try { + stage('Scanning Build-Info') { + sh """#!/bin/bash + $builderPath build-scan "${buildName}" "${buildNumber}" --project ${project} + """ + } + } + catch (e) { + notifyFailure('Scanning Build-Info', e) + throw e + } + try { + stage("Scanning Binaries and artifacts under watch ecosystem-watch") { + sh "$builderPath scan '${jfrogCliRepoDir}' --watches 'ecosystem-watch'" + } + } + catch (e) { + notifyFailure('Scanning Binaries and artifacts under watch ecosystem-watch', e) + throw e + } +} + +def build(goos, goarch, pkg, fileName) { + dir("${jfrogCliRepoDir}") { + sh "pwd" + env.GOOS = "$goos" + env.GOARCH = "$goarch" + sh "build/build.sh $fileName" + } +} + +def buildAndUpload(goos, goarch, pkg, fileExtension) { + def extension = fileExtension == null ? '': fileExtension + def fileName = "$cliExecutableName$fileExtension" + build(goos, goarch, pkg, fileName) + uploadBinaryToJfrogRepo21(pkg, fileName) + sh "rm $jfrogCliRepoDir/$fileName" +} \ No newline at end of file From cb4f7eea30c27c21d9f936408c762b7d7c9e414b Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Mon, 23 Jun 2025 20:07:29 +0300 Subject: [PATCH 36/41] Update dependencies --- go.mod | 4 +++- go.sum | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 0aac8c2cc..7387b35f5 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/jfrog/jfrog-cli -go 1.23.7 +go 1.24.2 + +toolchain go1.24.4 replace ( // Should not be updated to 0.2.6 due to a bug (https://github.com/jfrog/jfrog-cli-core/pull/372) diff --git a/go.sum b/go.sum index 203cdc5a3..447a917e6 100644 --- a/go.sum +++ b/go.sum @@ -314,6 +314,7 @@ github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8 h1:ppBwp github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8/go.mod h1:PKPfjwsOA5D/Fgi4bD6/8SwtCtnF/lub3/CMLua615Y= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250613000840-75a0253c1164 h1:My2TNxqTLNs/9l5gqn21MkmjsD4hpIiR5hoViLn9Dlw= github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250613000840-75a0253c1164/go.mod h1:jmmyqO42y83CfmMJ5DK+6wAIoibb97FFDNq8r3RGGqU= +github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250619121725-239db9dc2424/go.mod h1:JDMYJHxU3W0/jaiiSljHLAcd0QeEGwpAwsnOqVR8c/0= github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2 h1:I/b6Q6AoDKdTWEJMt48jHQ9Ps3AnsVE+JI5WxVnGJGA= github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2/go.mod h1:zZzVMQRUqbJx7SvFsNfYolJN4Wpq+H1zzmIbxyT1GDk= github.com/rimapol/jfrog-client-go v0.0.0-20250606121944-5c0f425fc4ca h1:yiv+LsxW3W3wUqDc6yVWEw2aCHT/YXlixvxbhJA3b+A= From 60ce88d02df7b69961b065552be95fa319b7d1a6 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Mon, 23 Jun 2025 20:09:10 +0300 Subject: [PATCH 37/41] Update dependencies --- go.mod | 2 ++ go.sum | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/go.mod b/go.mod index 7387b35f5..54f866b2d 100644 --- a/go.mod +++ b/go.mod @@ -121,6 +121,8 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/owenrumney/go-sarif/v2 v2.3.0 // indirect + github.com/owenrumney/go-sarif/v3 v3.1.4 // indirect + github.com/package-url/packageurl-go v0.1.3 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pjbgf/sha1cd v0.3.2 // indirect diff --git a/go.sum b/go.sum index 447a917e6..36e27b9db 100644 --- a/go.sum +++ b/go.sum @@ -188,13 +188,16 @@ 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-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad h1:cnbcCK0VTHdLdmmv/9fYTRjuR1ewrYBW/S87pVE+d+s= github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad/go.mod h1:hnXaevmDyQpyhpH5kwDufIjUUXXuKs54i+AX2CEywKE= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250619122826-54ff6f65b128 h1:SdNS8Z1H1c1wgtHxZJNjLf9cWx+zdfXDQPmjUwQ55Bo= github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd h1:1Nw+HKbtQZGEogerQBNM77RvbUwHYNKFNYJk4lmNF9w= github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd/go.mod h1:BkDHfCVecjcRNC+aqmHtTrKe+/K8MyjzmHYe5rER5Yg= github.com/jfrog/jfrog-cli-platform-services v1.9.0 h1:r/ETgJuMUOUu12w20ydsF6paqEaj0khH6bxMRsdNz1Y= github.com/jfrog/jfrog-cli-platform-services v1.9.0/go.mod h1:pMZMSwhj7yA4VKyj0Skr2lObIyGpZUxNJ40DSLKXU38= github.com/jfrog/jfrog-cli-security v1.19.0 h1:4qggon1biuOvjMjHZ5IWDA4Mh+qp2qecWEdeX6s4Xv8= github.com/jfrog/jfrog-cli-security v1.19.0/go.mod h1:QMoGTGfKMSnXOuWv3/IclZU+M/AshoJMt68Ft6l7EdE= +github.com/jfrog/jfrog-cli-security v1.19.1-0.20250623144441-d800f8204cc4 h1:6qTIZL/UXbME52zqdz637+j8D69nAltA9Ivh3fdK9Sc= github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 h1:0t6dQHoalUDNVrfZujD3iCmDGLDl+ndHclFkmONSpq0= +github.com/jfrog/jfrog-client-go v1.28.1-0.20250623080810-85bcce028748 h1:299KpOItnMAdW2ZmWrqn4+j1dEemNWSX/PHq6C+IVQA= github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1/go.mod h1:1v0eih4thdPA4clBo9TuvAMT25sGDr1IQJ81DXQ/lBY= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -286,9 +289,14 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/owenrumney/go-sarif v1.1.1 h1:QNObu6YX1igyFKhdzd7vgzmw7XsWN3/6NMGuDzBgXmE= github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= github.com/owenrumney/go-sarif/v2 v2.3.0 h1:wP5yEpI53zr0v5cBmagXzLbHZp9Oylyo3AJDpfLBITs= github.com/owenrumney/go-sarif/v2 v2.3.0/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w= +github.com/owenrumney/go-sarif/v3 v3.1.4 h1:lqx5Cb7162BC+FuAgJZq8A8XXP4XMw7XoAPZl9iqlQs= +github.com/owenrumney/go-sarif/v3 v3.1.4/go.mod h1:Olt8kHDlC+ruWzRfmgIQUD+2hoAk6A6vT+ljDUbae2s= +github.com/package-url/packageurl-go v0.1.3 h1:4juMED3hHiz0set3Vq3KeQ75KD1avthoXLtmE3I0PLs= +github.com/package-url/packageurl-go v0.1.3/go.mod h1:nKAWB8E6uk1MHqiS/lQb9pYBGH2+mdJ2PJc2s50dQY0= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= From 1e61f85eedc8abb294b88f441dc102146af1ef4b Mon Sep 17 00:00:00 2001 From: Naveen Kumar Date: Tue, 24 Jun 2025 13:19:36 +0530 Subject: [PATCH 38/41] Feature/adding parameters in jenkins job (#3007) RTECO-223 - Getting values from params instead of credentials --- Jenkinsfile-dev-build | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Jenkinsfile-dev-build b/Jenkinsfile-dev-build index b4536588f..be2738ff6 100644 --- a/Jenkinsfile-dev-build +++ b/Jenkinsfile-dev-build @@ -41,13 +41,13 @@ node("docker-ubuntu20-xlarge") { sh "mkdir $builderDir" builderPath = "${cliWorkspace}/${builderDir}${cliExecutableName}" jfrogCliRepoDir = "${cliWorkspace}/${repo}/" - repoDeployName = env.CLI_DEV_REPO_DEPLOY_NAME - repoResolveName = env.CLI_DEV_REPO_RESOLVE_NAME - repoDeployId = env.REPO_DEPLOY_ID - repoResolveId = env.REPO_RESOLVE_ID - artifactoryNameToUpload = env.REPO_FOR_CLI_DEV_UPLOAD - project = env.PROJECT - slackChannelName = env.SLACK_CHANNEL_FOR_CLI_DEV_BUILD_NOTIFICATION + rtDeployRepoName = params.JFROG_RT_DEPLOY_REPO_NAME + rtResolveRepoName = params.JFROG_RT_RESOLVE_REPO_NAME + repoDeployServerId = params.JFROG_CLI_DEPLOY_SERVER_ID + repoResolveServerId = params.JFROG_CLI_RESOLVE_SERVER_ID + jfrogCLITargetRepoName = params.REPO_FOR_CLI_DEV_UPLOAD + project = params.PROJECT + slackChannelName = params.SLACK_CHANNEL_FOR_CLI_DEV_BUILD_NOTIFICATION buildNumber = env.BUILD_NUMBER buildName = "jfrog-cli-dev-build" stage('Clone Source Repo') { @@ -141,7 +141,7 @@ def notifyFailure(String stageName, error) { def setJfConfigure() { sh """#!/bin/bash - $builderPath go-config --repo-deploy ${repoDeployName} --repo-resolve ${repoResolveName} --server-id-deploy ${repoDeployId} --server-id-resolve ${repoResolveId} + $builderPath go-config --repo-deploy ${rtDeployRepoName} --repo-resolve ${rtResolveRepoName} --server-id-deploy ${repoDeployServerId} --server-id-resolve ${repoResolveServerId} """ } @@ -215,8 +215,8 @@ def uploadCliBinary(architectures) { def uploadBinaryToJfrogRepo21(pkg, fileName) { sh """#!/bin/bash set -e - $builderPath rt u ${jfrogCliRepoDir}/${fileName} ${artifactoryNameToUpload}/dev/$identifier/$version/$pkg/ --build-name=${buildName} --build-number=${buildNumber} --project=${project} --fail-no-op --flat - echo Uploaded the binary here: ${artifactoryNameToUpload}/dev/$identifier/$version/$pkg/ + $builderPath rt u ${jfrogCliRepoDir}/${fileName} ${jfrogCLITargetRepoName}/dev/$identifier/$version/$pkg/ --build-name=${buildName} --build-number=${buildNumber} --project=${project} --fail-no-op --flat + echo Uploaded the binary here: ${jfrogCLITargetRepoName}/dev/$identifier/$version/$pkg/ """ } From bc0b7e6b951dfbb413c13c39fc3a6706f567857a Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Tue, 24 Jun 2025 21:07:49 +0300 Subject: [PATCH 39/41] Update dependencies --- go.mod | 4 +--- go.sum | 5 ----- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 54f866b2d..ed1391f46 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/jfrog/jfrog-cli-artifactory v0.3.2 github.com/jfrog/jfrog-cli-core/v2 v2.59.0 github.com/jfrog/jfrog-cli-platform-services v1.9.0 - github.com/jfrog/jfrog-cli-security v1.17.1 + github.com/jfrog/jfrog-cli-security v1.19.1 github.com/jfrog/jfrog-client-go v1.54.1 github.com/jszwec/csvutil v1.10.0 github.com/manifoldco/promptui v0.9.0 @@ -121,8 +121,6 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/owenrumney/go-sarif/v2 v2.3.0 // indirect - github.com/owenrumney/go-sarif/v3 v3.1.4 // indirect - github.com/package-url/packageurl-go v0.1.3 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pjbgf/sha1cd v0.3.2 // indirect diff --git a/go.sum b/go.sum index 36e27b9db..b0d94913a 100644 --- a/go.sum +++ b/go.sum @@ -289,14 +289,9 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/owenrumney/go-sarif v1.1.1 h1:QNObu6YX1igyFKhdzd7vgzmw7XsWN3/6NMGuDzBgXmE= github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= github.com/owenrumney/go-sarif/v2 v2.3.0 h1:wP5yEpI53zr0v5cBmagXzLbHZp9Oylyo3AJDpfLBITs= github.com/owenrumney/go-sarif/v2 v2.3.0/go.mod h1:MSqMMx9WqlBSY7pXoOZWgEsVB4FDNfhcaXDA1j6Sr+w= -github.com/owenrumney/go-sarif/v3 v3.1.4 h1:lqx5Cb7162BC+FuAgJZq8A8XXP4XMw7XoAPZl9iqlQs= -github.com/owenrumney/go-sarif/v3 v3.1.4/go.mod h1:Olt8kHDlC+ruWzRfmgIQUD+2hoAk6A6vT+ljDUbae2s= -github.com/package-url/packageurl-go v0.1.3 h1:4juMED3hHiz0set3Vq3KeQ75KD1avthoXLtmE3I0PLs= -github.com/package-url/packageurl-go v0.1.3/go.mod h1:nKAWB8E6uk1MHqiS/lQb9pYBGH2+mdJ2PJc2s50dQY0= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= From 2c2eb2639aedda9c2477286f3b664aadb199a046 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Mon, 30 Jun 2025 16:41:46 +0300 Subject: [PATCH 40/41] Update dependencies --- go.sum | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.sum b/go.sum index b0d94913a..cdcb91ff5 100644 --- a/go.sum +++ b/go.sum @@ -197,7 +197,7 @@ github.com/jfrog/jfrog-cli-security v1.19.0 h1:4qggon1biuOvjMjHZ5IWDA4Mh+qp2qecW github.com/jfrog/jfrog-cli-security v1.19.0/go.mod h1:QMoGTGfKMSnXOuWv3/IclZU+M/AshoJMt68Ft6l7EdE= github.com/jfrog/jfrog-cli-security v1.19.1-0.20250623144441-d800f8204cc4 h1:6qTIZL/UXbME52zqdz637+j8D69nAltA9Ivh3fdK9Sc= github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 h1:0t6dQHoalUDNVrfZujD3iCmDGLDl+ndHclFkmONSpq0= -github.com/jfrog/jfrog-client-go v1.28.1-0.20250623080810-85bcce028748 h1:299KpOItnMAdW2ZmWrqn4+j1dEemNWSX/PHq6C+IVQA= +github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 h1:0t6dQHoalUDNVrfZujD3iCmDGLDl+ndHclFkmONSpq0= github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1/go.mod h1:1v0eih4thdPA4clBo9TuvAMT25sGDr1IQJ81DXQ/lBY= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= From 44eba8f98c3e5a43744914eaa8a4a5c69974f680 Mon Sep 17 00:00:00 2001 From: Rima Polsky Date: Mon, 30 Jun 2025 17:30:55 +0300 Subject: [PATCH 41/41] Update dependencies --- go.mod | 8 ++++---- go.sum | 15 --------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index ed1391f46..a0f8af438 100644 --- a/go.mod +++ b/go.mod @@ -193,10 +193,10 @@ require ( // replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20250529104758-6d769a684388 -// replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad +replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad -// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd +replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd -// replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 +replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 -//replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 +replace github.com/jfrog/jfrog-cli-security => github.com/jfrog/jfrog-cli-security v1.19.0 diff --git a/go.sum b/go.sum index cdcb91ff5..5615515a2 100644 --- a/go.sum +++ b/go.sum @@ -188,15 +188,12 @@ 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-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad h1:cnbcCK0VTHdLdmmv/9fYTRjuR1ewrYBW/S87pVE+d+s= github.com/jfrog/jfrog-cli-artifactory v0.3.3-0.20250623095509-b3fe2c4681ad/go.mod h1:hnXaevmDyQpyhpH5kwDufIjUUXXuKs54i+AX2CEywKE= -github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250619122826-54ff6f65b128 h1:SdNS8Z1H1c1wgtHxZJNjLf9cWx+zdfXDQPmjUwQ55Bo= github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd h1:1Nw+HKbtQZGEogerQBNM77RvbUwHYNKFNYJk4lmNF9w= github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250629143350-c43614bbffcd/go.mod h1:BkDHfCVecjcRNC+aqmHtTrKe+/K8MyjzmHYe5rER5Yg= github.com/jfrog/jfrog-cli-platform-services v1.9.0 h1:r/ETgJuMUOUu12w20ydsF6paqEaj0khH6bxMRsdNz1Y= github.com/jfrog/jfrog-cli-platform-services v1.9.0/go.mod h1:pMZMSwhj7yA4VKyj0Skr2lObIyGpZUxNJ40DSLKXU38= github.com/jfrog/jfrog-cli-security v1.19.0 h1:4qggon1biuOvjMjHZ5IWDA4Mh+qp2qecWEdeX6s4Xv8= github.com/jfrog/jfrog-cli-security v1.19.0/go.mod h1:QMoGTGfKMSnXOuWv3/IclZU+M/AshoJMt68Ft6l7EdE= -github.com/jfrog/jfrog-cli-security v1.19.1-0.20250623144441-d800f8204cc4 h1:6qTIZL/UXbME52zqdz637+j8D69nAltA9Ivh3fdK9Sc= -github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 h1:0t6dQHoalUDNVrfZujD3iCmDGLDl+ndHclFkmONSpq0= github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1 h1:0t6dQHoalUDNVrfZujD3iCmDGLDl+ndHclFkmONSpq0= github.com/jfrog/jfrog-client-go v1.28.1-0.20250629142537-bb24db402fe1/go.mod h1:1v0eih4thdPA4clBo9TuvAMT25sGDr1IQJ81DXQ/lBY= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -310,18 +307,6 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612143644-d23f7d691cd5 h1:ABQWX1F1wP0MJt/hp/hhNqIvx7tEksBO73E3sYGsRac= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa h1:2CSXNrMa1AzJf8b+gIn0rRA61wsiMHVYzqnbcv1MGpo= -github.com/rimapol/jfrog-cli-artifactory v0.0.0-20250612134944-da4259d4a2fa/go.mod h1:p3TnA61PSXO3BAYC+180o85UaOg+Zkd4WNGgUGy5d7Y= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8 h1:ppBwpjTJ3M+Moby9CO76GZg/BBh1/TjzkeOQP7/LJsI= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250609140436-3a07b64f58c8/go.mod h1:PKPfjwsOA5D/Fgi4bD6/8SwtCtnF/lub3/CMLua615Y= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250613000840-75a0253c1164 h1:My2TNxqTLNs/9l5gqn21MkmjsD4hpIiR5hoViLn9Dlw= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250613000840-75a0253c1164/go.mod h1:jmmyqO42y83CfmMJ5DK+6wAIoibb97FFDNq8r3RGGqU= -github.com/rimapol/jfrog-cli-core/v2 v2.0.0-20250619121725-239db9dc2424/go.mod h1:JDMYJHxU3W0/jaiiSljHLAcd0QeEGwpAwsnOqVR8c/0= -github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2 h1:I/b6Q6AoDKdTWEJMt48jHQ9Ps3AnsVE+JI5WxVnGJGA= -github.com/rimapol/jfrog-cli-security v1.17.2-0.20250609141058-d45e6f90d5d2/go.mod h1:zZzVMQRUqbJx7SvFsNfYolJN4Wpq+H1zzmIbxyT1GDk= -github.com/rimapol/jfrog-client-go v0.0.0-20250606121944-5c0f425fc4ca h1:yiv+LsxW3W3wUqDc6yVWEw2aCHT/YXlixvxbhJA3b+A= -github.com/rimapol/jfrog-client-go v0.0.0-20250606121944-5c0f425fc4ca/go.mod h1:XxYs2QtlTm92yqJ5O4j4vzWI8d4sDtKQUT1miNHMgnw= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=