dependabot-helm 0.310.0 → 0.312.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46d34de989ab4d8315a05e165d2aa34693f40ad3fd03c21d40842e375e7a9d89
4
- data.tar.gz: a134496cc57eb7f7ddf42a81529d94a89de236ea94738de017d4fc73039d2b88
3
+ metadata.gz: 034761fd0f260a06f555e91f7e19c96531f823530884a262390ad2a82d5f73bd
4
+ data.tar.gz: ccf1ecda062f31553fb91e27fba1750cdd68b028fb5bcf78f259c84e22316fa5
5
5
  SHA512:
6
- metadata.gz: a5c039462fbc357f23e3bcabb596b34e694d9d3f8ab75e6aceab1c734f46bbac6fd7d39d76ec9da37e21925bcacc0bf149a2f1f569579232b8d06e185ff5a778
7
- data.tar.gz: 898d936f36e271c6719847f8bfca1274cc9b30d1509792776798ed88a8d87b898b8ea4c0ca96a1bff774be1a2d063d9e46bb8a32dcc19b25b8bf9fcb85449a99
6
+ metadata.gz: bed08c60f4edace21c4365a03592573e539a626ffe249c5b9d9f2964f81ae1c63814d788d02873bbe647a5d7e2b65dac13ac249137798ce59e3225fe2c95b39a
7
+ data.tar.gz: 18975d419fac875e3e5e634241471b53c275298c9ee2dd373a47b86dc24f8a1387e284c356e52a301b181930f931dc06781e5f06eba21f6c5a9d3adbc726091b
@@ -66,6 +66,31 @@ module Dependabot
66
66
  )
67
67
  raise
68
68
  end
69
+
70
+ sig { params(username: String, password: String, repository_url: String).returns(String) }
71
+ def self.oci_registry_login(username, password, repository_url)
72
+ Dependabot.logger.info("Logging into OCI registry \"#{repository_url}\"")
73
+
74
+ Dependabot::SharedHelpers.run_shell_command(
75
+ "oras login --username #{username} --password #{password} #{repository_url}",
76
+ fingerprint: "oras login --username <username> --password <password> <repository_url>"
77
+ )
78
+ rescue StandardError => e
79
+ Dependabot.logger.error(
80
+ "Failed to authenticate for #{repository_url}: #{e.message}"
81
+ )
82
+ raise
83
+ end
84
+
85
+ sig { params(name: String).returns(String) }
86
+ def self.fetch_oci_tags(name)
87
+ Dependabot.logger.info("Searching OCI tags for: #{name}")
88
+
89
+ Dependabot::SharedHelpers.run_shell_command(
90
+ "oras repo tags #{name}",
91
+ fingerprint: "oras repo tags <name>"
92
+ ).strip
93
+ end
69
94
  end
70
95
  end
71
96
  end
@@ -3,7 +3,7 @@
3
3
 
4
4
  require "sorbet-runtime"
5
5
  require "dependabot/ecosystem"
6
- require "dependabot/docker/version"
6
+ require "dependabot/helm/version"
7
7
 
8
8
  module Dependabot
9
9
  module Helm
@@ -5,7 +5,7 @@ require "sorbet-runtime"
5
5
  require "dependabot/update_checkers"
6
6
  require "dependabot/update_checkers/base"
7
7
  require "dependabot/errors"
8
- require "dependabot/docker/version"
8
+ require "dependabot/helm/version"
9
9
  require "dependabot/docker/requirement"
10
10
  require "dependabot/shared/utils/credentials_finder"
11
11
  require "dependabot/shared_helpers"
@@ -191,6 +191,19 @@ module Dependabot
191
191
  raise PrivateSourceAuthenticationFailure, repo_url
192
192
  end
193
193
 
194
+ sig { params(repo_url: T.nilable(String)).returns(T.nilable(String)) }
195
+ def authenticate_oci_registry_source(repo_url)
196
+ return unless repo_url
197
+
198
+ repo_creds = Shared::Utils::CredentialsFinder.new(@credentials, private_repository_type: "helm_registry")
199
+ .credentials_for_registry(repo_url)
200
+ return unless repo_creds
201
+
202
+ Helpers.oci_registry_login(T.must(repo_creds["username"]), T.must(repo_creds["password"]), repo_url)
203
+ rescue StandardError
204
+ raise PrivateSourceAuthenticationFailure, repo_url
205
+ end
206
+
194
207
  sig { returns(T.nilable(Gem::Version)) }
