Skip to content

Commit 6868c3a

Browse files
committed
refactor: just use one tag with variable replacement
1 parent a34c0b4 commit 6868c3a

File tree

3 files changed

+50
-50
lines changed

3 files changed

+50
-50
lines changed

internal/generator/helpers_generator.go

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -274,38 +274,43 @@ func getDBaasEnvironment(
274274
return exists, nil
275275
}
276276

277-
func determineRefreshImage(serviceName, imageName string, labels map[string]string, envVars []lagoon.EnvironmentVariable) (string, error) {
278-
tagvalue := lagoon.CheckDockerComposeLagoonLabel(labels, "lagoon.base.image.tag")
279-
if tagvalue != "" {
277+
var exp = regexp.MustCompile(`(\\*)\$\{(.+?)(?:(\:\-)(.*?))?\}`)
280278

281-
// Regular expression to match VAR and defaulttag
282-
re := regexp.MustCompile(`\$(\w+)(?::-(\w+))?`)
283-
matches := re.FindStringSubmatch(tagvalue)
284-
285-
if len(matches) > 0 { // we have an env var, and optionally a default
279+
func determineRefreshImage(serviceName, imageName string, envVars []lagoon.EnvironmentVariable) (string, []error) {
280+
errs := []error{}
281+
parsed := exp.ReplaceAllStringFunc(string(imageName), func(match string) string {
282+
tagvalue := ""
283+
re := regexp.MustCompile(`\${?(\w+)?(?::-(\w+))?}?`)
284+
matches := re.FindStringSubmatch(match)
285+
if len(matches) > 0 {
286286
tv := ""
287287
envVarKey := matches[1]
288288
defaultVal := matches[2] //This could be empty
289289
for _, v := range envVars {
290290
if v.Name == envVarKey {
291-
// we've found a matching env var - that becomes the tag
292291
tv = v.Value
293292
}
294293
}
295294
if tv == "" {
296295
if defaultVal != "" {
297296
tagvalue = defaultVal
297+
} else {
298+
errs = append(errs, fmt.Errorf("the 'lagoon.base.image' label defined on service %s in the docker-compose file is invalid ('%s') - no matching variable or fallback found to replace requested variable %s", serviceName, imageName, envVarKey))
298299
}
299300
} else {
300301
tagvalue = tv
301302
}
302303
}
303-
304-
imageName = fmt.Sprintf("%v:%v", imageName, tagvalue)
305-
}
306-
307-
if !reference.ReferenceRegexp.MatchString(imageName) {
308-
return "", fmt.Errorf("the 'lagoon.base.image' label defined on service %s in the docker-compose file is invalid ('%s') - please ensure it conforms to the structure `[REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG|@DIGEST]`", serviceName, imageName)
304+
return tagvalue
305+
})
306+
if parsed == imageName {
307+
if !reference.ReferenceRegexp.MatchString(parsed) {
308+
if strings.Contains(parsed, "$") {
309+
errs = append(errs, fmt.Errorf("the 'lagoon.base.image' label defined on service %s in the docker-compose file is invalid ('%s') - variables are defined incorrectly, must contain curly brackets (example: '${VARIABLE}')", serviceName, imageName))
310+
} else {
311+
errs = append(errs, fmt.Errorf("the 'lagoon.base.image' label defined on service %s in the docker-compose file is invalid ('%s') - please ensure it conforms to the structure `[REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG|@DIGEST]`", serviceName, imageName))
312+
}
313+
}
309314
}
310-
return imageName, nil
315+
return parsed, errs
311316
}

internal/generator/helpers_generator_test.go

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ func Test_determineRefreshImage(t *testing.T) {
8686
type args struct {
8787
serviceName string
8888
imageName string
89-
labels map[string]string
9089
envVars []lagoon.EnvironmentVariable
9190
}
9291
tests := []struct {
@@ -100,34 +99,27 @@ func Test_determineRefreshImage(t *testing.T) {
10099
args: args{
101100
serviceName: "testservice",
102101
imageName: "image/name:latest",
103-
labels: nil,
104102
envVars: nil,
105103
},
106104
want: "image/name:latest",
107105
wantErr: false,
108106
},
109107
{
110-
name: "Adds simple tag",
108+
name: "Fails with no matching variable in envvars",
111109
args: args{
112110
serviceName: "testservice",
113-
imageName: "image/name",
114-
labels: map[string]string{
115-
"lagoon.base.image.tag": "sometag",
116-
},
117-
envVars: nil,
111+
imageName: "image/name:${NOENVVAR}",
112+
envVars: nil,
118113
},
119-
want: "image/name:sometag",
120-
wantErr: false,
114+
want: "",
115+
wantErr: true,
121116
},
122117
{
123-
name: "Fails with double tags",
118+
name: "Fails with variable missing curly brackets",
124119
args: args{
125120
serviceName: "testservice",
126-
imageName: "image/name:latest",
127-
labels: map[string]string{
128-
"lagoon.base.image.tag": "sometag",
129-
},
130-
envVars: nil,
121+
imageName: "image/name:$NOENVVAR",
122+
envVars: nil,
131123
},
132124
want: "",
133125
wantErr: true,
@@ -136,11 +128,8 @@ func Test_determineRefreshImage(t *testing.T) {
136128
name: "Tag with simple arg - fallback to default",
137129
args: args{
138130
serviceName: "testservice",
139-
imageName: "image/name",
140-
labels: map[string]string{
141-
"lagoon.base.image.tag": "$ENVVAR:-sometag",
142-
},
143-
envVars: nil,
131+
imageName: "image/name:${ENVVAR:-sometag}",
132+
envVars: nil,
144133
},
145134
want: "image/name:sometag",
146135
wantErr: false,
@@ -149,10 +138,7 @@ func Test_determineRefreshImage(t *testing.T) {
149138
name: "Tag with env var that works",
150139
args: args{
151140
serviceName: "testservice",
152-
imageName: "image/name",
153-
labels: map[string]string{
154-
"lagoon.base.image.tag": "$ENVVAR:-sometag",
155-
},
141+
imageName: "image/name:${ENVVAR:-sometag}",
156142
envVars: []lagoon.EnvironmentVariable{
157143
{
158144
Name: "ENVVAR",
@@ -166,12 +152,16 @@ func Test_determineRefreshImage(t *testing.T) {
166152
}
167153
for _, tt := range tests {
168154
t.Run(tt.name, func(t *testing.T) {
169-
got, err := determineRefreshImage(tt.args.serviceName, tt.args.imageName, tt.args.labels, tt.args.envVars)
170-
if (err != nil) != tt.wantErr {
171-
t.Errorf("determineRefreshImage() error = %v, wantErr %v", err, tt.wantErr)
172-
return
155+
got, errs := determineRefreshImage(tt.args.serviceName, tt.args.imageName, tt.args.envVars)
156+
if len(errs) > 0 && !tt.wantErr {
157+
for idx, err := range errs {
158+
t.Errorf("determineRefreshImage() error = %v, wantErr %v", err, tt.wantErr)
159+
if idx+1 == len(errs) {
160+
return
161+
}
162+
}
173163
}
174-
if got != tt.want {
164+
if got != tt.want && !tt.wantErr {
175165
t.Errorf("determineRefreshImage() got = %v, want %v", got, tt.want)
176166
}
177167
})

internal/generator/services.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,10 +289,15 @@ func composeToServiceValues(
289289
// may have an update without a change in tag (i.e. "latest" tagged images)
290290
baseimage := lagoon.CheckDockerComposeLagoonLabel(composeServiceValues.Labels, "lagoon.base.image")
291291
if baseimage != "" {
292-
293-
baseImageWithTag, err := determineRefreshImage(composeService, baseimage, composeServiceValues.Labels, buildValues.EnvironmentVariables)
294-
if err != nil {
295-
return nil, err
292+
baseImageWithTag, errs := determineRefreshImage(composeService, baseimage, buildValues.EnvironmentVariables)
293+
if len(errs) > 0 {
294+
for idx, err := range errs {
295+
if idx+1 == len(errs) {
296+
return nil, err
297+
} else {
298+
fmt.Println(err)
299+
}
300+
}
296301
}
297302
buildValues.ForcePullImages = append(buildValues.ForcePullImages, baseImageWithTag)
298303
}

0 commit comments

Comments
 (0)