Skip to content

Commit 0286a81

Browse files
authored
Fix rbc command to accept project with no spec (#2884)
1 parent 6a8f88e commit 0286a81

File tree

4 files changed

+98
-12
lines changed

4 files changed

+98
-12
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ require (
191191

192192
replace github.com/jfrog/jfrog-cli-artifactory => github.com/jfrog/jfrog-cli-artifactory v0.1.13-0.20250221101554-05889536ad05
193193

194-
replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250226093426-131ae1505b58
194+
replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250226094621-9317a4bcdfc4
195195

196-
replace github.com/jfrog/build-info-go => github.com/fluxxBot/build-info-go v1.8.9-0.20250203111011-4ff16d3d42be
196+
replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20250226102210-d57860372195
197197

198198
replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250221062042-87cb5136765e

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@ github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
9292
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
9393
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
9494
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
95-
github.com/fluxxBot/build-info-go v1.8.9-0.20250203111011-4ff16d3d42be h1:K9d43ZYkRj9Y0XI78KZvHlCWdZ7O24np+Xv9C7PKJwk=
96-
github.com/fluxxBot/build-info-go v1.8.9-0.20250203111011-4ff16d3d42be/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
9795
github.com/forPelevin/gomoji v1.2.0 h1:9k4WVSSkE1ARO/BWywxgEUBvR/jMnao6EZzrql5nxJ8=
9896
github.com/forPelevin/gomoji v1.2.0/go.mod h1:8+Z3KNGkdslmeGZBC3tCrwMrcPy5GRzAD+gL9NAwMXg=
9997
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
@@ -177,6 +175,8 @@ github.com/jedib0t/go-pretty/v6 v6.6.5 h1:9PgMJOVBedpgYLI56jQRJYqngxYAAzfEUua+3N
177175
github.com/jedib0t/go-pretty/v6 v6.6.5/go.mod h1:Uq/HrbhuFty5WSVNfjpQQe47x16RwVGXIveNGEyGtHs=
178176
github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI=
179177
github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw=
178+
github.com/jfrog/build-info-go v1.8.9-0.20250226102210-d57860372195 h1:rH+VDEIBZt5jTx0KYuMINYQwEMzhJFgY0Fr/0w+aLtI=
179+
github.com/jfrog/build-info-go v1.8.9-0.20250226102210-d57860372195/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
180180
github.com/jfrog/froggit-go v1.16.2 h1:F//S83iXH14qsCwYzv0zB2JtjS2pJVEsUoEmYA+37dQ=
181181
github.com/jfrog/froggit-go v1.16.2/go.mod h1:5VpdQfAcbuyFl9x/x8HGm7kVk719kEtW/8YJFvKcHPA=
182182
github.com/jfrog/go-mockhttp v0.3.1 h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8=
@@ -187,8 +187,8 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL
187187
github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w=
188188
github.com/jfrog/jfrog-cli-artifactory v0.1.13-0.20250221101554-05889536ad05 h1:UV9W1ZImGWLks4+w+zg9hMtySvEIU+WxO73lsO6NIyY=
189189
github.com/jfrog/jfrog-cli-artifactory v0.1.13-0.20250221101554-05889536ad05/go.mod h1:223EqxDx7Ogrj7zJZkKAoFuQJStC5qtPXjwsf+r6d/A=
190-
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250226093426-131ae1505b58 h1:r8aE1Amm8CLbMLMCbNhivs7WqhoLlj+cBhzStohBYOU=
191-
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250226093426-131ae1505b58/go.mod h1:8uzry1RGoxmw2aeJVE/8kLIFTXCE23ApLUNRUGFRu90=
190+
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250226094621-9317a4bcdfc4 h1:MyrLOJQzdSENA1bEI4Dz7idpPv9i+MVkIcu94JH3vvw=
191+
github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250226094621-9317a4bcdfc4/go.mod h1:8uzry1RGoxmw2aeJVE/8kLIFTXCE23ApLUNRUGFRu90=
192192
github.com/jfrog/jfrog-cli-platform-services v1.7.0 h1:u0AOyG4JX3VT7xhEeA9gDpBgW8tYILONpQURtzR3FkI=
193193
github.com/jfrog/jfrog-cli-platform-services v1.7.0/go.mod h1:u3lMRG7XC8MeUy/OPkHkZnsgCMIi0br4sjk2/W1Pm8I=
194194
github.com/jfrog/jfrog-cli-security v1.15.0 h1:TYNIID231X/AivYtptDCF25JyH8qTQht6ISHRfwejL8=

lifecycle/cli.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ func getReleaseBundleCreationSpec(c *cli.Context) (*spec.SpecFiles, error) {
222222
buildNumber := getStringFlagOrEnv(c, cliutils.BuildNumber, coreutils.BuildNumber)
223223

224224
if buildName != "" && buildNumber != "" {
225-
return speccore.CreateSpecFromBuildNameAndNumber(buildName, buildNumber)
225+
return speccore.CreateSpecFromBuildNameNumberAndProject(buildName, buildNumber, cliutils.GetProject(c))
226226
}
227227

228228
return nil, fmt.Errorf("either the --spec flag must be provided, " +

lifecycle_test.go

Lines changed: 91 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,16 +218,27 @@ func uploadBuilds(t *testing.T) func() {
218218
}
219219
}
220220

221+
func uploadBuildsWithProject(t *testing.T) func() {
222+
uploadBuildWithArtifactsAndProject(t, tests.UploadDevSpecA, tests.LcBuildName1, number1, tests.ProjectKey)
223+
uploadBuildWithArtifactsAndProject(t, tests.UploadDevSpecB, tests.LcBuildName2, number2, tests.ProjectKey)
224+
uploadBuildWithDepsAndProject(t, tests.LcBuildName3, number3, tests.ProjectKey)
225+
return func() {
226+
inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.LcBuildName1, artHttpDetails)
227+
inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.LcBuildName2, artHttpDetails)
228+
inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.LcBuildName3, artHttpDetails)
229+
}
230+
}
231+
221232
func createRbBackwardCompatible(t *testing.T, specName, sourceOption, rbName, rbVersion string, sync bool) {
222233
specFile, err := getSpecFile(specName)
223234
assert.NoError(t, err)
224-
createRbWithFlags(t, specFile, sourceOption, "", "", rbName, rbVersion, sync, false)
235+
createRbWithFlags(t, specFile, sourceOption, "", "", rbName, rbVersion, "", sync, false)
225236
}
226237