195
208
  def fetch_latest_chart_version
196
209
  chart_name = dependency.name
@@ -201,9 +214,35 @@ module Dependabot
201
214
  releases = fetch_releases_with_helm_cli(chart_name, repo_name, repo_url)
202
215
  return releases if releases
203
216
 
217
+ tag = fetch_latest_oci_tag(chart_name, repo_url) if repo_url&.start_with?("oci://")
218
+ return tag if tag
219
+
204
220
  fetch_releases_from_index(chart_name, repo_url)
205
221
  end
206
222
 
223
+ sig { params(chart_name: String, repo_url: String).returns(T.nilable(Gem::Version)) }
224
+ def fetch_latest_oci_tag(chart_name, repo_url)
225
+ tags = fetch_oci_tags(chart_name, repo_url)
226
+ return nil unless tags && !tags.empty?
227
+
228
+ valid_tags = filter_valid_versions(tags)
229
+ return nil if valid_tags.empty?
230
+
231
+ highest_tag = valid_tags.map { |v| version_class.new(v) }.max
232
+ Dependabot.logger.info("Highest valid OCI tag for #{chart_name} is #{highest_tag}")
233
+ highest_tag
234
+ end
235
+
236
+ sig { params(chart_name: String, repo_url: String).returns(T.nilable(T::Array[String])) }
237
+ def fetch_oci_tags(chart_name, repo_url)
238
+ Dependabot.logger.info("Fetching OCI tags for #{repo_url}")
239
+ oci_registry = repo_url.gsub("oci://", "")
240
+ authenticate_oci_registry_source(repo_url)
241
+
242
+ release_tags = Helpers.fetch_oci_tags("#{oci_registry}/#{chart_name}").split("\n")
243
+ release_tags.map { |tag| tag.tr("_", "+") }
244
+ end
245
+
207
246
  sig { params(repo_url: T.nilable(String)).returns(T.nilable(String)) }
208
247
  def extract_repo_name(repo_url)
209
248
  return nil unless repo_url
