dependabot-docker 0.212.0 → 0.213.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a77135a48c7aab9a2b1bb6069cdae9de09c7ee2d9d2b5eb8cc30e4fc4cfbb1a
4
- data.tar.gz: 0b92a7eed035d963f08b99026a671f7201d2074de87692ada394eedbc373717f
3
+ metadata.gz: ebc54cfc835861f5ff7c37dabe72928e92786cda8925b7744029121b17fdc097
4
+ data.tar.gz: 4e99d4753649e65f7d34295f596c9de8e1060487e066c8c3cc6a2054e9e6c30a
5
5
  SHA512:
6
- metadata.gz: b70a2a9fc4b2e1b0605ba08197407c1bb93af05bd9cb3a105805545cb8809659da347c0048c2442f3a8a24b10e926aa785704eaf3cd947997e5fc888864b0f87
7
- data.tar.gz: 02a76d37235c6bb35d157ec86d63b974d2a1f678149bf781d1d745d8424cd762bb8b3d72d9b6076fea4bb79cb729a11f30d161273672924346b5da6cde1e5297
6
+ metadata.gz: 2312611afec9a4b58b82b0327a95f9257ae1cfacabc7f294c9eba48e52cf5d268dcf9004260a8fcb5aa9b6d9f647c2df5199b8bc9ad6e4131a4ad7ec85fa693e
7
+ data.tar.gz: 74760bd8b337feb6a2b7ca3a083079c2f6c187bdd2495c9467bc7a5b5f96bb825ac8cfda8defce871295d6e10ec4e8dbed01a6776816f83cc87eabc75517537d
@@ -1,13 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "dependabot/experiments"
3
4
  require "dependabot/file_fetchers"
4
5
  require "dependabot/file_fetchers/base"
5
6
 
6
7
  module Dependabot
7
8
  module Docker
8
9
  class FileFetcher < Dependabot::FileFetchers::Base
9
- YAML_REGEXP = /^[^\.]+\.ya?ml$/i.freeze
10
- DOCKER_REGEXP = /dockerfile/i.freeze
10
+ YAML_REGEXP = /^[^\.]+\.ya?ml$/i
11
+ DOCKER_REGEXP = /dockerfile/i
12
+ HELM_REGEXP = /values[\-a-zA-Z_0-9]*\.yaml/i
11
13
 
12
14
  def self.required_files_in?(filenames)
13
15
  filenames.any? { |f| f.match?(DOCKER_REGEXP) } or
@@ -21,7 +23,7 @@ module Dependabot
21
23
  private
22
24
 
23
25
  def kubernetes_enabled?
24
- options.key?(:kubernetes_updates) && options[:kubernetes_updates]
26
+ Experiments.enabled?(:kubernetes_updates)
25
27
  end
26
28
 
27
29
  def fetch_files
@@ -84,10 +86,14 @@ module Dependabot
84
86
  def correctly_encoded_yamlfiles
85
87
  candidate_files = yamlfiles.select { |f| f.content.valid_encoding? }
86
88
  candidate_files.select do |f|
87
- # This doesn't handle multi-resource files, but it shouldn't matter, since the first resource
88
- # in a multi-resource file had better be a valid k8s resource
89
- content = ::YAML.safe_load(f.content, aliases: true)
90
- likely_kubernetes_resource?(content)
89
+ if f.type == "file" && f.name.match?(HELM_REGEXP)
90
+ true
91
+ else
92
+ # This doesn't handle multi-resource files, but it shouldn't matter, since the first resource
93
+ # in a multi-resource file had better be a valid k8s resource
94
+ content = ::YAML.safe_load(f.content, aliases: true)
95
+ likely_kubernetes_resource?(content)
96
+ end
91
97
  rescue ::Psych::Exception
92
98
  false
93
99
  end
@@ -15,27 +15,25 @@ module Dependabot
15
15
 
16
16
  # Details of Docker regular expressions is at
17
17
  # https://github.com/docker/distribution/blob/master/reference/regexp.go
