Skip to content

Commit 8eb9b69

Browse files
committed
Merge remote-tracking branch 'upstream/dev'
2 parents 8504708 + a1168ea commit 8eb9b69

8 files changed

Lines changed: 412 additions & 4 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Monitor Issues
2+
on:
3+
workflow_dispatch:
4+
inputs:
5+
operations-per-run:
6+
description: 'Number of operations per run'
7+
required: false
8+
default: '30'
9+
schedule:
10+
- cron: "0 0 * * *" # Runs once a day at midnight
11+
jobs:
12+
monitor-issues:
13+
runs-on: ubuntu-latest
14+
permissions:
15+
issues: write
16+
steps:
17+
- uses: actions/stale@v9
18+
with:
19+
# Ignore issues with these labels
20+
exempt-issue-labels: 'feature request,question'
21+
# Days of inactivity before marking an issue as stale
22+
days-before-issue-stale: 180
23+
# Days of inactivity before closing an issue
24+
days-before-issue-close: 7
25+
# Name of the stale label
26+
stale-issue-label: "stale"
27+
stale-issue-message: "This issue has been marked as stale due to 6 months of inactivity. As part of our effort to address every issue properly, please feel free to remove the stale label or keep this issue active by leaving a comment. Otherwise, it will be closed in 7 days"
28+
close-issue-message: "This issue was closed due to 7 days of inactivity after being marked as stale. Feel free to reopen it if it remains relevant."
29+
# Ignore pull requests
30+
days-before-pr-close: false
31+
days-before-pr-stale: false
32+
ascending: true
33+
# Get from input or resolve to default
34+
operations-per-run: ${{ github.event.inputs.operations-per-run || '30' }}
35+
repo-token: ${{ secrets.GITHUB_TOKEN }}

