fix(autodiscovery/dockercompose): skip images whose tag is not a vers… · updatecli/updatecli@e76091b · GitHub
Skip to content

Commit e76091b

Browse files
jouveclaudeolblak
authored
fix(autodiscovery/dockercompose): skip images whose tag is not a version (#9760)
* fix(autodiscovery/dockercompose): skip images whose tag is not a version NewDockerImageSpecFromImage returns nil when the tag cannot be recognized as a version, so sourceSpec is nil for any ':latest' or variant-suffixed tag. Two bugs follow from that, both from inlining code the dockerfile crawler keeps in a per-image function where `return nil, nil` means "skip this image". Writing the fallback pattern to sourceSpec.VersionFilter.Pattern dereferences that nil whenever the crawler also carries a versionfilter, since GreaterThanPattern fails on the very same tag. dockerfile.go assigns the local versionFilterPattern instead, which is nil-safe and is also the variable the template actually reads. The `return nil, nil` in the template selection ends the whole crawl instead of skipping one service, discarding every manifest found so far. A single ':latest' service made the crawler emit no pipeline at all for the repository, exit 0, and say nothing above Info level. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore: rename unparseable to unparsable Signed-off-by: Olblak <me@olblak.com> --------- Signed-off-by: Olblak <me@olblak.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Olivier Vernin <olivier@vernin.me> Co-authored-by: Olblak <me@olblak.com>
1 parent 85ad6f7 commit e76091b

3 files changed

Lines changed: 53 additions & 9 deletions

File tree

‎pkg/plugins/autodiscovery/dockercompose/compose.go‎

Lines changed: 2 additions & 2 deletions

‎pkg/plugins/autodiscovery/dockercompose/main_test.go‎

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,24 @@ import (
66
"github.com/stretchr/testify/assert"
77
"github.com/stretchr/testify/require"
88
"github.com/updatecli/updatecli/pkg/plugins/utils/docker"
9+
"github.com/updatecli/updatecli/pkg/plugins/utils/version"
910
)
1011

1112
func TestDiscoverManifests(t *testing.T) {
12-
1313
testdata := []struct {
1414
name string
1515
rootDir string
1616
digest bool
1717
Auths map[string]docker.InlineKeyChain
18+
versionFilter version.Filter
1819
expectedPipelines []string
1920
}{
2021
{
2122
name: "Scenario 1 - digest",
2223
rootDir: "testdata",
2324
digest: true,
24-
expectedPipelines: []string{`name: 'deps(dockercompose): bump "jenkinsci/jenkins" digest'
25+
expectedPipelines: []string{
26+
`name: 'deps(dockercompose): bump "jenkinsci/jenkins" digest'
2527
sources:
2628
jenkins-lts:
2729
name: 'get latest image tag for "jenkinsci/jenkins"'
@@ -92,7 +94,8 @@ targets:
9294
Token: "mysecretToken",
9395
},
9496
},
95-
expectedPipelines: []string{`name: 'deps(dockercompose): bump "jenkinsci/jenkins" tag'
97+
expectedPipelines: []string{
98+
`name: 'deps(dockercompose): bump "jenkinsci/jenkins" tag'
9699
sources:
97100
jenkins-lts:
98101
name: 'get latest image tag for "jenkinsci/jenkins"'
@@ -137,6 +140,40 @@ targets:
137140
sourceid: 'jenkins-weekly'
138141
transformers:
139142
- addprefix: 'jenkinsci/jenkins:'
143+
`,
144+
},
145+
},
146+
{
147+
// A tag that Masterminds semver cannot parse at all leaves a nil
148+
// dockerimage spec and fails GreaterThanPattern. That service has to be
149+
// skipped without crashing, and without discarding the manifest already
150+
// found for the service listed before it.
151+
name: "Scenario 3 - no digest, tag not parseable as a version",
152+
rootDir: "testdata-unparsable-tag",
153+
digest: false,
154+
versionFilter: version.Filter{Kind: "semver", Pattern: "patch"},
155+
expectedPipelines: []string{
156+
`name: 'deps(dockercompose): bump "jenkinsci/jenkins" tag'
157+
sources:
158+
a-pinned:
159+
name: 'get latest image tag for "jenkinsci/jenkins"'
160+
kind: 'dockerimage'
161+
spec:
162+
image: 'jenkinsci/jenkins'
163+
tagfilter: ''
164+
versionfilter:
165+
kind: 'semver'
166+
pattern: '2.150.x'
167+
targets:
168+
a-pinned:
169+
name: 'deps: update Docker image "jenkinsci/jenkins" to "{{ source "a-pinned" }}"'
170+
kind: 'yaml'
171+
spec:
172+
file: 'docker-compose.yaml'
173+
key: '$.services.a-pinned.image'
174+
sourceid: 'a-pinned'
175+
transformers:
176+
- addprefix: 'jenkinsci/jenkins:'
140177
`,
141178
},
142179
},
@@ -147,8 +184,9 @@ targets:
147184
digest := tt.digest
148185
composefile, err := New(
149186
Spec{
150-
Digest: &digest,
151-
Auths: tt.Auths,
187+
Digest: &digest,
188+
Auths: tt.Auths,
189+
VersionFilter: tt.versionFilter,
152190
}, tt.rootDir, "", "")
153191

154192
require.NoError(t, err)
@@ -169,8 +207,6 @@ targets:
169207
pipelines = append(pipelines, string(rawPipelines[i]))
170208
assert.Equal(t, tt.expectedPipelines[i], pipelines[i])
171209
}
172-
173210
})
174211
}
175-
176212
}
Lines changed: 8 additions & 0 deletions

0 commit comments

Comments
 (0)