From f981804fef59c7521aa48101e049672b205f519e Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Wed, 26 Nov 2025 10:13:19 +0530 Subject: [PATCH 01/24] resolving merged changes --- buildtools/cli.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/buildtools/cli.go b/buildtools/cli.go index f792880c7..43724f26e 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -629,6 +629,24 @@ func GradleCmd(c *cli.Context) (err error) { return err } + // do we need to restrict it for the artifactoryPublish command? + // FlexPack native mode for Gradle (bypasses config file requirements) + if os.Getenv("JFROG_RUN_NATIVE") == "true" { + log.Debug("Routing to Gradle FlexPack implementation") + if c.NArg() < 1 { + return cliutils.WrongNumberOfArgumentsHandler(c) + } + args := cliutils.ExtractCommand(c) + filteredGradleArgs, buildConfiguration, err := build.ExtractBuildDetailsFromArgs(args) + if err != nil { + return err + } + + // Create Gradle command with FlexPack (no config file needed) + gradleCmd := gradle.NewGradleCommand().SetConfiguration(buildConfiguration).SetTasks(filteredGradleArgs).SetConfigPath("") + return commands.Exec(gradleCmd) + } + configFilePath, err := getProjectConfigPathOrThrow(project.Gradle, "gradle", "gradle-config") if err != nil { return err From 4738cfb3a3b4bd0156d56b72415731208c199d36 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Wed, 26 Nov 2025 10:27:38 +0530 Subject: [PATCH 02/24] removing comment --- buildtools/cli.go | 1 - 1 file changed, 1 deletion(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 43724f26e..a94a1f9ac 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -629,7 +629,6 @@ func GradleCmd(c *cli.Context) (err error) { return err } - // do we need to restrict it for the artifactoryPublish command? // FlexPack native mode for Gradle (bypasses config file requirements) if os.Getenv("JFROG_RUN_NATIVE") == "true" { log.Debug("Routing to Gradle FlexPack implementation") From 00c3f89845f993ff0dca9fbca5aebf88d3be1957 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 11 Dec 2025 16:17:11 +0530 Subject: [PATCH 03/24] updating dependencies --- go.mod | 3 ++- go.sum | 6 ++++-- .../build/libs/minimal-example-1.0.jar | Bin 0 -> 743 bytes 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 testdata/gradle/gradleproject/build/libs/minimal-example-1.0.jar diff --git a/go.mod b/go.mod index 11588d174..634471c9a 100644 --- a/go.mod +++ b/go.mod @@ -283,8 +283,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab //replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca -//replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20251006061821-8b1be6a65215 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index 49469e87f..43d1b4118 100644 --- a/go.sum +++ b/go.sum @@ -1204,8 +1204,6 @@ github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI= github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= -github.com/jfrog/build-info-go v1.12.5-0.20251209171349-eb030db986f9 h1:CL7lp7Y7srwQ1vy1btX66t4wbztzEGQbqi/9tdEz7xk= -github.com/jfrog/build-info-go v1.12.5-0.20251209171349-eb030db986f9/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= github.com/jfrog/froggit-go v1.20.6 h1:Xp7+LlEh0m1KGrQstb+u0aGfjRUtv1eh9xQBV3571jQ= github.com/jfrog/froggit-go v1.20.6/go.mod h1:obSG1SlsWjktkuqmKtpq7MNTTL63e0ot+ucTnlOMV88= github.com/jfrog/go-mockhttp v0.3.1 h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8= @@ -1327,6 +1325,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 h1:7MX5JKBt6fu74/NeJIN27tQTaPg3OW6UG+aX/URyc7g= +github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca h1:cpPazoEf8gkl/cMJtPbE27eH2epSUGaYn0Ih6oI/oOU= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca/go.mod h1:GoR/f/RyUmUN/AvCTODtuzxCHMj7EeUe8wUP96piEYM= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= diff --git a/testdata/gradle/gradleproject/build/libs/minimal-example-1.0.jar b/testdata/gradle/gradleproject/build/libs/minimal-example-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..1d6a7749b1289ad0bb76a5df61ae040d8583738f GIT binary patch literal 743 zcmWIWW@h1HVBp|j(2k!J%>V>UAOZ+Df!NnI#8KDN&rP41Apk|;rh2A#(m(~0KrDi+ z(AUw=)6F$FM9$QFt15_jQ+eY!qwhcQ zqXt{FX09mFe19myT{SRr-;_ev?$f6iU9b#vx;i~gZNAPj#=Z+n-`~2-xH)*mt}C8S zZa1v!*sE91{~a=S)|=$!Ro6KbHh6kSC$Ba=AGP_g{e_3?v$rd3nL7Eg{=rD~oa?6! z>IZl;GKnzbj$lyGGcX7+ymbW8@aRU@h92D@#UQYxQ4>hQwIM}5x(OiFu#^RgV+a6Q pTn1#qVjNu;dW^&LEoq#Gqzfhf1H4(;K+0Hv@Dq@}4@@i!3;-&#+_wM# literal 0 HcmV?d00001 From 6b3311672fcd28549b85da150a14abe763b54225 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 11 Dec 2025 16:51:24 +0530 Subject: [PATCH 04/24] updating art depen --- go.mod | 4 ++-- go.sum | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 634471c9a..fc858fb95 100644 --- a/go.mod +++ b/go.mod @@ -283,9 +283,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab //replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211111931-7857cfd4beb9 -replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211110920-06ead4534f04 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index 43d1b4118..10abcb1fd 100644 --- a/go.sum +++ b/go.sum @@ -1327,8 +1327,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 h1:7MX5JKBt6fu74/NeJIN27tQTaPg3OW6UG+aX/URyc7g= github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/build-info-go v1.12.3-0.20251211110920-06ead4534f04/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca h1:cpPazoEf8gkl/cMJtPbE27eH2epSUGaYn0Ih6oI/oOU= github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca/go.mod h1:GoR/f/RyUmUN/AvCTODtuzxCHMj7EeUe8wUP96piEYM= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211111931-7857cfd4beb9/go.mod h1:xMvnbvQzK+xMhpvF77UgiMNN2qrpNRy8xAFeSIrf/BU= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= From a21920951ac6c0c18dd35eb3ce2fda56a29938b6 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 11 Dec 2025 16:52:18 +0530 Subject: [PATCH 05/24] updating bi depn --- go.sum | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/go.sum b/go.sum index 10abcb1fd..ffa5dbee1 100644 --- a/go.sum +++ b/go.sum @@ -1325,11 +1325,9 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 h1:7MX5JKBt6fu74/NeJIN27tQTaPg3OW6UG+aX/URyc7g= -github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/build-info-go v1.12.3-0.20251211110920-06ead4534f04 h1:JFNbQeLQXhdrSzK9MXGjFmfJB+e3Tburg7qrUbHM83w= github.com/nitinp19/build-info-go v1.12.3-0.20251211110920-06ead4534f04/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca h1:cpPazoEf8gkl/cMJtPbE27eH2epSUGaYn0Ih6oI/oOU= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca/go.mod h1:GoR/f/RyUmUN/AvCTODtuzxCHMj7EeUe8wUP96piEYM= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211111931-7857cfd4beb9 h1:lJyDwbNAnaktieh/phqJjVtKFYJ6qXh1sgoIsdI54pw= github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211111931-7857cfd4beb9/go.mod h1:xMvnbvQzK+xMhpvF77UgiMNN2qrpNRy8xAFeSIrf/BU= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= From 25973202c9738dbac624e7d2dbe85f5b39bee4a0 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Fri, 12 Dec 2025 10:14:43 +0530 Subject: [PATCH 06/24] updating depen --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index fc858fb95..3354540cf 100644 --- a/go.mod +++ b/go.mod @@ -283,9 +283,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab //replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211111931-7857cfd4beb9 +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212040502-823c1fd1211e -replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211110920-06ead4534f04 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index ffa5dbee1..88a9e9357 100644 --- a/go.sum +++ b/go.sum @@ -1325,10 +1325,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251211110920-06ead4534f04 h1:JFNbQeLQXhdrSzK9MXGjFmfJB+e3Tburg7qrUbHM83w= -github.com/nitinp19/build-info-go v1.12.3-0.20251211110920-06ead4534f04/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211111931-7857cfd4beb9 h1:lJyDwbNAnaktieh/phqJjVtKFYJ6qXh1sgoIsdI54pw= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211111931-7857cfd4beb9/go.mod h1:xMvnbvQzK+xMhpvF77UgiMNN2qrpNRy8xAFeSIrf/BU= +github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080 h1:LuclHQ30OmWyRrRUa3t3xwJrTG4djJFjzeBl78sQmSA= +github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212040502-823c1fd1211e h1:Z9/iJHqlYlckEc/xD4Wr00UYNrpTVdqCWsNNXBWtq84= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212040502-823c1fd1211e/go.mod h1:WyBTfVSa2j7U/jZiZ6jooTEUcx37jqI4VOKVu/JX/GY= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= From 5ab8a35aa04e82e70f9ce12bcebe36e2f0932d16 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Fri, 12 Dec 2025 14:11:50 +0530 Subject: [PATCH 07/24] fixing test cases --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3354540cf..6c48b085f 100644 --- a/go.mod +++ b/go.mod @@ -283,7 +283,7 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab //replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212040502-823c1fd1211e +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212083733-2ea5dde156c7 replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080 diff --git a/go.sum b/go.sum index 88a9e9357..80391c5b4 100644 --- a/go.sum +++ b/go.sum @@ -1327,8 +1327,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080 h1:LuclHQ30OmWyRrRUa3t3xwJrTG4djJFjzeBl78sQmSA= github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212040502-823c1fd1211e h1:Z9/iJHqlYlckEc/xD4Wr00UYNrpTVdqCWsNNXBWtq84= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212040502-823c1fd1211e/go.mod h1:WyBTfVSa2j7U/jZiZ6jooTEUcx37jqI4VOKVu/JX/GY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212083733-2ea5dde156c7 h1:BUcxQUw9BN44lLAbThnh8SpmI8S8x/FU443V6spmozY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212083733-2ea5dde156c7/go.mod h1:WyBTfVSa2j7U/jZiZ6jooTEUcx37jqI4VOKVu/JX/GY= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= From b945d0f238fba42bbe995fc6344392f85e10ba3a Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Fri, 12 Dec 2025 15:07:54 +0530 Subject: [PATCH 08/24] checking config file exist or not --- buildtools/cli.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index a94a1f9ac..20c8bdc1f 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -629,8 +629,14 @@ func GradleCmd(c *cli.Context) (err error) { return err } + nativeMode := os.Getenv("JFROG_RUN_NATIVE") == "true" + configFilePath, configExists, err := project.GetProjectConfFilePath(project.Gradle) + if err != nil { + return err + } + // FlexPack native mode for Gradle (bypasses config file requirements) - if os.Getenv("JFROG_RUN_NATIVE") == "true" { + if nativeMode && !configExists { log.Debug("Routing to Gradle FlexPack implementation") if c.NArg() < 1 { return cliutils.WrongNumberOfArgumentsHandler(c) @@ -646,9 +652,11 @@ func GradleCmd(c *cli.Context) (err error) { return commands.Exec(gradleCmd) } - configFilePath, err := getProjectConfigPathOrThrow(project.Gradle, "gradle", "gradle-config") - if err != nil { - return err + // If config file is missing and not in native mode, return the standard missing-config error. + if !configExists { + if configFilePath, err = getProjectConfigPathOrThrow(project.Gradle, "gradle", "gradle-config"); err != nil { + return err + } } // Found a config file. Continue as native command. From bc67d6c3a33099ebb208a20a16caa5a1cfebf82a Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 11 Dec 2025 16:17:11 +0530 Subject: [PATCH 09/24] updating dependencies --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 6c48b085f..634471c9a 100644 --- a/go.mod +++ b/go.mod @@ -283,9 +283,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab //replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212083733-2ea5dde156c7 +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca -replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index 80391c5b4..43d1b4118 100644 --- a/go.sum +++ b/go.sum @@ -1325,10 +1325,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080 h1:LuclHQ30OmWyRrRUa3t3xwJrTG4djJFjzeBl78sQmSA= -github.com/nitinp19/build-info-go v1.12.3-0.20251211145912-94f59e505080/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212083733-2ea5dde156c7 h1:BUcxQUw9BN44lLAbThnh8SpmI8S8x/FU443V6spmozY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212083733-2ea5dde156c7/go.mod h1:WyBTfVSa2j7U/jZiZ6jooTEUcx37jqI4VOKVu/JX/GY= +github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 h1:7MX5JKBt6fu74/NeJIN27tQTaPg3OW6UG+aX/URyc7g= +github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca h1:cpPazoEf8gkl/cMJtPbE27eH2epSUGaYn0Ih6oI/oOU= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca/go.mod h1:GoR/f/RyUmUN/AvCTODtuzxCHMj7EeUe8wUP96piEYM= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= From c94f1e9adfa770ce2841da68d61aee2e2f2663be Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 11 Dec 2025 16:25:14 +0530 Subject: [PATCH 10/24] updating mod --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 634471c9a..bd6b3cf66 100644 --- a/go.mod +++ b/go.mod @@ -23,8 +23,8 @@ require ( github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251210085744-f8481d179ac5 github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251204144808-73fa744851c0 github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e - github.com/jfrog/jfrog-cli-security v1.24.1 - github.com/jfrog/jfrog-client-go v1.55.1-0.20251212095223-711b02c53736 + github.com/jfrog/jfrog-cli-security v1.24.0 + github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e github.com/jszwec/csvutil v1.10.0 github.com/manifoldco/promptui v0.9.0 github.com/spf13/viper v1.21.0 diff --git a/go.sum b/go.sum index 43d1b4118..c0bb9deca 100644 --- a/go.sum +++ b/go.sum @@ -1222,10 +1222,10 @@ github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251204144808-73fa744851c0 h1:8S1v github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251204144808-73fa744851c0/go.mod h1:Ijx7tkTp6uDxgmQW+zQKLNztMrz6dcQAoVNXHL7spsU= github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e h1:0BDeb5lD8qgQMOZJ08E35jUMTlt2Hb0K7Wu0SqO6MrI= github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e/go.mod h1:qbu4iqBST9x8LgD8HhzUm91iOB3vHqtoGmaxOnmw0ok= -github.com/jfrog/jfrog-cli-security v1.24.1 h1:NF8SE9uzUgqvqYjuuqbduXBqj+fwE4CmkMeVKtcLkyI= -github.com/jfrog/jfrog-cli-security v1.24.1/go.mod h1:3FXD5IkKtdQOm9CZk6cR7q0iC6PaGMnjqzZqRcQp2r0= -github.com/jfrog/jfrog-client-go v1.55.1-0.20251212095223-711b02c53736 h1:sPAQHxVaV9QQ2TpfLM5y9VY+Fgva/5o7UZYlhNKouvw= -github.com/jfrog/jfrog-client-go v1.55.1-0.20251212095223-711b02c53736/go.mod h1:WQ5Y+oKYyHFAlCbHN925bWhnShTd2ruxZ6YTpb76fpU= +github.com/jfrog/jfrog-cli-security v1.24.0 h1:APqx0VezzpH7ppEyBu8dn5/QbxMAI4M7Tw8qopEkAgI= +github.com/jfrog/jfrog-cli-security v1.24.0/go.mod h1:qBAvU9kN41nReJk/O4V9Q/xwiXfAdyhqRIYaOjVm8nE= +github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e h1:9le3a99UGdBHZXv7vZ7aqxLyBpwMq+sbTWiOaI9pwCU= +github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e/go.mod h1:WQ5Y+oKYyHFAlCbHN925bWhnShTd2ruxZ6YTpb76fpU= github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= From 05adca9676398d8545b6eaece55238dd918a8d05 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Fri, 12 Dec 2025 17:08:01 +0530 Subject: [PATCH 11/24] added depn --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index bd6b3cf66..d27bb33f0 100644 --- a/go.mod +++ b/go.mod @@ -283,9 +283,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab //replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212113004-4a4f4196e21a -replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251212112339-30e97816d426 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index c0bb9deca..fc58a6b0b 100644 --- a/go.sum +++ b/go.sum @@ -1325,10 +1325,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849 h1:7MX5JKBt6fu74/NeJIN27tQTaPg3OW6UG+aX/URyc7g= -github.com/nitinp19/build-info-go v1.12.3-0.20251211103801-5b83ec4de849/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca h1:cpPazoEf8gkl/cMJtPbE27eH2epSUGaYn0Ih6oI/oOU= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251211104052-8c6a72f7e6ca/go.mod h1:GoR/f/RyUmUN/AvCTODtuzxCHMj7EeUe8wUP96piEYM= +github.com/nitinp19/build-info-go v1.12.3-0.20251212112339-30e97816d426 h1:HLDoHZLF1joioZV+A9NmffItJ7s34lmywFkBnbymKMs= +github.com/nitinp19/build-info-go v1.12.3-0.20251212112339-30e97816d426/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212113004-4a4f4196e21a h1:Z5CUCSaTbCwrU5cX3CdzL5S5whIJhmEYCfal/o/a8ZI= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212113004-4a4f4196e21a/go.mod h1:APAsovKmrZC7fFw0IABhPoeZr73bpvxNhK1hr27S/FI= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= From a1b07a65c557821607a1b3bd829443eac08ebe1f Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Fri, 12 Dec 2025 17:19:45 +0530 Subject: [PATCH 12/24] depn update --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index d27bb33f0..88e71925d 100644 --- a/go.mod +++ b/go.mod @@ -23,8 +23,8 @@ require ( github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251210085744-f8481d179ac5 github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251204144808-73fa744851c0 github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e - github.com/jfrog/jfrog-cli-security v1.24.0 - github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e + github.com/jfrog/jfrog-cli-security v1.24.1 + github.com/jfrog/jfrog-client-go v1.55.1-0.20251212095223-711b02c53736 github.com/jszwec/csvutil v1.10.0 github.com/manifoldco/promptui v0.9.0 github.com/spf13/viper v1.21.0 diff --git a/go.sum b/go.sum index fc58a6b0b..b822f6253 100644 --- a/go.sum +++ b/go.sum @@ -1222,10 +1222,10 @@ github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251204144808-73fa744851c0 h1:8S1v github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251204144808-73fa744851c0/go.mod h1:Ijx7tkTp6uDxgmQW+zQKLNztMrz6dcQAoVNXHL7spsU= github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e h1:0BDeb5lD8qgQMOZJ08E35jUMTlt2Hb0K7Wu0SqO6MrI= github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20251205121610-171eb9b0000e/go.mod h1:qbu4iqBST9x8LgD8HhzUm91iOB3vHqtoGmaxOnmw0ok= -github.com/jfrog/jfrog-cli-security v1.24.0 h1:APqx0VezzpH7ppEyBu8dn5/QbxMAI4M7Tw8qopEkAgI= -github.com/jfrog/jfrog-cli-security v1.24.0/go.mod h1:qBAvU9kN41nReJk/O4V9Q/xwiXfAdyhqRIYaOjVm8nE= -github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e h1:9le3a99UGdBHZXv7vZ7aqxLyBpwMq+sbTWiOaI9pwCU= -github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e/go.mod h1:WQ5Y+oKYyHFAlCbHN925bWhnShTd2ruxZ6YTpb76fpU= +github.com/jfrog/jfrog-cli-security v1.24.1 h1:NF8SE9uzUgqvqYjuuqbduXBqj+fwE4CmkMeVKtcLkyI= +github.com/jfrog/jfrog-cli-security v1.24.1/go.mod h1:3FXD5IkKtdQOm9CZk6cR7q0iC6PaGMnjqzZqRcQp2r0= +github.com/jfrog/jfrog-client-go v1.55.1-0.20251212095223-711b02c53736 h1:sPAQHxVaV9QQ2TpfLM5y9VY+Fgva/5o7UZYlhNKouvw= +github.com/jfrog/jfrog-client-go v1.55.1-0.20251212095223-711b02c53736/go.mod h1:WQ5Y+oKYyHFAlCbHN925bWhnShTd2ruxZ6YTpb76fpU= github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= From 9625d0c304800127ce98190bd5e5d0ca794a3660 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Wed, 17 Dec 2025 22:19:21 +0530 Subject: [PATCH 13/24] added test cases --- buildtools/cli.go | 58 ++- go.mod | 4 +- go.sum | 8 +- gradle_test.go | 668 +++++++++++++++++++++++++++++++- utils/buildinfo/buildinfo.go | 3 +- utils/cliutils/commandsflags.go | 2 +- 6 files changed, 721 insertions(+), 22 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 20c8bdc1f..eb01c7848 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -14,6 +14,7 @@ import ( "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/container/strategies" "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/python" "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/setup" + artutils "github.com/jfrog/jfrog-cli-artifactory/artifactory/utils" "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" @@ -558,8 +559,13 @@ func MvnCmd(c *cli.Context) (err error) { return err } - // FlexPack bypasses all config file requirements - if os.Getenv("JFROG_RUN_NATIVE") == "true" { + configFilePath, configExists, err := project.GetProjectConfFilePath(project.Maven) + if err != nil { + return err + } + + // FlexPack bypasses all config file requirements (only when no config exists) + if artutils.ShouldRunNative(configFilePath) && !configExists { log.Debug("Routing to Maven native implementation") // Extract build configuration for FlexPack args := cliutils.ExtractCommand(c) @@ -572,9 +578,11 @@ func MvnCmd(c *cli.Context) (err error) { return commands.Exec(mvnCmd) } - configFilePath, err := getProjectConfigPathOrThrow(project.Maven, "mvn", "mvn-config") - if err != nil { - return err + // If config file is missing and not in native mode, return the standard missing-config error. + if !configExists { + if configFilePath, err = getProjectConfigPathOrThrow(project.Maven, "mvn", "mvn-config"); err != nil { + return err + } } if c.NArg() < 1 { @@ -629,11 +637,35 @@ func GradleCmd(c *cli.Context) (err error) { return err } - nativeMode := os.Getenv("JFROG_RUN_NATIVE") == "true" + resolveServer := func(args []string) ([]string, *coreConfig.ServerDetails, error) { + cleanedArgs, serverID, err := coreutils.ExtractServerIdFromCommand(args) + if err != nil { + return nil, nil, fmt.Errorf("failed to extract server ID: %w", err) + } + + if serverID == "" { + serverDetails, err := coreConfig.GetDefaultServerConf() + if err != nil { + return cleanedArgs, nil, err + } + if serverDetails == nil { + return cleanedArgs, nil, fmt.Errorf("no default server configuration found. Please configure a server using 'jfrog config add' or specify a server using --server-id") + } + return cleanedArgs, serverDetails, nil + } + + serverDetails, err := coreConfig.GetSpecificConfig(serverID, true, true) + if err != nil { + return nil, nil, fmt.Errorf("failed to get server configuration for ID '%s': %w", serverID, err) + } + return cleanedArgs, serverDetails, nil + } + configFilePath, configExists, err := project.GetProjectConfFilePath(project.Gradle) if err != nil { return err } + nativeMode := artutils.ShouldRunNative(configFilePath) // FlexPack native mode for Gradle (bypasses config file requirements) if nativeMode && !configExists { @@ -642,13 +674,17 @@ func GradleCmd(c *cli.Context) (err error) { return cliutils.WrongNumberOfArgumentsHandler(c) } args := cliutils.ExtractCommand(c) + args, serverDetails, err := resolveServer(args) + if err != nil { + return err + } filteredGradleArgs, buildConfiguration, err := build.ExtractBuildDetailsFromArgs(args) if err != nil { return err } // Create Gradle command with FlexPack (no config file needed) - gradleCmd := gradle.NewGradleCommand().SetConfiguration(buildConfiguration).SetTasks(filteredGradleArgs).SetConfigPath("") + gradleCmd := gradle.NewGradleCommand().SetConfiguration(buildConfiguration).SetTasks(filteredGradleArgs).SetConfigPath("").SetServerDetails(serverDetails) return commands.Exec(gradleCmd) } @@ -664,6 +700,10 @@ func GradleCmd(c *cli.Context) (err error) { return cliutils.WrongNumberOfArgumentsHandler(c) } args := cliutils.ExtractCommand(c) + args, serverDetails, err := resolveServer(args) + if err != nil { + return err + } filteredGradleArgs, buildConfiguration, err := build.ExtractBuildDetailsFromArgs(args) if err != nil { return err @@ -695,7 +735,7 @@ func GradleCmd(c *cli.Context) (err error) { return err } printDeploymentView := log.IsStdErrTerminal() - gradleCmd := gradle.NewGradleCommand().SetConfiguration(buildConfiguration).SetTasks(filteredGradleArgs).SetConfigPath(configFilePath).SetThreads(threads).SetDetailedSummary(detailedSummary || printDeploymentView).SetXrayScan(xrayScan).SetScanOutputFormat(scanOutputFormat) + gradleCmd := gradle.NewGradleCommand().SetConfiguration(buildConfiguration).SetTasks(filteredGradleArgs).SetConfigPath(configFilePath).SetThreads(threads).SetDetailedSummary(detailedSummary || printDeploymentView).SetXrayScan(xrayScan).SetScanOutputFormat(scanOutputFormat).SetServerDetails(serverDetails) err = commands.Exec(gradleCmd) result := gradleCmd.Result() defer cliutils.CleanupResult(result, &err) @@ -1533,7 +1573,7 @@ func pythonCmd(c *cli.Context, projectType project.ProjectType) error { } // FlexPack native mode for Poetry (bypasses config file requirements) - if os.Getenv("JFROG_RUN_NATIVE") == "true" && projectType == project.Poetry { + if artutils.ShouldRunNative("") && projectType == project.Poetry { log.Debug("Routing to Poetry native implementation") args := cliutils.ExtractCommand(c) filteredArgs, buildConfiguration, err := build.ExtractBuildDetailsFromArgs(args) diff --git a/go.mod b/go.mod index 88e71925d..f7ad0e21b 100644 --- a/go.mod +++ b/go.mod @@ -283,9 +283,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab //replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212113004-4a4f4196e21a +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251217164045-f03027bdbbb8 -replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251212112339-30e97816d426 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251217110410-139203aa7c26 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index b822f6253..0f73a273d 100644 --- a/go.sum +++ b/go.sum @@ -1325,10 +1325,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251212112339-30e97816d426 h1:HLDoHZLF1joioZV+A9NmffItJ7s34lmywFkBnbymKMs= -github.com/nitinp19/build-info-go v1.12.3-0.20251212112339-30e97816d426/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212113004-4a4f4196e21a h1:Z5CUCSaTbCwrU5cX3CdzL5S5whIJhmEYCfal/o/a8ZI= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251212113004-4a4f4196e21a/go.mod h1:APAsovKmrZC7fFw0IABhPoeZr73bpvxNhK1hr27S/FI= +github.com/nitinp19/build-info-go v1.12.3-0.20251217110410-139203aa7c26 h1:1n+hPJGWJ8KDJsjeCbs3ob3b3S2E+6QzBAXT3mLShJQ= +github.com/nitinp19/build-info-go v1.12.3-0.20251217110410-139203aa7c26/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251217164045-f03027bdbbb8 h1:7JGcT/xGaPeOKTeY5ZGovVjx8MSeWyUFuhIhXYA4OSA= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251217164045-f03027bdbbb8/go.mod h1:1z7CuujOoLOFhHzumSfs0epvxoSyDFqJlrmZJPv/IX0= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= diff --git a/gradle_test.go b/gradle_test.go index 84a060c15..0d8925195 100644 --- a/gradle_test.go +++ b/gradle_test.go @@ -3,11 +3,6 @@ package main import ( "errors" "fmt" - "github.com/jfrog/gofrog/io" - "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/gradle" - coretests "github.com/jfrog/jfrog-cli-core/v2/utils/tests" - "github.com/jfrog/jfrog-client-go/http/httpclient" - "github.com/stretchr/testify/require" "net/http" "os" "os/exec" @@ -15,6 +10,12 @@ import ( "strings" "testing" + "github.com/jfrog/gofrog/io" + "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/gradle" + coretests "github.com/jfrog/jfrog-cli-core/v2/utils/tests" + "github.com/jfrog/jfrog-client-go/http/httpclient" + "github.com/stretchr/testify/require" + "github.com/jfrog/jfrog-cli/utils/cliutils" "github.com/jfrog/jfrog-client-go/utils/log" @@ -254,6 +255,648 @@ func TestSetupGradleCommand(t *testing.T) { } } +// TestGradleBuildWithFlexPack tests Gradle build with JFROG_RUN_NATIVE=true (FlexPack mode) +func TestGradleBuildWithFlexPack(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle without config file to trigger FlexPack mode + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath) + assert.NoError(t, err) + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackBuildInfo tests Gradle build info collection with JFROG_RUN_NATIVE=true +func TestGradleBuildWithFlexPackBuildInfo(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack build info test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle with build info (FlexPack mode - no config file) + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created with FlexPack dependencies + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found") + return + } + + // Validate build info structure + buildInfo := publishedBuildInfo.BuildInfo + assert.NotEmpty(t, buildInfo.Modules, "Build info should have modules") + if len(buildInfo.Modules) > 0 { + module := buildInfo.Modules[0] + assert.Equal(t, buildinfo.Gradle, module.Type, "Module type should be Gradle") + assert.NotEmpty(t, module.Id, "Module should have ID") + + // FlexPack should collect dependencies + if len(module.Dependencies) > 0 { + // Validate dependency structure + for _, dep := range module.Dependencies { + assert.NotEmpty(t, dep.Id, "Dependency should have ID") + // FlexPack should provide checksums + hasChecksum := dep.Sha1 != "" || dep.Sha256 != "" || dep.Md5 != "" + assert.True(t, hasChecksum, "Dependency %s should have at least one checksum", dep.Id) + } + } + } + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackAndPublish tests Gradle publish with JFROG_RUN_NATIVE=true +func TestGradleBuildWithFlexPackAndPublish(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack publish test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-publish" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle with publish task (FlexPack mode - no config file) + // This tests that FlexPack correctly handles publish/artifactoryPublish tasks + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "publish", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + if err != nil { + // Publish may fail if not properly configured - that's OK for this test + // The important thing is that FlexPack mode was activated + t.Logf("Gradle publish command returned error (may be expected if publish not configured): %v", err) + } + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackFullValidation is the native equivalent of TestGradleBuildWithServerID +// It validates complete build info structure including module type validation +func TestGradleBuildWithFlexPackFullValidation(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack full validation test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-full" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle build with build info collection (FlexPack mode - no config file) + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found") + return + } + + // Validate build info structure - FlexPack collects dependencies only (no artifacts without deployment) + buildInfo := publishedBuildInfo.BuildInfo + assert.NotEmpty(t, buildInfo.Modules, "Build info should have modules") + if len(buildInfo.Modules) > 0 { + module := buildInfo.Modules[0] + // Validate module type is Gradle + assert.Equal(t, buildinfo.Gradle, module.Type, "Module type should be Gradle") + assert.NotEmpty(t, module.Id, "Module should have ID") + } + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackProjectWithPlugin tests FlexPack with the projectwithplugin test project +// This is the native equivalent of TestGradleBuildWithServerIDWithUsesPlugin but runs in FlexPack mode +func TestGradleBuildWithFlexPackProjectWithPlugin(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack projectwithplugin test") + } + + // Create gradle project with plugin configuration + buildGradlePath := createGradleProject(t, "projectwithplugin") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-plugin" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle build (FlexPack mode - no config file, plugin is ignored in native mode) + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found") + return + } + + // Validate build info structure + buildInfo := publishedBuildInfo.BuildInfo + assert.NotEmpty(t, buildInfo.Modules, "Build info should have modules") + if len(buildInfo.Modules) > 0 { + module := buildInfo.Modules[0] + assert.Equal(t, buildinfo.Gradle, module.Type, "Module type should be Gradle") + assert.NotEmpty(t, module.Id, "Module should have ID") + } + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackMultipleTasks tests FlexPack with multiple Gradle tasks +// Similar to how traditional tests run "clean artifactoryPublish" +func TestGradleBuildWithFlexPackMultipleTasks(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack multiple tasks test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-multi" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle with multiple tasks (FlexPack mode) + err := runJfrogCliWithoutAssertion("gradle", "clean", "compileJava", "test", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found") + return + } + + // Validate build info structure + assert.NotEmpty(t, publishedBuildInfo.BuildInfo.Modules, "Build info should have modules") + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackNoBuildInfo tests FlexPack without build info collection +// This is the native equivalent of running gradle without --build-name/--build-number +func TestGradleBuildWithFlexPackNoBuildInfo(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack no build info test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle without build info flags (FlexPack mode - just execute gradle) + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath) + assert.NoError(t, err) + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackTestTask tests 'jf gradle test' with JFROG_RUN_NATIVE=true +func TestGradleBuildWithFlexPackTestTask(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack test task test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-test" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle test task (FlexPack mode) + err := runJfrogCliWithoutAssertion("gradle", "clean", "test", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + // Test may fail if no tests exist, but command should execute + if err != nil { + t.Logf("Gradle test command returned error (may be expected if no tests exist): %v", err) + } + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackEnvVars tests build info collection using JFROG_CLI_BUILD_NAME and JFROG_CLI_BUILD_NUMBER +func TestGradleBuildWithFlexPackEnvVars(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack env vars test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-env" + buildNumber := "123" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Set build name and number via environment variables + setBuildNameCallback := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_CLI_BUILD_NAME", buildName) + defer setBuildNameCallback() + setBuildNumberCallback := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_CLI_BUILD_NUMBER", buildNumber) + defer setBuildNumberCallback() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle without explicit build name/number flags - should use env vars + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created with the env var values + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found with env var build name/number") + return + } + + // Validate build info has the correct build name and number + assert.Equal(t, buildName, publishedBuildInfo.BuildInfo.Name, "Build name should match env var") + assert.Equal(t, buildNumber, publishedBuildInfo.BuildInfo.Number, "Build number should match env var") + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackInvalidArgs tests 'jf gradle build' with invalid Gradle arguments +func TestGradleBuildWithFlexPackInvalidArgs(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack invalid args test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle with invalid task name - should fail + err := runJfrogCliWithoutAssertion("gradle", "nonExistentTask", "-b"+buildGradlePath) + assert.Error(t, err, "Gradle should fail with invalid task name") + + // Run gradle with invalid option + err = runJfrogCliWithoutAssertion("gradle", "build", "--invalid-option-xyz", "-b"+buildGradlePath) + assert.Error(t, err, "Gradle should fail with invalid option") + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackDependencySHA validates that dependency SHA checksums are collected +func TestGradleBuildWithFlexPackDependencySHA(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack dependency SHA test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-sha" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle build + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found") + return + } + + // Validate that dependencies have SHA checksums + assert.NotEmpty(t, publishedBuildInfo.BuildInfo.Modules, "Build info should have modules") + for _, module := range publishedBuildInfo.BuildInfo.Modules { + for _, dep := range module.Dependencies { + // FlexPack should provide at least one SHA checksum + hasSHA := dep.Sha1 != "" || dep.Sha256 != "" + assert.True(t, hasSHA, "Dependency %s should have SHA1 or SHA256 checksum", dep.Id) + } + } + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackDependencyScope validates that dependency scopes/configurations are collected +func TestGradleBuildWithFlexPackDependencyScope(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack dependency scope test") + } + + buildGradlePath := createGradleProject(t, "gradleproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-scope" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle build + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found") + return + } + + // Validate that dependencies have scopes + assert.NotEmpty(t, publishedBuildInfo.BuildInfo.Modules, "Build info should have modules") + for _, module := range publishedBuildInfo.BuildInfo.Modules { + for _, dep := range module.Dependencies { + // FlexPack should collect scopes (Gradle configurations) + assert.NotEmpty(t, dep.Scopes, "Dependency %s should have scopes/configurations", dep.Id) + } + } + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackFallback verifies that gradle falls back to traditional approach +// when JFROG_RUN_NATIVE is not set (covered by existing traditional tests, this is explicit verification) +func TestGradleBuildWithFlexPackFallback(t *testing.T) { + initGradleTest(t) + + // Explicitly ensure JFROG_RUN_NATIVE is NOT set + _ = os.Unsetenv("JFROG_RUN_NATIVE") + + buildGradlePath := createGradleProject(t, "gradleproject") + configFilePath := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "buildspecs", tests.GradleConfig) + destPath := filepath.Join(filepath.Dir(buildGradlePath), ".jfrog", "projects") + createConfigFile(destPath, configFilePath, t) + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-fallback" + buildNumber := "1" + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle with config file (traditional approach) + runJfrogCli(t, "gradle", "clean", "artifactoryPublish", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + + // Validate artifacts were deployed (traditional approach deploys to Artifactory) + searchSpec, err := tests.CreateSpec(tests.SearchAllGradle) + assert.NoError(t, err) + inttestutils.VerifyExistInArtifactory(tests.GetGradleDeployedArtifacts(), searchSpec, serverDetails, t) + + cleanGradleTest(t) +} + +// TestGradleHelpCommand verifies 'jf gradle --help' displays correct usage instructions +func TestGradleHelpCommand(t *testing.T) { + initGradleTest(t) + + // Run gradle help command + jfrogCli := coretests.NewJfrogCli(execMain, "jfrog", "") + err := jfrogCli.Exec("gradle", "--help") + // Help command should succeed + assert.NoError(t, err, "gradle --help should succeed") + + cleanGradleTest(t) +} + +// TestGradleBuildWithFlexPackKotlinDSL tests build info collection for Kotlin DSL (build.gradle.kts) +// Note: This test requires a Kotlin DSL project to be available +func TestGradleBuildWithFlexPackKotlinDSL(t *testing.T) { + initGradleTest(t) + + // Check if Gradle is available in the environment + if _, err := exec.LookPath("gradle"); err != nil { + t.Skip("Gradle not found in PATH, skipping Gradle FlexPack Kotlin DSL test") + } + + // Check if Kotlin DSL project exists + kotlinProjectPath := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", "kotlinproject") + if _, err := os.Stat(kotlinProjectPath); os.IsNotExist(err) { + t.Skip("Kotlin DSL project not found, skipping Kotlin DSL test") + } + + // Create gradle project with Kotlin DSL + buildGradlePath := createGradleProjectKotlin(t, "kotlinproject") + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) + defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) + + buildName := tests.GradleBuildName + "-flexpack-kotlin" + buildNumber := "1" + + // Set environment for native FlexPack implementation + setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") + defer setEnvCallBack() + + // Windows compatibility + buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") + + // Run gradle build + err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) + assert.NoError(t, err) + + // Publish build info + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + // Validate build info was created + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + if err != nil { + assert.NoError(t, err) + return + } + if !found { + assert.True(t, found, "build info was expected to be found") + return + } + + // Validate build info structure + buildInfo := publishedBuildInfo.BuildInfo + assert.NotEmpty(t, buildInfo.Modules, "Build info should have modules") + if len(buildInfo.Modules) > 0 { + module := buildInfo.Modules[0] + assert.Equal(t, buildinfo.Gradle, module.Type, "Module type should be Gradle") + } + + cleanGradleTest(t) +} + func createGradleProject(t *testing.T, projectName string) string { srcBuildFile := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName, "build.gradle") buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, "") @@ -266,10 +909,25 @@ func createGradleProject(t *testing.T, projectName string) string { return buildGradlePath } +// createGradleProjectKotlin creates a Kotlin DSL gradle project for testing +func createGradleProjectKotlin(t *testing.T, projectName string) string { + srcBuildFile := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName, "build.gradle.kts") + buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, "") + assert.NoError(t, err) + + srcSettingsFile := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName, "settings.gradle.kts") + _, err = tests.ReplaceTemplateVariables(srcSettingsFile, "") + assert.NoError(t, err) + + return buildGradlePath +} + func initGradleTest(t *testing.T) { if !*tests.TestGradle { t.Skip("Skipping Gradle test. To run Gradle test add the '-test.gradle=true' option.") } + // Ensure clean state - unset native flag so traditional tests run correctly + _ = os.Unsetenv("JFROG_RUN_NATIVE") createJfrogHomeConfig(t, true) } diff --git a/utils/buildinfo/buildinfo.go b/utils/buildinfo/buildinfo.go index 1dedee1fb..4952c9a55 100644 --- a/utils/buildinfo/buildinfo.go +++ b/utils/buildinfo/buildinfo.go @@ -12,6 +12,7 @@ import ( buildinfo "github.com/jfrog/build-info-go/entities" "github.com/jfrog/build-info-go/flexpack" "github.com/jfrog/gofrog/crypto" + artutils "github.com/jfrog/jfrog-cli-artifactory/artifactory/utils" "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build" "github.com/jfrog/jfrog-cli-core/v2/common/project" @@ -302,7 +303,7 @@ func extractRepositoryConfigForProject(projectType project.ProjectType) (*projec log.Debug("Extracting repository config for project type") // In native mode, completely ignore YAML and infer from pyproject.toml - if os.Getenv("JFROG_RUN_NATIVE") == "true" { + if artutils.ShouldRunNative("") { log.Info("Native mode enabled: inferring Poetry config from pyproject.toml") return inferPoetryConfigFromToml(projectType) } diff --git a/utils/cliutils/commandsflags.go b/utils/cliutils/commandsflags.go index 68ffdd03c..15dbf09bf 100644 --- a/utils/cliutils/commandsflags.go +++ b/utils/cliutils/commandsflags.go @@ -1860,7 +1860,7 @@ var commandFlags = map[string][]string{ BuildName, BuildNumber, deploymentThreads, InsecureTls, Project, detailedSummary, xrayScan, xrOutput, }, Gradle: { - BuildName, BuildNumber, deploymentThreads, Project, detailedSummary, xrayScan, xrOutput, + BuildName, BuildNumber, deploymentThreads, Project, serverId, detailedSummary, xrayScan, xrOutput, }, Docker: { BuildName, BuildNumber, module, Project, From ada1dd65677a663b37f461640ba56f7e525e4664 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 00:08:23 +0530 Subject: [PATCH 14/24] adding test cases --- gradle_test.go | 61 ++----------------- testdata/gradle/gradleproject/build.gradle | 4 ++ .../src/main/java/example/Example.java | 14 +++++ 3 files changed, 22 insertions(+), 57 deletions(-) create mode 100644 testdata/gradle/gradleproject/src/main/java/example/Example.java diff --git a/gradle_test.go b/gradle_test.go index 0d8925195..acae7d2e9 100644 --- a/gradle_test.go +++ b/gradle_test.go @@ -135,7 +135,8 @@ func TestGradleBuildWithServerID(t *testing.T) { return } buildInfo := publishedBuildInfo.BuildInfo - validateBuildInfo(buildInfo, t, 0, 1, gradleModuleId, buildinfo.Gradle) + // Expect 1 dependency (junit:4.7) since the project has source code using JUnit + validateBuildInfo(buildInfo, t, 1, 1, gradleModuleId, buildinfo.Gradle) cleanGradleTest(t) } @@ -184,7 +185,8 @@ func TestGradleBuildWithServerIDAndDetailedSummary(t *testing.T) { return } buildInfo := publishedBuildInfo.BuildInfo - validateBuildInfo(buildInfo, t, 0, 1, gradleModuleId, buildinfo.Gradle) + // Expect 1 dependency (junit:4.7) since the project has source code using JUnit + validateBuildInfo(buildInfo, t, 1, 1, gradleModuleId, buildinfo.Gradle) cleanGradleTest(t) } @@ -436,61 +438,6 @@ func TestGradleBuildWithFlexPackFullValidation(t *testing.T) { cleanGradleTest(t) } -// TestGradleBuildWithFlexPackProjectWithPlugin tests FlexPack with the projectwithplugin test project -// This is the native equivalent of TestGradleBuildWithServerIDWithUsesPlugin but runs in FlexPack mode -func TestGradleBuildWithFlexPackProjectWithPlugin(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack projectwithplugin test") - } - - // Create gradle project with plugin configuration - buildGradlePath := createGradleProject(t, "projectwithplugin") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - buildName := tests.GradleBuildName + "-flexpack-plugin" - buildNumber := "1" - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle build (FlexPack mode - no config file, plugin is ignored in native mode) - err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) - assert.NoError(t, err) - - // Publish build info - assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) - - // Validate build info was created - publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) - if err != nil { - assert.NoError(t, err) - return - } - if !found { - assert.True(t, found, "build info was expected to be found") - return - } - - // Validate build info structure - buildInfo := publishedBuildInfo.BuildInfo - assert.NotEmpty(t, buildInfo.Modules, "Build info should have modules") - if len(buildInfo.Modules) > 0 { - module := buildInfo.Modules[0] - assert.Equal(t, buildinfo.Gradle, module.Type, "Module type should be Gradle") - assert.NotEmpty(t, module.Id, "Module should have ID") - } - - cleanGradleTest(t) -} - // TestGradleBuildWithFlexPackMultipleTasks tests FlexPack with multiple Gradle tasks // Similar to how traditional tests run "clean artifactoryPublish" func TestGradleBuildWithFlexPackMultipleTasks(t *testing.T) { diff --git a/testdata/gradle/gradleproject/build.gradle b/testdata/gradle/gradleproject/build.gradle index eeac79246..55a0d6e90 100644 --- a/testdata/gradle/gradleproject/build.gradle +++ b/testdata/gradle/gradleproject/build.gradle @@ -1,6 +1,10 @@ apply plugin: 'groovy' apply plugin: 'idea' +repositories { + mavenCentral() +} + dependencies { implementation "junit:junit:4.7" } diff --git a/testdata/gradle/gradleproject/src/main/java/example/Example.java b/testdata/gradle/gradleproject/src/main/java/example/Example.java new file mode 100644 index 000000000..b82e7d562 --- /dev/null +++ b/testdata/gradle/gradleproject/src/main/java/example/Example.java @@ -0,0 +1,14 @@ +package example; + +import org.junit.Assert; + +/** + * Simple example class that uses JUnit to ensure the dependency is resolved. + */ +public class Example { + public boolean isTrue() { + Assert.assertTrue(true); + return true; + } +} + From 0f279582fd2cb30028c782568db64a3ad9f2f07c Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 13:19:36 +0530 Subject: [PATCH 15/24] gradle test fix --- go.mod | 5 ++--- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index f7ad0e21b..843a13a63 100644 --- a/go.mod +++ b/go.mod @@ -282,10 +282,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab -//replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20251210184507-0c8d138690cb -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251217164045-f03027bdbbb8 +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218073634-8b375bf5694f -replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251217110410-139203aa7c26 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251218072618-4df6c92720b6 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index 0f73a273d..2ef2d4424 100644 --- a/go.sum +++ b/go.sum @@ -1325,10 +1325,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251217110410-139203aa7c26 h1:1n+hPJGWJ8KDJsjeCbs3ob3b3S2E+6QzBAXT3mLShJQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251217110410-139203aa7c26/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251217164045-f03027bdbbb8 h1:7JGcT/xGaPeOKTeY5ZGovVjx8MSeWyUFuhIhXYA4OSA= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251217164045-f03027bdbbb8/go.mod h1:1z7CuujOoLOFhHzumSfs0epvxoSyDFqJlrmZJPv/IX0= +github.com/nitinp19/build-info-go v1.12.3-0.20251218072618-4df6c92720b6 h1:VipIoImKH1DWoyp9DcL5cewUWjXQwH0/CJ2olcx5ruU= +github.com/nitinp19/build-info-go v1.12.3-0.20251218072618-4df6c92720b6/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218073634-8b375bf5694f h1:5P5uVPbQPsl8aWRm+JQs/V0aYVeDKtKgJ/glIaJBg58= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218073634-8b375bf5694f/go.mod h1:LbtjtcxcKuOT8F3Dk2M1h1gZT+NW6jY2DU0k+AaUfYY= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= From 09a82df035b9aec3ece49722d8a9ec3a8a0f84df Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 13:22:32 +0530 Subject: [PATCH 16/24] rebasing --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index 2ef2d4424..30a7dc2dc 100644 --- a/go.sum +++ b/go.sum @@ -1214,8 +1214,6 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= github.com/jfrog/jfrog-cli-application v1.0.2-0.20251210075951-519050602a7f h1:YHwPNF13Gmt65J618kEGn/4SGewXqyYuAdcyYWYdrBA= github.com/jfrog/jfrog-cli-application v1.0.2-0.20251210075951-519050602a7f/go.mod h1:xum2HquWO5uExa/A7MQs3TgJJVEeoqTR+6Z4mfBr1Xw= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20251218044417-5113b260e416 h1:bCCsZ/2oVgcxeWVgUG8K0bE1I7JFZ+O6CISzwwEfrV8= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20251218044417-5113b260e416/go.mod h1:7cCaRhXorlbyXZgiW5bplCExFxlnROaG21K12d8inpQ= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251210085744-f8481d179ac5 h1:GYE67ubwl+ZRw3CcXFUi49EwwQp6k+qS8sX0QuHDHO8= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251210085744-f8481d179ac5/go.mod h1:BMoGi2rG0udCCeaghqlNgiW3fTmT+TNnfTnBoWFYgcg= github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251204144808-73fa744851c0 h1:8S1vE1PeVtrzWkKL0N39cX6XLLNV0It+f6xjRKjw7Ug= From 46c6a7602d2f633f67ca7689b503c344c9f3f2f4 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 13:26:26 +0530 Subject: [PATCH 17/24] Delete testdata/gradle/gradleproject/build/libs/minimal-example-1.0.jar --- .../build/libs/minimal-example-1.0.jar | Bin 743 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 testdata/gradle/gradleproject/build/libs/minimal-example-1.0.jar diff --git a/testdata/gradle/gradleproject/build/libs/minimal-example-1.0.jar b/testdata/gradle/gradleproject/build/libs/minimal-example-1.0.jar deleted file mode 100644 index 1d6a7749b1289ad0bb76a5df61ae040d8583738f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743 zcmWIWW@h1HVBp|j(2k!J%>V>UAOZ+Df!NnI#8KDN&rP41Apk|;rh2A#(m(~0KrDi+ z(AUw=)6F$FM9$QFt15_jQ+eY!qwhcQ zqXt{FX09mFe19myT{SRr-;_ev?$f6iU9b#vx;i~gZNAPj#=Z+n-`~2-xH)*mt}C8S zZa1v!*sE91{~a=S)|=$!Ro6KbHh6kSC$Ba=AGP_g{e_3?v$rd3nL7Eg{=rD~oa?6! z>IZl;GKnzbj$lyGGcX7+ymbW8@aRU@h92D@#UQYxQ4>hQwIM}5x(OiFu#^RgV+a6Q pTn1#qVjNu;dW^&LEoq#Gqzfhf1H4(;K+0Hv@Dq@}4@@i!3;-&#+_wM# From e0d9e186ba64313c041a7edfe0336d7beba7c172 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 13:44:18 +0530 Subject: [PATCH 18/24] fixing the test case --- gradle_test.go | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/gradle_test.go b/gradle_test.go index acae7d2e9..d07b786ff 100644 --- a/gradle_test.go +++ b/gradle_test.go @@ -845,12 +845,20 @@ func TestGradleBuildWithFlexPackKotlinDSL(t *testing.T) { } func createGradleProject(t *testing.T, projectName string) string { - srcBuildFile := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName, "build.gradle") - buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, "") + // Copy the entire project directory including source files + projectSrc := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName) + projectTarget := filepath.Join(tests.Temp, projectName) + err := io.CopyDir(projectSrc, projectTarget, true, nil) assert.NoError(t, err) - srcSettingsFile := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName, "settings.gradle") - _, err = tests.ReplaceTemplateVariables(srcSettingsFile, "") + // Replace template variables in build.gradle + srcBuildFile := filepath.Join(projectTarget, "build.gradle") + buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, projectTarget) + assert.NoError(t, err) + + // Replace template variables in settings.gradle + srcSettingsFile := filepath.Join(projectTarget, "settings.gradle") + _, err = tests.ReplaceTemplateVariables(srcSettingsFile, projectTarget) assert.NoError(t, err) return buildGradlePath @@ -858,12 +866,20 @@ func createGradleProject(t *testing.T, projectName string) string { // createGradleProjectKotlin creates a Kotlin DSL gradle project for testing func createGradleProjectKotlin(t *testing.T, projectName string) string { - srcBuildFile := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName, "build.gradle.kts") - buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, "") + // Copy the entire project directory including source files + projectSrc := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName) + projectTarget := filepath.Join(tests.Temp, projectName) + err := io.CopyDir(projectSrc, projectTarget, true, nil) + assert.NoError(t, err) + + // Replace template variables in build.gradle.kts + srcBuildFile := filepath.Join(projectTarget, "build.gradle.kts") + buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, projectTarget) assert.NoError(t, err) - srcSettingsFile := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName, "settings.gradle.kts") - _, err = tests.ReplaceTemplateVariables(srcSettingsFile, "") + // Replace template variables in settings.gradle.kts + srcSettingsFile := filepath.Join(projectTarget, "settings.gradle.kts") + _, err = tests.ReplaceTemplateVariables(srcSettingsFile, projectTarget) assert.NoError(t, err) return buildGradlePath From 43b4628b63ca47a32ae1758f2e00b9f7d590fbc5 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 14:22:41 +0530 Subject: [PATCH 19/24] adding test case --- .../src/main/java/example/Example.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/testdata/gradle/gradleproject/src/main/java/example/Example.java b/testdata/gradle/gradleproject/src/main/java/example/Example.java index b82e7d562..9827ad7d5 100644 --- a/testdata/gradle/gradleproject/src/main/java/example/Example.java +++ b/testdata/gradle/gradleproject/src/main/java/example/Example.java @@ -1,14 +1,19 @@ package example; -import org.junit.Assert; - /** - * Simple example class that uses JUnit to ensure the dependency is resolved. + * Simple example class for the gradle test project. + * Note: We intentionally don't use JUnit here because dependency resolution + * may not work when the JFrog Gradle plugin configures the resolver to use + * the test Artifactory repository (which may not have JUnit cached). */ public class Example { public boolean isTrue() { - Assert.assertTrue(true); return true; } + + public static void main(String[] args) { + Example example = new Example(); + System.out.println("Example.isTrue() = " + example.isTrue()); + } } From 8a4ebfa651a2205909d82e43cfb7782659af0d87 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 14:55:50 +0530 Subject: [PATCH 20/24] compacting gradle test file --- buildtools/cli.go | 6 +- gradle_test.go | 353 +++++----------------------------------------- main_test.go | 4 +- 3 files changed, 38 insertions(+), 325 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index eb01c7848..18be55f9c 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -700,10 +700,6 @@ func GradleCmd(c *cli.Context) (err error) { return cliutils.WrongNumberOfArgumentsHandler(c) } args := cliutils.ExtractCommand(c) - args, serverDetails, err := resolveServer(args) - if err != nil { - return err - } filteredGradleArgs, buildConfiguration, err := build.ExtractBuildDetailsFromArgs(args) if err != nil { return err @@ -735,7 +731,7 @@ func GradleCmd(c *cli.Context) (err error) { return err } printDeploymentView := log.IsStdErrTerminal() - gradleCmd := gradle.NewGradleCommand().SetConfiguration(buildConfiguration).SetTasks(filteredGradleArgs).SetConfigPath(configFilePath).SetThreads(threads).SetDetailedSummary(detailedSummary || printDeploymentView).SetXrayScan(xrayScan).SetScanOutputFormat(scanOutputFormat).SetServerDetails(serverDetails) + gradleCmd := gradle.NewGradleCommand().SetConfiguration(buildConfiguration).SetTasks(filteredGradleArgs).SetConfigPath(configFilePath).SetThreads(threads).SetDetailedSummary(detailedSummary || printDeploymentView).SetXrayScan(xrayScan).SetScanOutputFormat(scanOutputFormat) err = commands.Exec(gradleCmd) result := gradleCmd.Result() defer cliutils.CleanupResult(result, &err) diff --git a/gradle_test.go b/gradle_test.go index d07b786ff..bbdd319bd 100644 --- a/gradle_test.go +++ b/gradle_test.go @@ -333,220 +333,21 @@ func TestGradleBuildWithFlexPackBuildInfo(t *testing.T) { assert.Equal(t, buildinfo.Gradle, module.Type, "Module type should be Gradle") assert.NotEmpty(t, module.Id, "Module should have ID") - // FlexPack should collect dependencies - if len(module.Dependencies) > 0 { - // Validate dependency structure - for _, dep := range module.Dependencies { - assert.NotEmpty(t, dep.Id, "Dependency should have ID") - // FlexPack should provide checksums - hasChecksum := dep.Sha1 != "" || dep.Sha256 != "" || dep.Md5 != "" - assert.True(t, hasChecksum, "Dependency %s should have at least one checksum", dep.Id) - } + // FlexPack should collect dependencies with scopes and checksums. + assert.NotEmpty(t, module.Dependencies, "FlexPack build info should include dependencies") + for _, dep := range module.Dependencies { + assert.NotEmpty(t, dep.Id, "Dependency should have ID") + // FlexPack should provide checksums + hasChecksum := dep.Sha1 != "" || dep.Sha256 != "" || dep.Md5 != "" + assert.True(t, hasChecksum, "Dependency %s should have at least one checksum", dep.Id) + // FlexPack should provide scopes (Gradle configurations) + assert.NotEmpty(t, dep.Scopes, "Dependency %s should have scopes/configurations", dep.Id) } } cleanGradleTest(t) } -// TestGradleBuildWithFlexPackAndPublish tests Gradle publish with JFROG_RUN_NATIVE=true -func TestGradleBuildWithFlexPackAndPublish(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack publish test") - } - - buildGradlePath := createGradleProject(t, "gradleproject") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - buildName := tests.GradleBuildName + "-flexpack-publish" - buildNumber := "1" - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle with publish task (FlexPack mode - no config file) - // This tests that FlexPack correctly handles publish/artifactoryPublish tasks - err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "publish", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) - if err != nil { - // Publish may fail if not properly configured - that's OK for this test - // The important thing is that FlexPack mode was activated - t.Logf("Gradle publish command returned error (may be expected if publish not configured): %v", err) - } - - cleanGradleTest(t) -} - -// TestGradleBuildWithFlexPackFullValidation is the native equivalent of TestGradleBuildWithServerID -// It validates complete build info structure including module type validation -func TestGradleBuildWithFlexPackFullValidation(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack full validation test") - } - - buildGradlePath := createGradleProject(t, "gradleproject") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - buildName := tests.GradleBuildName + "-flexpack-full" - buildNumber := "1" - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle build with build info collection (FlexPack mode - no config file) - err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) - assert.NoError(t, err) - - // Publish build info - assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) - - // Validate build info was created - publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) - if err != nil { - assert.NoError(t, err) - return - } - if !found { - assert.True(t, found, "build info was expected to be found") - return - } - - // Validate build info structure - FlexPack collects dependencies only (no artifacts without deployment) - buildInfo := publishedBuildInfo.BuildInfo - assert.NotEmpty(t, buildInfo.Modules, "Build info should have modules") - if len(buildInfo.Modules) > 0 { - module := buildInfo.Modules[0] - // Validate module type is Gradle - assert.Equal(t, buildinfo.Gradle, module.Type, "Module type should be Gradle") - assert.NotEmpty(t, module.Id, "Module should have ID") - } - - cleanGradleTest(t) -} - -// TestGradleBuildWithFlexPackMultipleTasks tests FlexPack with multiple Gradle tasks -// Similar to how traditional tests run "clean artifactoryPublish" -func TestGradleBuildWithFlexPackMultipleTasks(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack multiple tasks test") - } - - buildGradlePath := createGradleProject(t, "gradleproject") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - buildName := tests.GradleBuildName + "-flexpack-multi" - buildNumber := "1" - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle with multiple tasks (FlexPack mode) - err := runJfrogCliWithoutAssertion("gradle", "clean", "compileJava", "test", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) - assert.NoError(t, err) - - // Publish build info - assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) - - // Validate build info was created - publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) - if err != nil { - assert.NoError(t, err) - return - } - if !found { - assert.True(t, found, "build info was expected to be found") - return - } - - // Validate build info structure - assert.NotEmpty(t, publishedBuildInfo.BuildInfo.Modules, "Build info should have modules") - - cleanGradleTest(t) -} - -// TestGradleBuildWithFlexPackNoBuildInfo tests FlexPack without build info collection -// This is the native equivalent of running gradle without --build-name/--build-number -func TestGradleBuildWithFlexPackNoBuildInfo(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack no build info test") - } - - buildGradlePath := createGradleProject(t, "gradleproject") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle without build info flags (FlexPack mode - just execute gradle) - err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath) - assert.NoError(t, err) - - cleanGradleTest(t) -} - -// TestGradleBuildWithFlexPackTestTask tests 'jf gradle test' with JFROG_RUN_NATIVE=true -func TestGradleBuildWithFlexPackTestTask(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack test task test") - } - - buildGradlePath := createGradleProject(t, "gradleproject") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - buildName := tests.GradleBuildName + "-flexpack-test" - buildNumber := "1" - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle test task (FlexPack mode) - err := runJfrogCliWithoutAssertion("gradle", "clean", "test", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) - // Test may fail if no tests exist, but command should execute - if err != nil { - t.Logf("Gradle test command returned error (may be expected if no tests exist): %v", err) - } - - cleanGradleTest(t) -} - // TestGradleBuildWithFlexPackEnvVars tests build info collection using JFROG_CLI_BUILD_NAME and JFROG_CLI_BUILD_NUMBER func TestGradleBuildWithFlexPackEnvVars(t *testing.T) { initGradleTest(t) @@ -632,113 +433,6 @@ func TestGradleBuildWithFlexPackInvalidArgs(t *testing.T) { cleanGradleTest(t) } -// TestGradleBuildWithFlexPackDependencySHA validates that dependency SHA checksums are collected -func TestGradleBuildWithFlexPackDependencySHA(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack dependency SHA test") - } - - buildGradlePath := createGradleProject(t, "gradleproject") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - buildName := tests.GradleBuildName + "-flexpack-sha" - buildNumber := "1" - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle build - err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) - assert.NoError(t, err) - - // Publish build info - assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) - - // Validate build info was created - publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) - if err != nil { - assert.NoError(t, err) - return - } - if !found { - assert.True(t, found, "build info was expected to be found") - return - } - - // Validate that dependencies have SHA checksums - assert.NotEmpty(t, publishedBuildInfo.BuildInfo.Modules, "Build info should have modules") - for _, module := range publishedBuildInfo.BuildInfo.Modules { - for _, dep := range module.Dependencies { - // FlexPack should provide at least one SHA checksum - hasSHA := dep.Sha1 != "" || dep.Sha256 != "" - assert.True(t, hasSHA, "Dependency %s should have SHA1 or SHA256 checksum", dep.Id) - } - } - - cleanGradleTest(t) -} - -// TestGradleBuildWithFlexPackDependencyScope validates that dependency scopes/configurations are collected -func TestGradleBuildWithFlexPackDependencyScope(t *testing.T) { - initGradleTest(t) - - // Check if Gradle is available in the environment - if _, err := exec.LookPath("gradle"); err != nil { - t.Skip("Gradle not found in PATH, skipping Gradle FlexPack dependency scope test") - } - - buildGradlePath := createGradleProject(t, "gradleproject") - oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) - defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) - - buildName := tests.GradleBuildName + "-flexpack-scope" - buildNumber := "1" - - // Set environment for native FlexPack implementation - setEnvCallBack := clientTestUtils.SetEnvWithCallbackAndAssert(t, "JFROG_RUN_NATIVE", "true") - defer setEnvCallBack() - - // Windows compatibility - buildGradlePath = strings.ReplaceAll(buildGradlePath, `\`, "/") - - // Run gradle build - err := runJfrogCliWithoutAssertion("gradle", "clean", "build", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) - assert.NoError(t, err) - - // Publish build info - assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) - - // Validate build info was created - publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) - if err != nil { - assert.NoError(t, err) - return - } - if !found { - assert.True(t, found, "build info was expected to be found") - return - } - - // Validate that dependencies have scopes - assert.NotEmpty(t, publishedBuildInfo.BuildInfo.Modules, "Build info should have modules") - for _, module := range publishedBuildInfo.BuildInfo.Modules { - for _, dep := range module.Dependencies { - // FlexPack should collect scopes (Gradle configurations) - assert.NotEmpty(t, dep.Scopes, "Dependency %s should have scopes/configurations", dep.Id) - } - } - - cleanGradleTest(t) -} - // TestGradleBuildWithFlexPackFallback verifies that gradle falls back to traditional approach // when JFROG_RUN_NATIVE is not set (covered by existing traditional tests, this is explicit verification) func TestGradleBuildWithFlexPackFallback(t *testing.T) { @@ -848,18 +542,29 @@ func createGradleProject(t *testing.T, projectName string) string { // Copy the entire project directory including source files projectSrc := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName) projectTarget := filepath.Join(tests.Temp, projectName) - err := io.CopyDir(projectSrc, projectTarget, true, nil) + // Use absolute paths to avoid issues when tests change working directory and pass relative -b flags. + // (e.g. running from tmp/gradleproject and passing -btmp/gradleproject/build.gradle results in duplicated paths) + var err error + projectTarget, err = filepath.Abs(projectTarget) + assert.NoError(t, err) + err = io.CopyDir(projectSrc, projectTarget, true, nil) assert.NoError(t, err) // Replace template variables in build.gradle srcBuildFile := filepath.Join(projectTarget, "build.gradle") buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, projectTarget) assert.NoError(t, err) + buildGradlePath, err = filepath.Abs(buildGradlePath) + assert.NoError(t, err) + assert.FileExists(t, buildGradlePath) // Replace template variables in settings.gradle srcSettingsFile := filepath.Join(projectTarget, "settings.gradle") - _, err = tests.ReplaceTemplateVariables(srcSettingsFile, projectTarget) + settingsPath, err := tests.ReplaceTemplateVariables(srcSettingsFile, projectTarget) assert.NoError(t, err) + settingsPath, err = filepath.Abs(settingsPath) + assert.NoError(t, err) + assert.FileExists(t, settingsPath) return buildGradlePath } @@ -869,18 +574,28 @@ func createGradleProjectKotlin(t *testing.T, projectName string) string { // Copy the entire project directory including source files projectSrc := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "gradle", projectName) projectTarget := filepath.Join(tests.Temp, projectName) - err := io.CopyDir(projectSrc, projectTarget, true, nil) + // Use absolute paths to avoid issues when tests change working directory and pass relative -b flags. + var err error + projectTarget, err = filepath.Abs(projectTarget) + assert.NoError(t, err) + err = io.CopyDir(projectSrc, projectTarget, true, nil) assert.NoError(t, err) // Replace template variables in build.gradle.kts srcBuildFile := filepath.Join(projectTarget, "build.gradle.kts") buildGradlePath, err := tests.ReplaceTemplateVariables(srcBuildFile, projectTarget) assert.NoError(t, err) + buildGradlePath, err = filepath.Abs(buildGradlePath) + assert.NoError(t, err) + assert.FileExists(t, buildGradlePath) // Replace template variables in settings.gradle.kts srcSettingsFile := filepath.Join(projectTarget, "settings.gradle.kts") - _, err = tests.ReplaceTemplateVariables(srcSettingsFile, projectTarget) + settingsPath, err := tests.ReplaceTemplateVariables(srcSettingsFile, projectTarget) + assert.NoError(t, err) + settingsPath, err = filepath.Abs(settingsPath) assert.NoError(t, err) + assert.FileExists(t, settingsPath) return buildGradlePath } diff --git a/main_test.go b/main_test.go index 4d396585e..3921882b6 100644 --- a/main_test.go +++ b/main_test.go @@ -263,8 +263,10 @@ func createConfigFile(inDir, configFilePath string, t *testing.T) { if _, err := os.Stat(inDir); os.IsNotExist(err) { assert.NoError(t, os.MkdirAll(inDir, 0o777)) } - _, err := tests.ReplaceTemplateVariables(configFilePath, inDir) + createdPath, err := tests.ReplaceTemplateVariables(configFilePath, inDir) assert.NoError(t, err) + // Fail early with a descriptive error if the config file wasn't actually created. + assert.FileExists(t, createdPath) } // Validate that all CLI commands' aliases are unique, and that two commands don't use the same alias. From fe7f12aea824736e78ab7aa16dde10365c99e806 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 15:15:03 +0530 Subject: [PATCH 21/24] path passing --- gradle_test.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gradle_test.go b/gradle_test.go index bbdd319bd..5c519ac38 100644 --- a/gradle_test.go +++ b/gradle_test.go @@ -430,7 +430,9 @@ func TestGradleBuildWithFlexPackInvalidArgs(t *testing.T) { err = runJfrogCliWithoutAssertion("gradle", "build", "--invalid-option-xyz", "-b"+buildGradlePath) assert.Error(t, err, "Gradle should fail with invalid option") - cleanGradleTest(t) + // This test intentionally fails before any deployment/build-info publish. + clientTestUtils.UnSetEnvAndAssert(t, coreutils.HomeDir) + tests.CleanFileSystem() } // TestGradleBuildWithFlexPackFallback verifies that gradle falls back to traditional approach @@ -557,6 +559,8 @@ func createGradleProject(t *testing.T, projectName string) string { buildGradlePath, err = filepath.Abs(buildGradlePath) assert.NoError(t, err) assert.FileExists(t, buildGradlePath) + // Gradle accepts forward slashes on all platforms, and this avoids Windows path edge-cases. + buildGradlePath = filepath.ToSlash(buildGradlePath) // Replace template variables in settings.gradle srcSettingsFile := filepath.Join(projectTarget, "settings.gradle") @@ -588,6 +592,8 @@ func createGradleProjectKotlin(t *testing.T, projectName string) string { buildGradlePath, err = filepath.Abs(buildGradlePath) assert.NoError(t, err) assert.FileExists(t, buildGradlePath) + // Gradle accepts forward slashes on all platforms, and this avoids Windows path edge-cases. + buildGradlePath = filepath.ToSlash(buildGradlePath) // Replace template variables in settings.gradle.kts srcSettingsFile := filepath.Join(projectTarget, "settings.gradle.kts") From 1fc5d85f2eb154f6766770a69fc493df4b16e612 Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 15:30:51 +0530 Subject: [PATCH 22/24] catching gradle cmd output --- gradle_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gradle_test.go b/gradle_test.go index 5c519ac38..2e3e35b54 100644 --- a/gradle_test.go +++ b/gradle_test.go @@ -15,6 +15,7 @@ import ( coretests "github.com/jfrog/jfrog-cli-core/v2/utils/tests" "github.com/jfrog/jfrog-client-go/http/httpclient" "github.com/stretchr/testify/require" + urfavecli "github.com/urfave/cli" "github.com/jfrog/jfrog-cli/utils/cliutils" "github.com/jfrog/jfrog-client-go/utils/log" @@ -411,6 +412,11 @@ func TestGradleBuildWithFlexPackInvalidArgs(t *testing.T) { t.Skip("Gradle not found in PATH, skipping Gradle FlexPack invalid args test") } + // The CLI uses urfave/cli, which may call os.Exit(1) for ExitError (e.g., external tool exit code). + origOsExiter := urfavecli.OsExiter + urfavecli.OsExiter = func(code int) {} + defer func() { urfavecli.OsExiter = origOsExiter }() + buildGradlePath := createGradleProject(t, "gradleproject") oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) From 81e6ddfab1ecb8804c849421de6897bf03f8685e Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 16:54:35 +0530 Subject: [PATCH 23/24] fixing test case to be compatible with 8+ --- gradle_test.go | 8 +++-- inttestutils/artifactory.go | 31 ++++++++++++++----- testdata/gradle/gradleproject/build.gradle | 16 ++++++++++ .../gradle/projectwithplugin/build.gradle | 16 ++++++++++ 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/gradle_test.go b/gradle_test.go index 2e3e35b54..5275bb70e 100644 --- a/gradle_test.go +++ b/gradle_test.go @@ -453,6 +453,12 @@ func TestGradleBuildWithFlexPackFallback(t *testing.T) { configFilePath := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "buildspecs", tests.GradleConfig) destPath := filepath.Join(filepath.Dir(buildGradlePath), ".jfrog", "projects") createConfigFile(destPath, configFilePath, t) + + // Create the search spec before changing the working directory. + // tests.GetTestResourcesPath() is relative ("testdata"), so creating the spec after chdir may fail on CI. + searchSpec, err := tests.CreateSpec(tests.SearchAllGradle) + require.NoError(t, err) + oldHomeDir := changeWD(t, filepath.Dir(buildGradlePath)) defer clientTestUtils.ChangeDirAndAssert(t, oldHomeDir) @@ -466,8 +472,6 @@ func TestGradleBuildWithFlexPackFallback(t *testing.T) { runJfrogCli(t, "gradle", "clean", "artifactoryPublish", "-b"+buildGradlePath, "--build-name="+buildName, "--build-number="+buildNumber) // Validate artifacts were deployed (traditional approach deploys to Artifactory) - searchSpec, err := tests.CreateSpec(tests.SearchAllGradle) - assert.NoError(t, err) inttestutils.VerifyExistInArtifactory(tests.GetGradleDeployedArtifacts(), searchSpec, serverDetails, t) cleanGradleTest(t) diff --git a/inttestutils/artifactory.go b/inttestutils/artifactory.go index 29d6a5481..1448a4c99 100644 --- a/inttestutils/artifactory.go +++ b/inttestutils/artifactory.go @@ -9,6 +9,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli/utils/tests" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) // Verify the input slice exist in Artifactory @@ -17,23 +18,39 @@ import ( // serverDetails - Target Artifactory server details // t - Tests object func VerifyExistInArtifactory(expected []string, specFile string, serverDetails *config.ServerDetails, t *testing.T) { - results, _ := SearchInArtifactory(specFile, serverDetails, t) + results, err := SearchInArtifactory(specFile, serverDetails, t) + require.NoError(t, err) tests.CompareExpectedVsActual(expected, results, t) } func SearchInArtifactory(specFile string, serverDetails *config.ServerDetails, t *testing.T) ([]utils.SearchResult, error) { - searchSpec, _ := spec.CreateSpecFromFile(specFile, nil) + searchSpec, err := spec.CreateSpecFromFile(specFile, nil) + if err != nil { + return nil, err + } + if searchSpec == nil { + return nil, assert.AnError + } searchCmd := generic.NewSearchCommand() searchCmd.SetServerDetails(serverDetails).SetSpec(searchSpec) reader, err := searchCmd.Search() - assert.NoError(t, err) + if err != nil { + return nil, err + } var resultItems []utils.SearchResult readerNoDate, err := utils.SearchResultNoDate(reader) - assert.NoError(t, err) + if err != nil { + _ = reader.Close() + return nil, err + } for searchResult := new(utils.SearchResult); readerNoDate.NextRecord(searchResult) == nil; searchResult = new(utils.SearchResult) { resultItems = append(resultItems, *searchResult) } - assert.NoError(t, reader.Close(), "Couldn't close reader") - assert.NoError(t, reader.GetError(), "Couldn't get reader error") - return resultItems, err + if cerr := reader.Close(); cerr != nil { + return resultItems, cerr + } + if rerr := reader.GetError(); rerr != nil { + return resultItems, rerr + } + return resultItems, nil } diff --git a/testdata/gradle/gradleproject/build.gradle b/testdata/gradle/gradleproject/build.gradle index 55a0d6e90..cd34354f7 100644 --- a/testdata/gradle/gradleproject/build.gradle +++ b/testdata/gradle/gradleproject/build.gradle @@ -5,6 +5,22 @@ repositories { mavenCentral() } +// Gradle 8+ blocks http:// repositories unless allowInsecureProtocol=true is set. +// The JFrog Gradle integration (traditional extractor flow) may add an Artifactory resolver repo using http://localhost in tests. +// This block is safe across Gradle versions because it checks for the property before setting it. +allprojects { + repositories.all { repo -> + try { + def urlStr = repo.respondsTo('getUrl') && repo.url != null ? repo.url.toString() : "" + if (urlStr.startsWith("http://") && repo.hasProperty("allowInsecureProtocol")) { + repo.allowInsecureProtocol = true + } + } catch (Throwable ignored) { + // Best-effort; ignore repositories that don't support URL/allowInsecureProtocol. + } + } +} + dependencies { implementation "junit:junit:4.7" } diff --git a/testdata/gradle/projectwithplugin/build.gradle b/testdata/gradle/projectwithplugin/build.gradle index d06c9fa99..796fcb9b3 100644 --- a/testdata/gradle/projectwithplugin/build.gradle +++ b/testdata/gradle/projectwithplugin/build.gradle @@ -11,6 +11,22 @@ apply plugin: 'idea' apply plugin: 'com.jfrog.artifactory' apply plugin: 'maven-publish' +// Gradle 8+ blocks http:// repositories unless allowInsecureProtocol=true is set. +// The JFrog Gradle integration / Artifactory plugin may add an Artifactory resolver repo using http://localhost in tests. +// This block is safe across Gradle versions because it checks for the property before setting it. +allprojects { + repositories.all { repo -> + try { + def urlStr = repo.respondsTo('getUrl') && repo.url != null ? repo.url.toString() : "" + if (urlStr.startsWith("http://") && repo.hasProperty("allowInsecureProtocol")) { + repo.allowInsecureProtocol = true + } + } catch (Throwable ignored) { + // Best-effort; ignore repositories that don't support URL/allowInsecureProtocol. + } + } +} + version = 1.0 task initProject(description: 'Initialize project directory structure.') { doLast { From 937061ad5aaef57a6ab5d2eb830bc0ce142e633f Mon Sep 17 00:00:00 2001 From: nitinp19 Date: Thu, 18 Dec 2025 19:00:16 +0530 Subject: [PATCH 24/24] adding depen --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 843a13a63..e7982dd47 100644 --- a/go.mod +++ b/go.mod @@ -282,9 +282,9 @@ replace github.com/docker/docker => github.com/docker/docker v27.5.1+incompatibl replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab -replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218073634-8b375bf5694f +replace github.com/jfrog/jfrog-cli-artifactory => github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218130310-3bde47e0f6e2 -replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251218072618-4df6c92720b6 +replace github.com/jfrog/build-info-go => github.com/nitinp19/build-info-go v1.12.3-0.20251218125859-b4b775c8b360 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/reshmifrog/jfrog-cli-core/v2 v2.58.5-0.20251110095124-ab9a4102ec5a diff --git a/go.sum b/go.sum index 30a7dc2dc..c1b24cf19 100644 --- a/go.sum +++ b/go.sum @@ -1323,10 +1323,10 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nitinp19/build-info-go v1.12.3-0.20251218072618-4df6c92720b6 h1:VipIoImKH1DWoyp9DcL5cewUWjXQwH0/CJ2olcx5ruU= -github.com/nitinp19/build-info-go v1.12.3-0.20251218072618-4df6c92720b6/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218073634-8b375bf5694f h1:5P5uVPbQPsl8aWRm+JQs/V0aYVeDKtKgJ/glIaJBg58= -github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218073634-8b375bf5694f/go.mod h1:LbtjtcxcKuOT8F3Dk2M1h1gZT+NW6jY2DU0k+AaUfYY= +github.com/nitinp19/build-info-go v1.12.3-0.20251218125859-b4b775c8b360 h1:9XxSgWkh9gr9GALi0NHDlfU7kpVUtLbsYhsUG59/N5E= +github.com/nitinp19/build-info-go v1.12.3-0.20251218125859-b4b775c8b360/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218130310-3bde47e0f6e2 h1:HjiGdPDAl0Q79ZMUmA7YpBOkAZylVa3MvpFm24VWlcM= +github.com/nitinp19/jfrog-cli-artifactory v0.0.0-20251218130310-3bde47e0f6e2/go.mod h1:iMc/mGpwoCYc+9+0GwfpnNKH+RpOrUb7FSLeckVjFZQ= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=