Skip to content

Commit 135f049

Browse files
authored
Merge pull request #12713 from dependabot/randhircs/helm-cooldown-feature-add2
Enabled check to add feature flag, added specific exception and remov…
2 parents ea5bed5 + 835b93a commit 135f049

File tree

4 files changed

+49
-45
lines changed

4 files changed

+49
-45
lines changed

helm/lib/dependabot/helm/package/package_details_fetcher.rb

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ def fetch_tag_and_release_date_from_chart(repo_name)
4747
response = Excon.get(url, headers: { "Accept" => "application/vnd.github.v3+json" })
4848
rescue Excon::Error => e
4949
Dependabot.logger.error("Failed to fetch releases from #{url}: #{e.message} ")
50-
[]
50+
return []
5151
end
5252

53-
Dependabot.logger.error("Failed call details: #{response&.body}") unless response&.status == 200
54-
return [] if response.nil? || response.status != 200
53+
Dependabot.logger.error("Failed call details: #{response.body}") unless response.status == 200
54+
return [] if response.status != 200
5555

5656
parse_github_response(response)
5757
end
@@ -66,7 +66,6 @@ def parse_github_response(response)
6666
)
6767
end
6868
result_lines.sort_by(&:tag).reverse
69-
result_lines
7069
rescue JSON::ParserError => e
7170
Dependabot.logger.error("Failed to parse JSON response: #{e.message} response body #{response.body}")
7271
[]
@@ -85,24 +84,24 @@ def fetch_tag_and_release_date_helm_chart_index(index_url, chart_name)
8584
)
8685
rescue Excon::Error => e
8786
Dependabot.logger.error("Error fetching Helm index from #{index_url}: #{e.message}")
88-
result_lines
87+
return result_lines
8988
end
90-
Dependabot.logger.info("Received response from #{index_url} with status #{response&.status}")
89+
Dependabot.logger.info("Received response from #{index_url} with status #{response.status}")
9190
begin
92-
parsed_result = YAML.safe_load(response&.body)
93-
return result_lines unless parsed_result && parsed_result["entries"] && parsed_result["entries"][chart_name]
94-
95-
parsed_result["entries"][chart_name].map do |release|
96-
result_lines << GitTagWithDetail.new(
97-
tag: release["version"], # Extract the version field
98-
release_date: release["created"] # Extract the created field
99-
)
100-
end
101-
result_lines
102-
rescue StandardError => e
91+
parsed_result = YAML.safe_load(response.body)
92+
rescue Psych::SyntaxError => e
10393
Dependabot.logger.error("Error parsing Helm index: #{e.message}")
104-
result_lines
94+
return result_lines
10595
end
96+
return result_lines unless parsed_result && parsed_result["entries"] && parsed_result["entries"][chart_name]
97+
98+
parsed_result["entries"][chart_name].map do |release|
99+
result_lines << GitTagWithDetail.new(
100+
tag: release["version"], # Extract the version field
101+
release_date: release["created"] # Extract the created field
102+
)
103+
end
104+
result_lines
106105
end
107106
end
108107
end

helm/lib/dependabot/helm/update_checker.rb

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def fetch_releases_with_helm_cli(chart_name, repo_name, repo_url)
6969
valid_releases = filter_valid_releases(releases)
7070
return nil if valid_releases.empty?
7171

72-
if should_skip_cooldown?
72+
if cooldown_enabled?
7373
valid_releases = latest_version_resolver
7474
.fetch_tag_and_release_date_helm_chart(valid_releases, repo_name, chart_name)
7575
end
@@ -93,7 +93,7 @@ def fetch_releases_from_index(chart_name, repo_url)
9393
Dependabot.logger.info("Found #{all_versions.length} versions for #{chart_name} in index.yaml")
9494