@@ -0,0 +1,100 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/version"
5
+ require "dependabot/utils"
6
+ require "dependabot/docker/tag"
7
+ require "sorbet-runtime"
8
+
9
+ module Dependabot
10
+ module Helm
11
+ # In the special case of Java, the version string may also contain
12
+ # optional "update number" and "identifier" components.
13
+ # See https://www.oracle.com/java/technologies/javase/versioning-naming.html
14
+ # for a description of Java versions.
15
+ #
16
+ class Version < Dependabot::Version
17
+ extend T::Sig
18
+ # The regex has limits for the 0,255 and 1,255 repetitions to avoid infinite limits which makes codeql angry.
19
+ # A docker image cannot be longer than 255 characters anyways.
20
+ HELM_VERSION_REGEX = /^(?<prefix>[a-z._\-]{0,255})[_\-v]?(?<version>[^+]{1,255})(\+(?<digest>.+))?$/
21
+
22
+ sig { override.params(version: VersionParameter).void }
23
+ def initialize(version)
24
+ parsed_version = version.to_s.match(HELM_VERSION_REGEX)
25
+ release_part, update_part = T.must(T.must(parsed_version)[:version]).split("_", 2)
26
+
27
+ # The numeric_version is needed here to validate the version string (ex: 20.9.0-alpine3.18)
28
+ # when the call is made via Dependabot Api to convert the image version to semver.
29
+ release_part = Dependabot::Docker::Tag.new(
30
+ T.must(release_part).chomp(".").chomp("-").chomp("_")
31
+ ).numeric_version
32
+
33
+ @digest = T.let(T.must(parsed_version)[:digest], T.nilable(String))
34
+ @release_part = T.let(Dependabot::Version.new(T.must(release_part).tr("-", ".")), Dependabot::Version)
35
+ @update_part = T.let(
36
+ Dependabot::Version.new(update_part&.start_with?(/[0-9]/) ? update_part : 0),
37
+ Dependabot::Version
38
+ )
39
+
40
+ super(@release_part)
41
+ end
42
+
43
+ sig { override.params(version: VersionParameter).returns(T::Boolean) }
44
+ def self.correct?(version)
45
+ return true if version.is_a?(Gem::Version)
46
+
47
+ # We can't call new here because Gem::Version calls self.correct? in its initialize method
48
+ # causing an infinite loop, so instead we check if the release_part of the version is correct
49
+ parsed_version = version.to_s.match(HELM_VERSION_REGEX)
50
+ return false if parsed_version.nil?
51
+
52
+ release_part, = T.must(parsed_version[:version]).split("_", 2)
53
+ release_part = Dependabot::Docker::Tag.new(
54
+ T.must(release_part).chomp(".").chomp("-").chomp("_")
55
+ ).numeric_version
56
+ return false unless release_part
57
+
58
+ super(release_part.to_s)
59
+ rescue ArgumentError
60
+ # if we can't instantiate a version, it can't be correct
61
+ false
62
+ end
63
+
64
+ sig { override.returns(String) }
65
+ def to_semver
66
+ @release_part.to_semver
67
+ end
68
+
69
+ sig { returns(T::Array[String]) }
70
+ def segments
71
+ @release_part.segments
72
+ end
73
+
74
+ sig { returns(T.nilable(String)) }
75
+ def to_s
76
+ return nil if @release_part.nil?
77
+
78
+ version_string = @release_part.to_s
79
+ version_string += "+#{@digest}" unless @digest.nil?
80
+ version_string
81
+ end
82
+
83
+ sig { returns(Dependabot::Version) }
84
+ attr_reader :release_part
85
+
86
+ sig { params(other: Dependabot::Helm::Version).returns(T.nilable(Integer)) }
87
+ def <=>(other)
88
+ sort_criteria <=> other.sort_criteria
89
+ end
90
+
91
+ sig { returns(T::Array[Dependabot::Version]) }
92
+ def sort_criteria
93
+ [@release_part, @update_part]
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ Dependabot::Utils
100
+ .register_version_class("helm", Dependabot::Helm::Version)
@@ -11,10 +11,12 @@ require "dependabot/helm/file_parser"
11
11
  require "dependabot/helm/file_updater"
12
12
  require "dependabot/helm/update_checker"
13
13
 
14
- Dependabot::Utils.register_version_class("helm", Dependabot::Docker::Version)
15
14
  Dependabot::Utils.register_requirement_class("helm", Dependabot::Docker::Requirement)
16
15
  Dependabot::MetadataFinders.register("helm", Dependabot::Docker::MetadataFinder)
17
16
 
17
+ require "dependabot/helm/version"
18
+ Dependabot::Utils.register_version_class("helm", Dependabot::Helm::Version)
19
+
18
20
  require "dependabot/pull_request_creator/labeler"
19
21
  Dependabot::PullRequestCreator::Labeler
20
22
  .register_label_details("helm", name: "helm", colour: "E5F2FC")
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-helm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.310.0
4
+ version: 0.312.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-04-24 00:00:00.000000000 Z
10
+ date: 2025-05-09 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: dependabot-common
@@ -15,42 +15,42 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.310.0
18
+ version: 0.312.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.310.0
25
+ version: 0.312.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: dependabot-docker
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - '='
31
31
  - !ruby/object:Gem::Version
32
- version: 0.310.0
32
+ version: 0.312.0
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: 0.310.0
39
+ version: 0.312.0
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: debug
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 1.9.2
46
+ version: '1.9'
47
47
  type: :development
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 1.9.2
53
+ version: '1.9'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: gpgme
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -71,14 +71,14 @@ dependencies:
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '13'
74
+ version: '13.2'
75
75
  type: :development
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '13'
81
+ version: '13.2'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: rspec
84
84
  requirement: !ruby/object:Gem::Requirement
@@ -113,98 +113,98 @@ dependencies:
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: 1.9.2
116
+ version: '1.9'
117
117
  type: :development
118
118
  prerelease: false
119
119
  version_requirements: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
- version: 1.9.2
123
+ version: '1.9'
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rubocop
126
126
  requirement: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
