Skip to content

Commit 5d5c1eb

Browse files
authored
Release create auto (#662)
* Support --auto without a .replicated config * add unit
1 parent 15d1426 commit 5d5c1eb

File tree

2 files changed

+228
-2
lines changed

2 files changed

+228
-2
lines changed

cli/cmd/release_create.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,12 @@ func (r *runners) InitReleaseCreate(parent *cobra.Command) error {
8989
originalPreRun := parent.PersistentPreRunE
9090
cmd.PreRunE = func(cmd *cobra.Command, args []string) error {
9191
// Check if we're using config-based flow
92+
// Note: --auto flag will set yaml-dir later, so don't use config flow when --auto is specified
9293
useConfigFlow := r.args.createReleaseYaml == "" &&
9394
r.args.createReleaseYamlFile == "" &&
9495
r.args.createReleaseYamlDir == "" &&
95-
r.args.createReleaseChart == ""
96+
r.args.createReleaseChart == "" &&
97+
!r.args.createReleaseAutoDefaults
9698

9799
if useConfigFlow {
98100
// For config flow, temporarily clear app state before calling parent prerun
@@ -233,10 +235,12 @@ func (r *runners) releaseCreate(cmd *cobra.Command, args []string) (err error) {
233235
}
234236

235237
// Check if we should use config-based flow (no explicit source flags provided)
238+
// Note: --auto flag will set yaml-dir later, so don't use config flow when --auto is specified
236239
useConfigFlow := r.args.createReleaseYaml == "" &&
237240
r.args.createReleaseYamlFile == "" &&
238241
r.args.createReleaseYamlDir == "" &&
239-
r.args.createReleaseChart == ""
242+
r.args.createReleaseChart == "" &&
243+
!r.args.createReleaseAutoDefaults
240244

241245
var config *tools.Config
242246
var stagingDir string

cli/cmd/release_create_test.go

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
package cmd
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
// TestUseConfigFlow_WithAutoFlag tests that --auto flag prevents config-based flow
10+
func TestUseConfigFlow_WithAutoFlag(t *testing.T) {
11+
r := &runners{
12+
args: runnerArgs{
13+
createReleaseAutoDefaults: true,
14+
// All source flags empty
15+
createReleaseYaml: "",
16+
createReleaseYamlFile: "",
17+
createReleaseYamlDir: "",
18+
createReleaseChart: "",
19+
},
20+
}
21+
22+
useConfigFlow := r.args.createReleaseYaml == "" &&
23+
r.args.createReleaseYamlFile == "" &&
24+
r.args.createReleaseYamlDir == "" &&
25+
r.args.createReleaseChart == "" &&
26+
!r.args.createReleaseAutoDefaults
27+
28+
assert.False(t, useConfigFlow, "--auto flag should prevent config flow")
29+
}
30+
31+
// TestUseConfigFlow_WithoutAutoFlag tests that config flow is used when no flags are provided
32+
func TestUseConfigFlow_WithoutAutoFlag(t *testing.T) {
33+
r := &runners{
34+
args: runnerArgs{
35+
createReleaseAutoDefaults: false,
36+
// All source flags empty
37+
createReleaseYaml: "",
38+
createReleaseYamlFile: "",
39+
createReleaseYamlDir: "",
40+
createReleaseChart: "",
41+
},
42+
}
43+
44+
useConfigFlow := r.args.createReleaseYaml == "" &&
45+
r.args.createReleaseYamlFile == "" &&
46+
r.args.createReleaseYamlDir == "" &&
47+
r.args.createReleaseChart == "" &&
48+
!r.args.createReleaseAutoDefaults
49+
50+
assert.True(t, useConfigFlow, "config flow should be used when no flags provided")
51+
}
52+
53+
// TestUseConfigFlow_WithYamlDir tests that providing --yaml-dir prevents config flow
54+
func TestUseConfigFlow_WithYamlDir(t *testing.T) {
55+
r := &runners{
56+
args: runnerArgs{
57+
createReleaseAutoDefaults: false,
58+
createReleaseYamlDir: "./manifests",
59+
},
60+
}
61+
62+
useConfigFlow := r.args.createReleaseYaml == "" &&
63+
r.args.createReleaseYamlFile == "" &&
64+
r.args.createReleaseYamlDir == "" &&
65+
r.args.createReleaseChart == "" &&
66+
!r.args.createReleaseAutoDefaults
67+
68+
assert.False(t, useConfigFlow, "--yaml-dir flag should prevent config flow")
69+
}
70+
71+
// TestUseConfigFlow_WithAutoAndYamlDir tests that both --auto and --yaml-dir prevents config flow
72+
func TestUseConfigFlow_WithAutoAndYamlDir(t *testing.T) {
73+
r := &runners{
74+
args: runnerArgs{
75+
createReleaseAutoDefaults: true,
76+
createReleaseYamlDir: "./custom",
77+
},
78+
}
79+
80+
useConfigFlow := r.args.createReleaseYaml == "" &&
81+
r.args.createReleaseYamlFile == "" &&
82+
r.args.createReleaseYamlDir == "" &&
83+
r.args.createReleaseChart == "" &&
84+
!r.args.createReleaseAutoDefaults
85+
86+
assert.False(t, useConfigFlow, "--auto and --yaml-dir should prevent config flow")
87+
}
88+
89+
// TestSetKOTSDefaultReleaseParams_WithEmptyYamlDir tests that yaml-dir defaults to ./manifests
90+
func TestSetKOTSDefaultReleaseParams_WithEmptyYamlDir(t *testing.T) {
91+
r := &runners{
92+
args: runnerArgs{
93+
createReleaseYamlDir: "",
94+
},
95+
}
96+
97+
// Mock git operations would fail, so we only test the yaml-dir setting
98+
// which happens before git operations
99+
if r.args.createReleaseYamlDir == "" {
100+
r.args.createReleaseYamlDir = "./manifests"
101+
}
102+
103+
assert.Equal(t, "./manifests", r.args.createReleaseYamlDir, "yaml-dir should default to ./manifests")
104+
}
105+
106+
// TestSetKOTSDefaultReleaseParams_WithExistingYamlDir tests that existing yaml-dir is preserved
107+
func TestSetKOTSDefaultReleaseParams_WithExistingYamlDir(t *testing.T) {
108+
r := &runners{
109+
args: runnerArgs{
110+
createReleaseYamlDir: "./custom",
111+
},
112+
}
113+
114+
// Same logic as in setKOTSDefaultReleaseParams
115+
if r.args.createReleaseYamlDir == "" {
116+
r.args.createReleaseYamlDir = "./manifests"
117+
}
118+
119+
assert.Equal(t, "./custom", r.args.createReleaseYamlDir, "existing yaml-dir should be preserved")
120+
}
121+
122+
// TestSetKOTSDefaultReleaseParams_PromoteMapsMainToUnstable tests branch name mapping
123+
func TestSetKOTSDefaultReleaseParams_PromoteMapsMainToUnstable(t *testing.T) {
124+
tests := []struct {
125+
name string
126+
branch string
127+
wantPromote string
128+
}{
129+
{
130+
name: "main branch maps to Unstable",
131+
branch: "main",
132+
wantPromote: "Unstable",
133+
},
134+
{
135+
name: "master branch maps to Unstable",
136+
branch: "master",
137+
wantPromote: "Unstable",
138+
},
139+
{
140+
name: "feature branch uses branch name",
141+
branch: "feature-xyz",
142+
wantPromote: "feature-xyz",
143+
},
144+
{
145+
name: "release branch uses branch name",
146+
branch: "release-1.0",
147+
wantPromote: "release-1.0",
148+
},
149+
}
150+
151+
for _, tt := range tests {
152+
t.Run(tt.name, func(t *testing.T) {
153+
// Simulate the logic from setKOTSDefaultReleaseParams
154+
promote := tt.branch
155+
if tt.branch == "master" || tt.branch == "main" {
156+
promote = "Unstable"
157+
}
158+
159+
assert.Equal(t, tt.wantPromote, promote)
160+
})
161+
}
162+
}
163+
164+
// TestSetKOTSDefaultReleaseParams_PreservesExistingPromote tests that user-provided values are preserved
165+
func TestSetKOTSDefaultReleaseParams_PreservesExistingPromote(t *testing.T) {
166+
r := &runners{
167+
args: runnerArgs{
168+
createReleasePromote: "Beta",
169+
},
170+
}
171+
172+
// Simulate the logic from setKOTSDefaultReleaseParams
173+
if r.args.createReleasePromote == "" {
174+
r.args.createReleasePromote = "auto-generated"
175+
}
176+
177+
assert.Equal(t, "Beta", r.args.createReleasePromote, "user-provided promote value should be preserved")
178+
}
179+
180+
// TestSetKOTSDefaultReleaseParams_PreservesExistingVersion tests that user-provided version is preserved
181+
func TestSetKOTSDefaultReleaseParams_PreservesExistingVersion(t *testing.T) {
182+
r := &runners{
183+
args: runnerArgs{
184+
createReleasePromoteVersion: "v1.2.3",
185+
},
186+
}
187+
188+
// Simulate the logic from setKOTSDefaultReleaseParams
189+
if r.args.createReleasePromoteVersion == "" {
190+
r.args.createReleasePromoteVersion = "auto-generated"
191+
}
192+
193+
assert.Equal(t, "v1.2.3", r.args.createReleasePromoteVersion, "user-provided version should be preserved")
194+
}
195+
196+
// TestSetKOTSDefaultReleaseParams_PreservesExistingReleaseNotes tests that user-provided release notes are preserved
197+
func TestSetKOTSDefaultReleaseParams_PreservesExistingReleaseNotes(t *testing.T) {
198+
r := &runners{
199+
args: runnerArgs{
200+
createReleasePromoteNotes: "Custom release notes",
201+
},
202+
}
203+
204+
// Simulate the logic from setKOTSDefaultReleaseParams
205+
if r.args.createReleasePromoteNotes == "" {
206+
r.args.createReleasePromoteNotes = "auto-generated"
207+
}
208+
209+
assert.Equal(t, "Custom release notes", r.args.createReleasePromoteNotes, "user-provided release notes should be preserved")
210+
}
211+
212+
// TestSetKOTSDefaultReleaseParams_SetsEnsureChannelAndLint tests that flags are automatically set
213+
func TestSetKOTSDefaultReleaseParams_SetsEnsureChannelAndLint(t *testing.T) {
214+
args := runnerArgs{}
215+
216+
// Simulate the logic from setKOTSDefaultReleaseParams
217+
args.createReleasePromoteEnsureChannel = true
218+
args.createReleaseLint = true
219+
220+
assert.True(t, args.createReleasePromoteEnsureChannel, "ensure-channel should be set to true")
221+
assert.True(t, args.createReleaseLint, "lint should be set to true")
222+
}

0 commit comments

Comments
 (0)