227238
func createRbFromSpec(t *testing.T, specName, rbName, rbVersion string, sync bool, withoutSigningKey bool) {
228239
specFile, err := tests.CreateSpec(specName)
229240
assert.NoError(t, err)
230-
createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, sync, withoutSigningKey)
241+
createRbWithFlags(t, specFile, "spec", "", "", rbName, rbVersion, "", sync, withoutSigningKey)
231242
}
232243

233244
func TestCreateBundleWithoutSpec(t *testing.T) {
@@ -239,16 +250,34 @@ func TestCreateBundleWithoutSpec(t *testing.T) {
239250
deleteBuilds := uploadBuilds(t)
240251
defer deleteBuilds()
241252

242-
createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, false, false)
253+
createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, "", false, false)
243254
assertStatusCompleted(t, lcManager, tests.LcRbName1, number1, "")
244255
defer deleteReleaseBundle(t, lcManager, tests.LcRbName1, number1)
245256

246-
createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, false, true)
257+
createRbWithFlags(t, "", "", tests.LcBuildName2, number2, tests.LcRbName2, number2, "", false, true)
247258
assertStatusCompleted(t, lcManager, tests.LcRbName2, number2, "")
248259
defer deleteReleaseBundle(t, lcManager, tests.LcRbName2, number2)
249260
}
250261

251-
func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buildNumber, rbName, rbVersion string,
262+
func TestCreateBundleWithoutSpecAndWithProject(t *testing.T) {
263+
cleanCallback := initLifecycleTest(t, signingKeyOptionalArtifactoryMinVersion)
264+
defer cleanCallback()
265+
deleteProject := createTestProject(t)
266+
defer func() {
267+
if err := deleteProject(); err != nil {
268+
t.Error(err)
269+
}
270+
}()
271+
lcManager := getLcServiceManager(t)
272+
deleteBuilds := uploadBuildsWithProject(t)
273+
defer deleteBuilds()
274+
275+
createRbWithFlags(t, "", "", tests.LcBuildName1, number1, tests.LcRbName1, number1, tests.ProjectKey, false, false)
276+
assertStatusCompletedWithProject(t, lcManager, tests.LcRbName1, number1, "", tests.ProjectKey)
277+
defer deleteReleaseBundleWithProject(t, lcManager, tests.LcRbName1, number1, tests.ProjectKey)
278+
}
279+
280+
func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buildNumber, rbName, rbVersion, project string,
252281
sync, withoutSigningKey bool) {
253282
argsAndOptions := []string{
254283
"rbc",
@@ -273,6 +302,10 @@ func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buil
273302
argsAndOptions = append(argsAndOptions, getOption(cliutils.Sync, "true"))
274303
}
275304

305+
if project != "" {
306+
argsAndOptions = append(argsAndOptions, getOption(cliutils.Project, project))
307+
}
308+
276309
assert.NoError(t, lcCli.Exec(argsAndOptions...))
277310
}
278311

