Skip to content

Commit c5a9b20

Browse files
authored
fix: don't error when a release exists (#29)
1 parent da44a07 commit c5a9b20

File tree

4 files changed

+152
-14
lines changed

4 files changed

+152
-14
lines changed

src/platforms/github/release.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"regexp"
1111
"time"
1212

13+
"github.com/defenseunicorns/uds-releaser/src/platforms"
1314
"github.com/defenseunicorns/uds-releaser/src/types"
1415
"github.com/defenseunicorns/uds-releaser/src/utils"
1516
github "github.com/google/go-github/v66/github"
@@ -51,7 +52,11 @@ func (Platform) TagAndRelease(flavor types.Flavor, tokenVarName string) error {
5152
GenerateReleaseNotes: github.Bool(true),
5253
}
5354

54-
_, _, err = githubClient.Repositories.CreateRelease(context.Background(), owner, repoName, release)
55+
fmt.Printf("Creating release %s-%s\n", flavor.Version, flavor.Name)
56+
57+
_, response, err := githubClient.Repositories.CreateRelease(context.Background(), owner, repoName, release)
58+
59+
err = platforms.ReleaseExists(422, response.StatusCode, err, `already_exists`, zarfPackageName, flavor)
5560
if err != nil {
5661
return err
5762
}

src/platforms/gitlab/release.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,12 @@ func (Platform) TagAndRelease(flavor types.Flavor, tokenVarName string) error {
2424
return err
2525
}
2626

27-
fmt.Println("Remote URL: ", remoteURL)
28-
2927
// Parse the GitLab base URL from the remote URL
3028
gitlabBaseURL, err := getGitlabBaseUrl(remoteURL)
3129
if err != nil {
3230
return err
3331
}
3432

35-
fmt.Println("Base URL: ", gitlabBaseURL)
36-
37-
fmt.Printf("Default branch: %s\n", defaultBranch)
38-
39-
fmt.Println("token var name: ", tokenVarName)
40-
4133
// Create a new GitLab client
4234
gitlabClient, err := gitlab.NewClient(os.Getenv(tokenVarName), gitlab.WithBaseURL(gitlabBaseURL))
4335
if err != nil {
@@ -60,14 +52,12 @@ func (Platform) TagAndRelease(flavor types.Flavor, tokenVarName string) error {
6052
}
6153

6254
// Create the release
63-
release, _, err := gitlabClient.Releases.CreateRelease(os.Getenv("CI_PROJECT_ID"), releaseOpts)
55+
_, response, err := gitlabClient.Releases.CreateRelease(os.Getenv("CI_PROJECT_ID"), releaseOpts)
56+
57+
err = platforms.ReleaseExists(409, response.StatusCode, err, `message: Release already exists`, zarfPackageName, flavor)
6458
if err != nil {
65-
fmt.Println("Error creating release: ", err)
6659
return err
6760
}
68-
69-
fmt.Printf("Release %s created\n", release.Name)
70-
7161
return nil
7262
}
7363

src/platforms/platform.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"fmt"
88
"os"
99

10+
"regexp"
11+
1012
"github.com/defenseunicorns/uds-releaser/src/types"
1113
"github.com/defenseunicorns/uds-releaser/src/utils"
1214
)
@@ -41,3 +43,18 @@ func VerifyEnvVar(varName string) error {
4143

4244
return nil
4345
}
46+
47+
func ReleaseExists(expectedStatusCode, receivedStatusCode int, err error, pattern string, packageName string, flavor types.Flavor) error {
48+
if err != nil {
49+
if receivedStatusCode == expectedStatusCode && regexp.MustCompile(pattern).MatchString(err.Error()) {
50+
fmt.Printf("Release with tag %s-%s already exists\n", flavor.Version, flavor.Name)
51+
return nil
52+
} else {
53+
fmt.Println("Error creating release: ", err)
54+
return err
55+
}
56+
} else {
57+
fmt.Printf("Release %s %s-%s created\n", packageName, flavor.Version, flavor.Name)
58+
return nil
59+
}
60+
}