18
- DOMAIN_COMPONENT =
19
- /(?:[[:alnum:]]|[[:alnum:]][[[:alnum:]]-]*[[:alnum:]])/.freeze
20
- DOMAIN = /(?:#{DOMAIN_COMPONENT}(?:\.#{DOMAIN_COMPONENT})+)/.freeze
21
- REGISTRY = /(?<registry>#{DOMAIN}(?::\d+)?)/.freeze
22
-
23
- NAME_COMPONENT = /(?:[a-z\d]+(?:(?:[._]|__|[-]*)[a-z\d]+)*)/.freeze
24
- IMAGE = %r{(?<image>#{NAME_COMPONENT}(?:/#{NAME_COMPONENT})*)}.freeze
25
-
26
- FROM = /FROM/i.freeze
27
- PLATFORM = /--platform\=(?<platform>\S+)/.freeze
28
- TAG = /:(?<tag>[\w][\w.-]{0,127})/.freeze
29
- DIGEST = /@(?<digest>[^\s]+)/.freeze
30
- NAME = /\s+AS\s+(?<name>[\w-]+)/.freeze
18
+ DOMAIN_COMPONENT = /(?:[[:alnum:]]|[[:alnum:]][[[:alnum:]]-]*[[:alnum:]])/
19
+ DOMAIN = /(?:#{DOMAIN_COMPONENT}(?:\.#{DOMAIN_COMPONENT})+)/
20
+ REGISTRY = /(?<registry>#{DOMAIN}(?::\d+)?)/
21
+
22
+ NAME_COMPONENT = /(?:[a-z\d]+(?:(?:[._]|__|[-]*)[a-z\d]+)*)/
23
+ IMAGE = %r{(?<image>#{NAME_COMPONENT}(?:/#{NAME_COMPONENT})*)}
24
+
25
+ FROM = /FROM/i
26
+ PLATFORM = /--platform\=(?<platform>\S+)/
27
+ TAG = /:(?<tag>[\w][\w.-]{0,127})/
28
+ DIGEST = /@(?<digest>[^\s]+)/
29
+ NAME = /\s+AS\s+(?<name>[\w-]+)/
31
30
  FROM_LINE =
32
31
  %r{^#{FROM}\s+(#{PLATFORM}\s+)?(#{REGISTRY}/)?
33
- #{IMAGE}#{TAG}?#{DIGEST}?#{NAME}?}x.freeze
32
+ #{IMAGE}#{TAG}?#{DIGEST}?#{NAME}?}x
34
33
 
35
- AWS_ECR_URL = /dkr\.ecr\.(?<region>[^.]+)\.amazonaws\.com/.freeze
34
+ AWS_ECR_URL = /dkr\.ecr\.(?<region>[^.]+)\.amazonaws\.com/
36
35
 
37
- IMAGE_SPEC =
38
- %r{^(#{REGISTRY}/)?#{IMAGE}#{TAG}?#{DIGEST}?#{NAME}?}x.freeze
36
+ IMAGE_SPEC = %r{^(#{REGISTRY}/)?#{IMAGE}#{TAG}?#{DIGEST}?#{NAME}?}x
39
37
 
40
38
  def parse
41
39
  dependency_set = DependencySet.new
@@ -214,6 +212,8 @@ module Dependabot
214
212
  images =
215
213
  if !img.nil? && img.is_a?(String) && !img.empty?
216
214
  [img]
215
+ elsif !img.nil? && img.is_a?(Hash) && !img.empty?
216
+ parse_helm(img)
217
217
  else
218
218
  []
219
219
  end
@@ -225,6 +225,22 @@ module Dependabot
225
225
  # Dependencies include both Dockerfiles and yaml, select yaml.
226
226
  dependency_files.select { |f| f.type == "file" && f.name.match?(/^[^\.]+\.ya?ml/i) }
227
227
  end
228
+
229
+ def parse_helm(img_hash)
230
+ repo = img_hash.fetch("repository", nil)
231
+ tag = img_hash.key?("tag") ? img_hash.fetch("tag", nil) : img_hash.fetch("version", nil)
232
+ registry = img_hash.fetch("registry", nil)
233
+
234
+ if !repo.nil? && !registry.nil? && !tag.nil?
235
+ ["#{registry}/#{repo}:#{tag}"]
236
+ elsif !repo.nil? && !tag.nil?
237
+ ["#{repo}:#{tag}"]
238
+ elsif !repo.nil?
239
+ [repo]
240
+ else
241
+ []
242
+ end
243
+ end
228
244
  end
229
245
  end
230
246
  end
@@ -7,7 +7,7 @@ require "dependabot/errors"
7
7
  module Dependabot
8
8
  module Docker
9
9
  class FileUpdater < Dependabot::FileUpdaters::Base
10
- FROM_REGEX = /FROM(\s+--platform\=\S+)?/i.freeze
10
+ FROM_REGEX = /FROM(\s+--platform\=\S+)?/i
11
11
 
12
12
  def self.updated_files_regex
13
13
  [
@@ -18,7 +18,6 @@ module Dependabot
18
18
 
19
19
  def updated_dependency_files
20
20
  updated_files = []
21
-
22
21
  dependency_files.each do |file|
23
22
  next unless requirement_changed?(file, dependency)
24
23
 
@@ -153,13 +152,29 @@ module Dependabot
153
152
  end
154
153
 
155
154
  def updated_yaml_content(file)
156
- updated_content = update_image(file)
155
+ updated_content = file.name == "values.yaml" ? update_helm(file) : update_image(file)
157
156
 
158
157
  raise "Expected content to change!" if updated_content == file.content
159
158
 
160
159
  updated_content
161
160
  end
162
161
 
162
+ def update_helm(file)
163
+ # TODO: this won't work if two images have the same tag version
164
+ old_tags = old_helm_tags(file)
165
+ return if old_tags.empty?
166
+
167
+ modified_content = file.content
168
+
169
+ old_tags.each do |old_tag|
170
+ old_tag_regex = /^\s+(?:-\s)?(?:tag|version):\s+#{old_tag}(?=\s|$)/
171
+ modified_content = modified_content.gsub(old_tag_regex) do |old_img_tag|
172
+ old_img_tag.gsub(old_tag.to_s, new_yaml_tag(file).to_s)
173
+ end
174
+ end
175
+ modified_content
176
+ end
177
+
163
178
  def update_image(file)
164
179
  old_images = old_yaml_images(file)
165
180
  return if old_images.empty?
@@ -176,13 +191,18 @@ module Dependabot
176
191
  end
177
192
 
178
193
  def new_yaml_image(file)
179
- elt = dependency.requirements.find { |r| r[:file] == file.name }
180
- prefix = elt.fetch(:source)[:registry] ? "#{elt.fetch(:source)[:registry]}/" : ""
181
- digest = elt.fetch(:source)[:digest] ? "@#{elt.fetch(:source)[:digest]}" : ""
182
- tag = elt.fetch(:source)[:tag] ? ":#{elt.fetch(:source)[:tag]}" : ""
194
+ element = dependency.requirements.find { |r| r[:file] == file.name }
195
+ prefix = element.fetch(:source)[:registry] ? "#{element.fetch(:source)[:registry]}/" : ""
196
+ digest = element.fetch(:source)[:digest] ? "@#{element.fetch(:source)[:digest]}" : ""
197
+ tag = element.fetch(:source)[:tag] ? ":#{element.fetch(:source)[:tag]}" : ""
183
198
  "#{prefix}#{dependency.name}#{tag}#{digest}"
184
199
  end
185
200
 
201
+ def new_yaml_tag(file)
202
+ element = dependency.requirements.find { |r| r[:file] == file.name }
203
+ element.fetch(:source)[:tag] || ""
204
+ end
205
+
186
206
  def old_yaml_images(file)
187
207
  dependency.
188
208
  previous_requirements.
@@ -193,6 +213,14 @@ module Dependabot
193
213
  "#{prefix}#{dependency.name}#{tag}#{digest}"
194
214
  end
195
215
  end
216
+
217
+ def old_helm_tags(file)
218
+ dependency.
219
+ previous_requirements.
220
+ select { |r| r[:file] == file.name }.map do |r|
221
+ r.fetch(:source)[:tag] || ""
222
+ end
223
+ end
196
224
  end
197
225
  end
198
226
  end
@@ -6,13 +6,17 @@ module Dependabot
6
6
  module Docker
7
7
  # Lifted from the bundler package manager
8
8
  class Requirement < Gem::Requirement
9
- # For consistency with other langauges, we define a requirements array.
9
+ # For consistency with other languages, we define a requirements array.
10
10
  # Ruby doesn't have an `OR` separator for requirements, so it always
11
11
  # contains a single element.
12
12
  def self.requirements_array(requirement_string)
13
13
  [new(requirement_string)]
14
14
  end
15
15
 
16
+ def satisfied_by?(version)
17
+ super(version.release_part)
18
+ end
19
+
16
20
  # Patches Gem::Requirement to make it accept requirement strings like
17
21
  # "~> 4.2.5, >= 4.2.5.1" without first needing to split them.
18
22
  def initialize(*requirements)
@@ -43,18 +43,16 @@ module Dependabot
43
43
  module Docker
44
44
  class UpdateChecker < Dependabot::UpdateCheckers::Base
45
45
  VERSION_REGEX =
46
- /v?(?<version>[0-9]+(?:(?:\.[a-z0-9]+)|(?:-(?:kb)?[0-9]+))*)/i.freeze
47
- VERSION_WITH_SFX = /^#{VERSION_REGEX}(?<suffix>-[a-z0-9.\-]+)?$/i.freeze
48
- VERSION_WITH_PFX = /^(?<prefix>[a-z0-9.\-]+-)?#{VERSION_REGEX}$/i.freeze
49
- VERSION_WITH_PFX_AND_SFX =
50
- /^(?<prefix>[a-z\-]+-)?#{VERSION_REGEX}(?<suffix>-[a-z\-]+)?$/i.
51
- freeze
46
+ /v?(?<version>[0-9]+(?:(?:\.[_a-z0-9]+)|(?:-(?:kb)?[0-9]+))*)/i
47
+ VERSION_WITH_SFX = /^#{VERSION_REGEX}(?<suffix>-[a-z0-9.\-]+)?$/i
48
+ VERSION_WITH_PFX = /^(?<prefix>[a-z0-9.\-]+-)?#{VERSION_REGEX}$/i
49
+ VERSION_WITH_PFX_AND_SFX = /^(?<prefix>[a-z\-]+-)?#{VERSION_REGEX}(?<suffix>-[a-z\-]+)?$/i
52
50
  NAME_WITH_VERSION =
53
51
  /
54
52
  #{VERSION_WITH_PFX}|
55
53
  #{VERSION_WITH_SFX}|
56
54
  #{VERSION_WITH_PFX_AND_SFX}
57
- /x.freeze
55
+ /x
58
56
 
59
57
  def latest_version
60
58
  fetch_latest_version(dependency.version)
@@ -347,7 +345,8 @@ module Dependabot
347
345
  DockerRegistry2::Registry.new(
348
346
  "https://#{registry_hostname}",
349
347
  user: registry_credentials&.fetch("username", nil),
350
- password: registry_credentials&.fetch("password", nil)
348
+ password: registry_credentials&.fetch("password", nil),
349
+ read_timeout: 10
351
350
  )
352
351
  end
353
352
 
@@ -9,7 +9,7 @@ module Dependabot
9
9
  module Docker
10
10
  module Utils
11
11
  class CredentialsFinder
12
- AWS_ECR_URL = /dkr\.ecr\.(?<region>[^.]+)\.amazonaws\.com/.freeze
12
+ AWS_ECR_URL = /dkr\.ecr\.(?<region>[^.]+)\.amazonaws\.com/
13
13
 
14
14
  def initialize(credentials)
15
15
  @credentials = credentials
@@ -4,7 +4,29 @@ require "dependabot/utils"
4
4
 
5
5
  module Dependabot
6
6
  module Docker
7
+ # In the special case of Java, the version string may also contain
8
+ # optional "update number" and "identifier" components.
9
+ # See https://www.oracle.com/java/technologies/javase/versioning-naming.html
10
+ # for a description of Java versions.
11
+ #
7
12
  class Version < Gem::Version
13
+ def initialize(version)
14
+ release_part, update_part = version.split("_", 2)
15
+
16
+ @release_part = Gem::Version.new(release_part)
17
+
18
+ @update_part = Gem::Version.new(update_part&.start_with?(/[0-9]/) ? update_part : 0)
19
+ end
20
+
21
+ attr_reader :release_part
22
+
23
+ def <=>(other)
24
+ sort_criteria <=> other.sort_criteria
25
+ end
26
+
27
+ def sort_criteria
28
+ [@release_part, @update_part]
29
+ end
8
30
  end
9
31
  end
10
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.212.0
4
+ version: 0.213.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-06 00:00:00.000000000 Z
11
+ date: 2022-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,42 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.212.0
19
+ version: 0.213.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.212.0
27
- - !ruby/object:Gem::Dependency
28
- name: debase
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '='
32
- - !ruby/object:Gem::Version
33
- version: 0.2.3
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '='
39
- - !ruby/object:Gem::Version
40
- version: 0.2.3
41
- - !ruby/object:Gem::Dependency
42
- name: debase-ruby_core_source
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '='
46
- - !ruby/object:Gem::Version
47
- version: 0.10.16
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '='
53
- - !ruby/object:Gem::Version
54
- version: 0.10.16
26
+ version: 0.213.0
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: debug
57
29
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +58,14 @@ dependencies:
86
58
  requirements:
87
59
  - - "~>"
88
60
  - !ruby/object:Gem::Version
89
- version: 3.12.0
61
+ version: 3.13.0
90
62
  type: :development
91
63
  prerelease: false
92
64
  version_requirements: !ruby/object:Gem::Requirement
93
65
  requirements:
94
66
  - - "~>"
95
67
  - !ruby/object:Gem::Version
96
- version: 3.12.0
68
+ version: 3.13.0
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: rake
99
71
  requirement: !ruby/object:Gem::Requirement
@@ -142,42 +114,28 @@ dependencies:
142
114
  requirements:
143
115
  - - "~>"
144
116
  - !ruby/object:Gem::Version
145
- version: 1.36.0
117
+ version: 1.37.1
146
118
  type: :development
147
119
  prerelease: false
148
120
  version_requirements: !ruby/object:Gem::Requirement
149
121
  requirements:
150
122
  - - "~>"
151
123
  - !ruby/object:Gem::Version
152
- version: 1.36.0
124
+ version: 1.37.1
153
125
  - !ruby/object:Gem::Dependency
154
126
  name: rubocop-performance
155
127
  requirement: !ruby/object:Gem::Requirement
156
128
  requirements:
157
129
  - - "~>"
158
130
  - !ruby/object:Gem::Version
159
- version: 1.14.2
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: 1.14.2
167
- - !ruby/object:Gem::Dependency
168
- name: ruby-debug-ide
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: 0.7.3
131
+ version: 1.15.0
174
132
  type: :development
175
133
  prerelease: false
176
134
  version_requirements: !ruby/object:Gem::Requirement
177
135
  requirements:
178
136
  - - "~>"
179
137
  - !ruby/object:Gem::Version
180
- version: 0.7.3
138
+ version: 1.15.0
181
139
  - !ruby/object:Gem::Dependency
182
140
  name: simplecov
183
141
  requirement: !ruby/object:Gem::Requirement
@@ -276,14 +234,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
276
234
  requirements:
277
235
  - - ">="
278
236
  - !ruby/object:Gem::Version
279
- version: 2.7.0
237
+ version: 3.1.0
280
238
  required_rubygems_version: !ruby/object:Gem::Requirement
281
239
  requirements:
282
240
  - - ">="
283
241
  - !ruby/object:Gem::Version
284
- version: 2.7.0
242
+ version: 3.1.0
285
243
  requirements: []
286
- rubygems_version: 3.1.6
244
+ rubygems_version: 3.3.7
287
245
  signing_key:
288
246
  specification_version: 4
289
247
  summary: Docker support for dependabot-common