@@ -335,6 +368,15 @@ func assertStatusCompleted(t *testing.T, lcManager *lifecycle.LifecycleServicesM
335368
assert.Equal(t, services.Completed, resp.Status)
336369
}
337370

371+
// If createdMillis is provided, assert status for promotion. If blank, assert for creation.
372+
func assertStatusCompletedWithProject(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion, createdMillis, projectKey string) {
373+
resp, err := getStatusWithProject(lcManager, rbName, rbVersion, createdMillis, projectKey)
374+
if !assert.NoError(t, err) {
375+
return
376+
}
377+
assert.Equal(t, services.Completed, resp.Status)
378+
}
379+
338380
func getLcServiceManager(t *testing.T) *lifecycle.LifecycleServicesManager {
339381
lcManager, err := utils.CreateLifecycleServiceManager(lcDetails, false)
340382
assert.NoError(t, err)
@@ -371,6 +413,18 @@ func getStatus(lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion,
371413
return lcManager.GetReleaseBundlePromotionStatus(rbDetails, "", createdMillis, true)
372414
}
373415

416+
func getStatusWithProject(lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion, createdMillis, projectKey string) (services.ReleaseBundleStatusResponse, error) {
417+
rbDetails := services.ReleaseBundleDetails{
418+
ReleaseBundleName: rbName,
419+
ReleaseBundleVersion: rbVersion,
420+
}
421+
422+
if createdMillis == "" {
423+
return lcManager.GetReleaseBundleCreationStatus(rbDetails, projectKey, true)
424+
}
425+
return lcManager.GetReleaseBundlePromotionStatus(rbDetails, projectKey, createdMillis, true)
426+
}
427+
374428
func getReleaseBundleSpecification(lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) (services.ReleaseBundleSpecResponse, error) {
375429
rbDetails := services.ReleaseBundleDetails{
376430
ReleaseBundleName: rbName,
@@ -391,6 +445,17 @@ func deleteReleaseBundle(t *testing.T, lcManager *lifecycle.LifecycleServicesMan
391445
time.Sleep(5 * time.Second)
392446
}
393447

448+
func deleteReleaseBundleWithProject(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion, projectKey string) {
449+
rbDetails := services.ReleaseBundleDetails{
450+
ReleaseBundleName: rbName,
451+
ReleaseBundleVersion: rbVersion,
452+
}
453+
454+
assert.NoError(t, lcManager.DeleteReleaseBundleVersion(rbDetails, services.CommonOptionalQueryParams{Async: false, ProjectKey: projectKey}))
455+
// Wait after remote deleting. Can be removed once remote deleting supports sync.
456+
time.Sleep(5 * time.Second)
457+
}
458+
394459
/*
395460
func remoteDeleteReleaseBundle(t *testing.T, lcManager *lifecycle.LifecycleServicesManager, rbName, rbVersion string) {
396461
params := distribution.NewDistributeReleaseBundleParams(rbName, rbVersion)
@@ -428,6 +493,27 @@ func uploadBuildWithDeps(t *testing.T, buildName, buildNumber string) {
428493
runRt(t, "build-publish", buildName, buildNumber)
429494
}
430495

496+
func uploadBuildWithArtifactsAndProject(t *testing.T, specFileName, buildName, buildNumber, projectKey string) {
497+
specFile, err := tests.CreateSpec(specFileName)
498+
assert.NoError(t, err)
499+
500+
runRt(t, "upload", "--spec="+specFile, "--build-name="+buildName, "--build-number="+buildNumber, "--project="+projectKey)
501+
runRt(t, "build-publish", buildName, buildNumber, "--project="+projectKey)
502+
}
503+
504+
func uploadBuildWithDepsAndProject(t *testing.T, buildName, buildNumber, projectKey string) {
505+
err := fileutils.CreateDirIfNotExist(tests.Out)
506+
assert.NoError(t, err)
507+
508+
randFile, err := io.CreateRandFile(filepath.Join(tests.Out, "dep-file"), 1000)
509+
assert.NoError(t, err)
510+
511+
runRt(t, "upload", randFile.Name(), tests.RtDevRepo, "--flat", "--project="+projectKey)
512+
assert.NoError(t, lcCli.WithoutCredentials().Exec("rt", "bad", buildName, buildNumber, tests.RtDevRepo+"/dep-file", "--from-rt"))
513+
514+
runRt(t, "build-publish", buildName, buildNumber, "--project="+projectKey)
515+
}
516+
431517
func initLifecycleTest(t *testing.T, minVersion string) (cleanCallback func()) {
432518
if !*tests.TestLifecycle {
433519
t.Skip("Skipping lifecycle test. To run release bundle test add the '-test.lc=true' option.")

0 commit comments

Comments
 (0)