Skip to content

Commit e15f8ca

Browse files
fix(docker_compose): support folded scalar and docker.io-prefixed image values (#15100)
* fix(docker_compose): support folded scalar and docker.io-prefixed image values * Address review: non-raising builder methods and literal scalar coverage * Address review: tighten YAML helpers to always return content * Clarify why compose updater calls dockerfile-style helper * Address review: scope back to extending the dockerfile-style regex Drop the YAML fallback path in the docker_compose updater and revert the shared_file_updater refactor. Folded/literal block scalar image: values are now handled by extending the existing dockerfile-style declaration regex with an optional YAML block scalar indicator.
1 parent a1242a8 commit e15f8ca

4 files changed

Lines changed: 114 additions & 1 deletion

File tree

docker/lib/dependabot/docker_compose/file_updater.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,18 @@ def container_image_regex
2929

3030
sig { override.params(escaped_declaration: String).returns(Regexp) }
3131
def build_old_declaration_regex(escaped_declaration)
32-
%r{#{IMAGE_REGEX}\s+["']?(?:\$\{[^\}:]+:-)?(docker\.io/)?#{escaped_declaration}(?:\})?["']?(?=\s|$)}
32+
%r{
33+
#{IMAGE_REGEX}
34+
(?:[>|][-+]?\s*)? # optional YAML block scalar indicator (folded/literal)
35+
\s+
36+
["']?
37+
(?:\$\{[^\}:]+:-)?
38+
(docker\.io/)?
39+
#{escaped_declaration}
40+
(?:\})?
41+
["']?
42+
(?=\s|$)
43+
}x
3344
end
3445

3546
sig { override.returns(T::Array[Dependabot::DependencyFile]) }

docker/spec/dependabot/docker_compose/file_updater_spec.rb

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,5 +638,97 @@
638638
its(:content) { is_expected.to include "image: ${UBUNTU_IMAGE:-ubuntu:17.10}\n" }
639639
end
640640
end
641+
642+
context "when dependency is in a folded scalar image field" do
643+
let(:dockerfile_body) do
644+
fixture("docker_compose", "composefiles", "folded_digest")
645+
end
646+
647+
let(:dependency) do
648+
Dependabot::Dependency.new(
649+
name: "library/nginx",
650+
version: "1.25.5",
651+
previous_version: "1.25.4",
652+
requirements: [{
653+
requirement: nil,
654+
groups: [],
655+
file: "docker-compose.yml",
656+
source: {
657+
tag: "1.25.5",
658+
digest: "9a5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4d"
659+
}
660+
}],
661+
previous_requirements: [{
662+
requirement: nil,
663+
groups: [],
664+
file: "docker-compose.yml",
665+
source: {
666+
tag: "1.25.4",
667+
digest: "3f5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4c"
668+
}
669+
}],
670+
package_manager: "docker_compose"
671+
)
672+
end
673+
674+
describe "the updated docker-compose.yml" do
675+
subject(:updated_dockerfile) do
676+
updated_files.find { |f| f.name == "docker-compose.yml" }
677+
end
678+
679+
its(:content) do
680+
is_expected.to include(
681+
"docker.io/library/nginx:1.25.5@sha256:" \
682+
"9a5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4d"
683+
)
684+
end
685+
end
686+
end
687+
688+
context "when dependency is in a literal scalar image field" do
689+
let(:dockerfile_body) do
690+
fixture("docker_compose", "composefiles", "literal_digest")
691+
end
692+
693+
let(:dependency) do
694+
Dependabot::Dependency.new(
695+
name: "library/nginx",
696+
version: "1.25.5",
697+
previous_version: "1.25.4",
698+
requirements: [{
699+
requirement: nil,
700+
groups: [],
701+
file: "docker-compose.yml",
702+
source: {
703+
tag: "1.25.5",
704+
digest: "9a5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4d"
705+
}
706+
}],
707+
previous_requirements: [{
708+
requirement: nil,
709+
groups: [],
710+
file: "docker-compose.yml",
711+
source: {
712+
tag: "1.25.4",
713+
digest: "3f5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4c"
714+
}
715+
}],
716+
package_manager: "docker_compose"
717+
)
718+
end
719+
720+
describe "the updated docker-compose.yml" do
721+
subject(:updated_dockerfile) do
722+
updated_files.find { |f| f.name == "docker-compose.yml" }
723+
end
724+
725+
its(:content) do
726+
is_expected.to include(
727+
"docker.io/library/nginx:1.25.5@sha256:" \
728+
"9a5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4d"
729+
)
730+
end
731+
end
732+
end
641733
end
642734
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: web-stack
2+
services:
3+
nginx:
4+
image: >-
5+
docker.io/library/nginx:1.25.4@sha256:3f5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4c
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: web-stack
2+
services:
3+
nginx:
4+
image: |
5+
docker.io/library/nginx:1.25.4@sha256:3f5f6c8a4e8b1c3b0e0c2d7c9d5f0e2b6c1a9f4d8e7b3c2a1f0d9e8c7b6a5f4c

0 commit comments

Comments
 (0)