9595
valid_versions = filter_valid_versions(all_versions)
96-
if should_skip_cooldown?
96+
if cooldown_enabled?
9797
# Filter out versions that are in cooldown period
9898
valid_versions = latest_version_resolver.fetch_tag_and_release_date_helm_chart_index(
9999
index_url,
@@ -239,7 +239,7 @@ def fetch_latest_oci_tag(chart_name, repo_url)
239239
return nil unless tags && !tags.empty?
240240

241241
valid_tags = filter_valid_versions(tags)
242-
if should_skip_cooldown?
242+
if cooldown_enabled?
243243
# Filter out versions that are in cooldown period
244244
repo_url = repo_url.gsub("oci://", "")
245245
repo_url = repo_url + "/" + chart_name
@@ -318,14 +318,26 @@ def fetch_latest_image_version
318318

319319
Dependabot.logger.info("Delegating to Docker UpdateChecker for image: #{docker_dependency.name}")
320320

321-
docker_checker = Dependabot::UpdateCheckers.for_package_manager("docker").new(
322-
dependency: docker_dependency,
323-
dependency_files: dependency_files,
324-
credentials: credentials,
325-
ignored_versions: ignored_versions,
326-
security_advisories: security_advisories,
327-
raise_on_ignored: raise_on_ignored
328-
)
321+
docker_checker = if cooldown_enabled?
322+
Dependabot::UpdateCheckers.for_package_manager("docker").new(
323+
dependency: docker_dependency,
324+
dependency_files: dependency_files,
325+
credentials: credentials,
326+
ignored_versions: ignored_versions,
327+
security_advisories: security_advisories,
328+
raise_on_ignored: raise_on_ignored,
329+
update_cooldown: update_cooldown
330+
)
331+
else
332+
Dependabot::UpdateCheckers.for_package_manager("docker").new(
333+
dependency: docker_dependency,
334+
dependency_files: dependency_files,
335+
credentials: credentials,
336+
ignored_versions: ignored_versions,
337+
security_advisories: security_advisories,
338+
raise_on_ignored: raise_on_ignored
339+
)
340+
end
329341

330342
latest_version = docker_checker.latest_version
331343

@@ -349,15 +361,17 @@ def fetch_tags_with_release_date_using_oci(tags, repo_url)
349361

350362
temp_tag = tag.tr("+", "_")
351363
response = Helpers.fetch_tags_with_release_date_using_oci(repo_url, temp_tag)
352-
next if response.strip.empty?
353364

354-
parsed_response = JSON.parse(response)
365+
begin
366+
parsed_response = JSON.parse(response)
367+
rescue JSON::ParserError => e
368+
Dependabot.logger.error("Failed to parse JSON response for tag #{tag}: #{e.message}")
369+
next
370+
end
355371
git_tag_with_release_date << GitTagWithDetail.new(
356372
tag: tag,
357373
release_date: parsed_response.dig("annotations", "org.opencontainers.image.created")
358374
)
359-
rescue JSON::ParserError => e
360-
Dependabot.logger.error("Failed to parse JSON response for tag #{tag}: #{e.message}")
361375
rescue StandardError => e
362376
Dependabot.logger.error("Error in fetching details for tag #{tag}: #{e.message}")
363377
end
@@ -396,14 +410,9 @@ def build_docker_dependency
396410
)
397411
end
398412

399-
sig { returns(T::Boolean) }
400-
def should_skip_cooldown?
401-
@update_cooldown.nil? || !cooldown_enabled? || !@update_cooldown.included?(dependency.name)
402-
end
403-
404413
sig { returns(T::Boolean) }
405414
def cooldown_enabled?
406-
true
415+
Dependabot::Experiments.enabled?(:enable_cooldown_for_helm)
407416
end
408417

409418
sig { returns(LatestVersionResolver) }

helm/lib/dependabot/helm/update_checker/latest_version_resolver.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,10 @@ def check_if_version_in_cooldown_period?(release_date)
135135

136136
return false if cooldown.nil?
137137

138-
# Get maximum cooldown days based on semver parts
139-
days = [cooldown.default_days, cooldown.semver_major_days].max
140-
days = cooldown.semver_minor_days unless days > cooldown.semver_minor_days
141-
days = cooldown.semver_patch_days unless days > cooldown.semver_patch_days
142138
# Calculate the number of seconds passed since the release
143139
passed_seconds = Time.now.to_i - release_date_to_seconds(release_date)
144140
# Check if the release is within the cooldown period
145-
passed_seconds < days * DAY_IN_SECONDS
141+
passed_seconds < cooldown.default_days * DAY_IN_SECONDS
146142
end
147143

148144
sig { params(release_date: String).returns(Integer) }

helm/spec/dependabot/helm/update_checker/latest_version_resolver_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166

167167
it "returns tags within the cooldown period" do
168168
result = resolver.select_tags_which_in_cooldown_from_chart(repo_name)
169-
expect(result).to eq(["v1.0.0", "v1.1.0"])
169+
expect(result).to eq(["v1.0.0"])
170170
end
171171

172172
it "logs an error if an exception occurs" do

0 commit comments

Comments
 (0)