README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3003,6 +3003,43 @@ resp, err := serviceManager.RemoteDeleteReleaseBundle(params, dryRun)
30033003
exists, err := serviceManager.ReleaseBundleExists(rbName, rbVersion, projectKey)
30043004
```
30053005
3006+
#### Annotate Release Bundle
3007+
```go
3008+
rbDetails := ReleaseBundleDetails{"rbName", "rbVersion"}
3009+
queryParams := CommonOptionalQueryParams{}
3010+
queryParams.ProjectKey = "project"
3011+
3012+
cmd := NewReleaseBundleAnnotateCommand()
3013+
serverDetails := &config.ServerDetails{
3014+
ArtifactoryUrl: "https://artifactory.example.com",
3015+
}
3016+
cmd.SetServerDetails(serverDetails)
3017+
annotateParams := lifecycle.AnnotateOperationParams{
3018+
RbTag: lifecycle.RbAnnotationTag{
3019+
Tag: "bundle-tag",
3020+
Exist: true,
3021+
},
3022+
RbProps: lifecycle.RbAnnotationProps{
3023+
Properties:props.ToMap(),
3024+
Exists: false,
3025+
},
3026+
RbDelProps: services.RbDelProps{
3027+
Keys: "key1,key2",
3028+
Exist: false,
3029+
},
3030+
RbDetails: rbDetails,
3031+
QueryParams: queryParams,
3032+
PropertyParams: lifecycle.CommonPropParams{
3033+
Path: "manifest-path",
3034+
Recursive: false,
3035+
},
3036+
ArtifactoryUrl: services.ArtCommonParams{
3037+
Url: cmd.ServerDetails().ArtifactoryUrl,
3038+
},
3039+
}
3040+
3041+
resp, err := serviceManager.AnnotateReleaseBundle(params)
3042+
```
30063043
## Evidence APIs
30073044
30083045
### Creating Evidence Service Manager

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ require (
1010
github.com/golang-jwt/jwt/v4 v4.5.2
1111
github.com/gookit/color v1.5.4
1212
github.com/jfrog/archiver/v3 v3.6.1
13-
github.com/jfrog/build-info-go v1.10.10
13+
github.com/jfrog/build-info-go v1.10.11
1414
github.com/jfrog/gofrog v1.7.6
1515
github.com/minio/sha256-simd v1.0.1
1616
github.com/stretchr/testify v1.10.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl
5757
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
5858
github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI=
5959
github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw=
60-
github.com/jfrog/build-info-go v1.10.10 h1:2nOFjV7SX1uisi2rQK7fb4Evm7YkSOdmssrm6Tf4ipc=
61-
github.com/jfrog/build-info-go v1.10.10/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
60+
github.com/jfrog/build-info-go v1.10.11 h1:wAMGCAHa49+ec01HqzSidLAHNIub+glh4ksFp3pYy7o=
61+
github.com/jfrog/build-info-go v1.10.11/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
6262
github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s=
6363
github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4=
6464
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=

lifecycle/lifecycle_test.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package lifecycle
22

33
import (
44
"encoding/json"
5+
"fmt"
56
artifactoryAuth "github.com/jfrog/jfrog-client-go/artifactory/auth"
7+
"github.com/jfrog/jfrog-client-go/artifactory/services/utils"
68
"github.com/jfrog/jfrog-client-go/http/jfroghttpclient"
79
lifecycle "github.com/jfrog/jfrog-client-go/lifecycle/services"
810
"github.com/stretchr/testify/assert"
@@ -12,6 +14,11 @@ import (
1214
"time"
1315
)
1416

17+
const (
18+
rbManifestName = "release-bundle.json.evd"
19+
releaseBundlesV2 = "release-bundles-v2"
20+
)
21+
1522
var testRb = lifecycle.ReleaseBundleDetails{
1623
ReleaseBundleName: "bundle-test",
1724
ReleaseBundleVersion: "1.2.3",
@@ -285,3 +292,120 @@ func TestIsReleaseBundleExistWithProject(t *testing.T) {
285292
assert.NoError(t, err)
286293
assert.False(t, exist)
287294
}
295+
296+
func TestReleaseBundleAnnotate(t *testing.T) {
297+
mockServer, rbService := createMockServer(t, func(w http.ResponseWriter, r *http.Request) {
298+
if r.RequestURI == "/"+lifecycle.GetReleaseBundleSetTagApi(testRb) {
299+
w.WriteHeader(http.StatusOK)
300+
_, err := w.Write([]byte(`{
301+
{
302+
"repository_key": "release-bundles-v2",
303+
"release_bundle_name": "bundle-test",
304+
"release_bundle_version": "1.2.3",
305+
"release_bundle_tag" : "bundle-tag"
306+
}
307+
}`))
308+
assert.NoError(t, err)
309+
}
310+
if r.RequestURI == "/artifactory/"+lifecycle.PropertiesBaseApi {
311+
w.WriteHeader(http.StatusOK) // Status 201
312+
writeMockStatusResponse(t, w, map[string]interface{}{"message": "Created", "status": "201"})
313+
}
314+
})
315+
defer mockServer.Close()
316+
properties := "environment=qa335;buildNumber=335"
317+
annotateOperationParams := buildAnnotationOperationParams(testRb, "default", "bundle-tag", properties,
318+
"environment", mockServer.URL)
319+
err := rbService.AnnotateReleaseBundle(annotateOperationParams)
320+
assert.NoError(t, err)
321+
}
322+
323+
func testAnnotate(t *testing.T, projectKey, tag, properties, delProperties string, expectError bool) {
324+
mockServer, rbService := createMockServer(t, func(w http.ResponseWriter, r *http.Request) {
325+
if r.RequestURI == "/"+lifecycle.GetReleaseBundleSetTagApi(testRb) {
326+
w.WriteHeader(http.StatusOK)
327+
}
328+
if r.RequestURI == "/artifactory/"+lifecycle.PropertiesBaseApi {
329+
w.WriteHeader(http.StatusNoContent) // Status 204
330+
writeMockStatusResponse(t, w, map[string]interface{}{"message": "Created", "status": "201"})
331+
}
332+
if r.RequestURI == "/artifactory/"+lifecycle.PropertiesBaseApi {
333+
w.WriteHeader(http.StatusNoContent) // Status 200
334+
}
335+
})
336+
defer mockServer.Close()
337+
annotateOperationParams := buildAnnotationOperationParams(testRb, projectKey, tag, properties, delProperties,
338+
mockServer.URL)
339+
err := rbService.AnnotateReleaseBundle(annotateOperationParams)
340+
if expectError {
341+
assert.Error(t, err)
342+
return
343+
}
344+
assert.NoError(t, err)
345+
}
346+
347+
func TestReleaseBundleAnnotationCases(t *testing.T) {
348+
testCases := []struct {
349+
name string
350+
projectKey string
351+
tag string
352+
properties string
353+
delProperties string
354+
expectError bool
355+
}{
356+
{"tag, properties, del-prop are not empty, project are empty", "", "bundle-tag", "prop1=1;prop2=2", "prop1", false},
357+
{"tag, property, del-prop are not empty, project is default", "default", "bundle-tag", "prop1=1;prop2=2", "prop1", false},
358+
{"tag is empty, del-prop is empty", "default", "", "prop1=1;prop2=2", "", false},
359+
{"property is empty, del-prop is empty, tag isn't empty, project is default", "default", "bundle-tag", "", "", false},
360+
{"property is empty", "project", "bundle-tag", "", "", false},
361+
{"property is one pair, tag isn't empty", "project", "bundle-tag", "prop1=1", "prop1", false},
362+
{"property is one pair, tag is empty", "project", "", "prop1=1", "", false},
363+
}
364+
365+
for _, test := range testCases {
366+
t.Run(test.name, func(t *testing.T) {
367+
testAnnotate(t, test.projectKey, test.tag, test.properties, test.delProperties, test.expectError)
368+
})
369+
}
370+
}
371+
372+
func buildAnnotationOperationParams(rbDetails lifecycle.ReleaseBundleDetails, projectKey, bundleTag, properties, delProperties,
373+
artUrl string) lifecycle.AnnotateOperationParams {
374+
props, _ := utils.ParseProperties(properties)
375+
annotateOperationParams := lifecycle.AnnotateOperationParams{
376+
RbTag: lifecycle.RbAnnotationTag{
377+
Tag: bundleTag,
378+
Exist: true,
379+
},
380+
RbProps: lifecycle.RbAnnotationProps{
381+
Properties: props.ToMap(),
382+
Exist: true,
383+
},
384+
RbDetails: rbDetails,
385+
QueryParams: lifecycle.CommonOptionalQueryParams{
386+
ProjectKey: projectKey,
387+
},
388+
PropertyParams: lifecycle.CommonPropParams{
389+
Path: resolveManifestPath(projectKey, rbDetails.ReleaseBundleName, rbDetails.ReleaseBundleVersion),
390+
Recursive: false,
391+
},
392+
RbDelProps: lifecycle.RbDelProps{
393+
Keys: delProperties,
394+
Exist: true,
395+
},
396+
ArtifactoryUrl: lifecycle.ArtCommonParams{
397+
Url: artUrl + "/artifactory/",
398+
},
399+
}
400+
return annotateOperationParams
401+
}
402+
403+
func resolveManifestPath(projectKey, bundleName, bundleVersion string) string {
404+
return fmt.Sprintf("%s/%s/%s/%s", resolveRepoKey(projectKey), bundleName, bundleVersion, rbManifestName)
405+
}
406+
func resolveRepoKey(project string) string {
407+
if project == "" || project == "default" {
408+
return releaseBundlesV2
409+
}
410+
return fmt.Sprintf("%s-%s", project, releaseBundlesV2)
411+
}

lifecycle/manager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,8 @@ func (lcs *LifecycleServicesManager) IsReleaseBundleExist(rbName, rbVersion, pro
138138
rbService := lifecycle.NewReleaseBundlesService(lcs.config.GetServiceDetails(), lcs.client)
139139
return rbService.ReleaseBundleExists(rbName, rbVersion, projectKey)
140140
}
141+
142+
func (lcs *LifecycleServicesManager) AnnotateReleaseBundle(params lifecycle.AnnotateOperationParams) error {
143+
rbService := lifecycle.NewReleaseBundlesService(lcs.config.GetServiceDetails(), lcs.client)
144+
return rbService.AnnotateReleaseBundle(params)
145+
}

0 commit comments

Comments
 (0)