- version: 1.67.0
130
+ version: '1.67'
131
131
  type: :development
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: 1.67.0
137
+ version: '1.67'
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: rubocop-performance
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: 1.22.1
144
+ version: '1.22'
145
145
  type: :development
146
146
  prerelease: false
147
147
  version_requirements: !ruby/object:Gem::Requirement
148
148
  requirements:
149
149
  - - "~>"
150
150
  - !ruby/object:Gem::Version
151
- version: 1.22.1
151
+ version: '1.22'
152
152
  - !ruby/object:Gem::Dependency
153
153
  name: rubocop-rspec
154
154
  requirement: !ruby/object:Gem::Requirement
155
155
  requirements:
156
156
  - - "~>"
157
157
  - !ruby/object:Gem::Version
158
- version: 2.29.1
158
+ version: '2.29'
159
159
  type: :development
160
160
  prerelease: false
161
161
  version_requirements: !ruby/object:Gem::Requirement
162
162
  requirements:
163
163
  - - "~>"
164
164
  - !ruby/object:Gem::Version
165
- version: 2.29.1
165
+ version: '2.29'
166
166
  - !ruby/object:Gem::Dependency
167
167
  name: rubocop-sorbet
168
168
  requirement: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
- version: 0.8.7
172
+ version: '0.8'
173
173
  type: :development
174
174
  prerelease: false
175
175
  version_requirements: !ruby/object:Gem::Requirement
176
176
  requirements:
177
177
  - - "~>"
178
178
  - !ruby/object:Gem::Version
179
- version: 0.8.7
179
+ version: '0.8'
180
180
  - !ruby/object:Gem::Dependency
181
181
  name: simplecov
182
182
  requirement: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - "~>"
185
185
  - !ruby/object:Gem::Version
186
- version: 0.22.0
186
+ version: '0.22'
187
187
  type: :development
188
188
  prerelease: false
189
189
  version_requirements: !ruby/object:Gem::Requirement
190
190
  requirements:
191
191
  - - "~>"
192
192
  - !ruby/object:Gem::Version
193
- version: 0.22.0
193
+ version: '0.22'
194
194
  - !ruby/object:Gem::Dependency
195
195
  name: turbo_tests
196
196
  requirement: !ruby/object:Gem::Requirement
197
197
  requirements:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
- version: 2.2.0
200
+ version: '2.2'
201
201
  type: :development
202
202
  prerelease: false
203
203
  version_requirements: !ruby/object:Gem::Requirement
204
204
  requirements:
205
205
  - - "~>"
206
206
  - !ruby/object:Gem::Version
207
- version: 2.2.0
207
+ version: '2.2'
208
208
  - !ruby/object:Gem::Dependency
209
209
  name: vcr
210
210
  requirement: !ruby/object:Gem::Requirement
@@ -237,16 +237,16 @@ dependencies:
237
237
  name: webrick
238
238
  requirement: !ruby/object:Gem::Requirement
239
239
  requirements:
240
- - - ">="
240
+ - - "~>"
241
241
  - !ruby/object:Gem::Version
242
- version: '1.7'
242
+ version: '1.9'
243
243
  type: :development
244
244
  prerelease: false
245
245
  version_requirements: !ruby/object:Gem::Requirement
246
246
  requirements:
247
- - - ">="
247
+ - - "~>"
248
248
  - !ruby/object:Gem::Version
249
- version: '1.7'
249
+ version: '1.9'
250
250
  description: Dependabot-Helm provides support for bumping Helm image tags via Dependabot.
251
251
  If you want support for multiple package managers, you probably want the meta-gem
252
252
  dependabot-omnibus.
@@ -265,12 +265,13 @@ files:
265
265
  - lib/dependabot/helm/helpers.rb
266
266
  - lib/dependabot/helm/package_manager.rb
267
267
  - lib/dependabot/helm/update_checker.rb
268
+ - lib/dependabot/helm/version.rb
268
269
  homepage: https://github.com/dependabot/dependabot-core
269
270
  licenses:
270
271
  - MIT
271
272
  metadata:
272
273
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
273
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.310.0
274
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.312.0
274
275
  rdoc_options: []
275
276
  require_paths:
276
277
  - lib