src/platforms/platform_test.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright 2024 Defense Unicorns
2+
// SPDX-License-Identifier: AGPL-3.0-or-later OR LicenseRef-Defense-Unicorns-Commercial
3+
4+
package platforms
5+
6+
import (
7+
"fmt"
8+
"os"
9+
"testing"
10+
11+
"github.com/defenseunicorns/uds-releaser/src/types"
12+
)
13+
14+
func TestVerifyEnvVar(t *testing.T) {
15+
tests := []struct {
16+
varName string
17+
setVar bool
18+
varContents string
19+
expectError bool
20+
}{
21+
{
22+
varName: "TEST_VAR",
23+
setVar: true,
24+
varContents: "test",
25+
expectError: false,
26+
},
27+
{
28+
varName: "TEST_VAR",
29+
setVar: false,
30+
varContents: "",
31+
expectError: true,
32+
},
33+
{
34+
varName: "TEST_VAR",
35+
setVar: true,
36+
varContents: "",
37+
expectError: true,
38+
},
39+
}
40+
41+
for _, test := range tests {
42+
t.Run(fmt.Sprintf("setVar: %t contents:%s", test.setVar, test.varContents), func(t *testing.T) {
43+
if test.setVar {
44+
os.Setenv(test.varName, test.varContents)
45+
defer os.Unsetenv(test.varName)
46+
} else {
47+
os.Unsetenv(test.varName)
48+
}
49+
50+
err := VerifyEnvVar(test.varName)
51+
if test.expectError {
52+
if err == nil {
53+
t.Errorf("Expected error, got nil")
54+
}
55+
} else {
56+
if err != nil {
57+
t.Errorf("Expected no error, got %s", err)
58+
}
59+
}
60+
})
61+
}
62+
}
63+
64+
func TestReleaseExists(t *testing.T) {
65+
tests := []struct {
66+
expectedStatusCode int
67+
receivedStatusCode int
68+
err error
69+
pattern string
70+
packageName string
71+
flavor types.Flavor
72+
expectError bool
73+
}{
74+
{
75+
expectedStatusCode: 409,
76+
receivedStatusCode: 200,
77+
err: nil,
78+
pattern: "already_exists",
79+
packageName: "test",
80+
flavor: types.Flavor{Name: "test", Version: "1.0"},
81+
expectError: false,
82+
},
83+
{
84+
expectedStatusCode: 409,
85+
receivedStatusCode: 409,
86+
err: fmt.Errorf("message: already_exists"),
87+
pattern: "already_exists",
88+
packageName: "test",
89+
flavor: types.Flavor{Name: "test", Version: "1.0"},
90+
expectError: false,
91+
},
92+
{
93+
expectedStatusCode: 409,
94+
receivedStatusCode: 409,
95+
err: fmt.Errorf("message: other error"),
96+
pattern: "already_exists",
97+
packageName: "test",
98+
flavor: types.Flavor{Name: "test", Version: "1.0"},
99+
expectError: true,
100+
},
101+
{
102+
expectedStatusCode: 409,
103+
receivedStatusCode: 411,
104+
err: fmt.Errorf("message: other error"),
105+
pattern: "already_exists",
106+
packageName: "test",
107+
flavor: types.Flavor{Name: "test", Version: "1.0"},
108+
expectError: true,
109+
},
110+
}
111+
112+
for _, test := range tests {
113+
t.Run(fmt.Sprintf("expectedCode: %d receivedCode: %d error: %v", test.expectedStatusCode, test.receivedStatusCode, test.err), func(t *testing.T) {
114+
err := ReleaseExists(test.expectedStatusCode, test.receivedStatusCode, test.err, test.pattern, test.packageName, test.flavor)
115+
if test.expectError {
116+
if err == nil {
117+
t.Errorf("Expected error, got nil")
118+
}
119+
} else {
120+
if err != nil {
121+
t.Errorf("Expected no error, got %s", err)
122+
}
123+
}
124+
})
125+
}
126+
}

0 commit comments

Comments
 (0)