summaryrefslogtreecommitdiff
path: root/lib/gitlab/ci/runner_upgrade_check.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/ci/runner_upgrade_check.rb')
-rw-r--r--lib/gitlab/ci/runner_upgrade_check.rb88
1 files changed, 51 insertions, 37 deletions
diff --git a/lib/gitlab/ci/runner_upgrade_check.rb b/lib/gitlab/ci/runner_upgrade_check.rb
index 10a89bb15d4..03130addd6a 100644
--- a/lib/gitlab/ci/runner_upgrade_check.rb
+++ b/lib/gitlab/ci/runner_upgrade_check.rb
@@ -3,57 +3,70 @@
module Gitlab
module Ci
class RunnerUpgradeCheck
- include Singleton
+ def initialize(gitlab_version, runner_releases_store = nil)
+ @gitlab_version = ::Gitlab::VersionInfo.parse(gitlab_version, parse_suffix: true)
+ @releases_store = runner_releases_store
+ end
+
+ def check_runner_upgrade_suggestion(runner_version)
+ check_runner_upgrade_suggestions(runner_version).first
+ end
- def check_runner_upgrade_status(runner_version)
+ private
+
+ def runner_releases_store
+ @releases_store ||= RunnerReleases.instance
+ end
+
+ def add_suggestion(suggestions, runner_version, version, status)
+ return false unless version && version > runner_version
+
+ suggestions[version] = status
+ true
+ end
+
+ def check_runner_upgrade_suggestions(runner_version)
runner_version = ::Gitlab::VersionInfo.parse(runner_version, parse_suffix: true)
- return { invalid_version: runner_version } unless runner_version.valid?
- return { error: runner_version } unless runner_releases_store.releases
+ return { runner_version => :invalid_version } unless runner_version.valid?
+ return { runner_version => :error } unless runner_releases_store.releases
- # Recommend update if outside of backport window
- recommended_version = recommendation_if_outside_backport_window(runner_version)
- return { recommended: recommended_version } if recommended_version
+ suggestions = {}
- # Recommend patch update if there's a newer release in a same minor branch as runner
- recommended_version = recommended_runner_release_update(runner_version)
- return { recommended: recommended_version } if recommended_version
+ # Recommend update if outside of backport window
+ unless add_recommendation_if_outside_backport_window(runner_version, suggestions)
+ # Recommend patch update if there's a newer release in a same minor branch as runner
+ add_recommended_runner_release_update(runner_version, suggestions)
+ end
# Consider update if there's a newer release within the currently deployed GitLab version
- available_version = available_runner_release(runner_version)
- return { available: available_version } if available_version
+ add_available_runner_release(runner_version, suggestions)
- { not_available: runner_version }
- end
+ suggestions[runner_version] = :not_available if suggestions.empty?
- private
+ suggestions
+ end
- def recommended_runner_release_update(runner_version)
+ def add_recommended_runner_release_update(runner_version, suggestions)
recommended_release = runner_releases_store.releases_by_minor[runner_version.without_patch]
- return recommended_release if recommended_release && recommended_release > runner_version
+ return true if add_suggestion(suggestions, runner_version, recommended_release, :recommended)
# Consider the edge case of pre-release runner versions that get registered, but are never published.
# In this case, suggest the latest compatible runner version
- latest_release = runner_releases_store.releases_by_minor.values.select { |v| v < gitlab_version }.max
- latest_release if latest_release && latest_release > runner_version
- end
-
- def available_runner_release(runner_version)
- available_release = runner_releases_store.releases_by_minor[gitlab_version.without_patch]
- available_release if available_release && available_release > runner_version
+ latest_release = runner_releases_store.releases_by_minor.values.select { |v| v < @gitlab_version }.max
+ add_suggestion(suggestions, runner_version, latest_release, :recommended)
end
- def gitlab_version
- @gitlab_version ||= ::Gitlab::VersionInfo.parse(::Gitlab::VERSION, parse_suffix: true)
- end
-
- def runner_releases_store
- RunnerReleases.instance
+ def add_available_runner_release(runner_version, suggestions)
+ available_version = runner_releases_store.releases_by_minor[@gitlab_version.without_patch]
+ unless suggestions.include?(available_version)
+ add_suggestion(suggestions, runner_version, available_version, :available)
+ end
end
- def recommendation_if_outside_backport_window(runner_version)
- return if runner_releases_store.releases.empty?
- return if runner_version >= runner_releases_store.releases.last # return early if runner version is too new
+ def add_recommendation_if_outside_backport_window(runner_version, suggestions)
+ return false if runner_releases_store.releases.empty?
+ return false if runner_version >= runner_releases_store.releases.last # return early if runner version is too new
minor_releases_with_index = runner_releases_store.releases_by_minor.keys.each_with_index.to_h
runner_minor_version_index = minor_releases_with_index[runner_version.without_patch]
@@ -62,14 +75,15 @@ module Gitlab
outside_window = minor_releases_with_index.count - runner_minor_version_index > 3
if outside_window
- recommended_release = runner_releases_store.releases_by_minor[gitlab_version.without_patch]
-
- recommended_release if recommended_release && recommended_release > runner_version
+ recommended_version = runner_releases_store.releases_by_minor[@gitlab_version.without_patch]
+ return add_suggestion(suggestions, runner_version, recommended_version, :recommended)
end
else
# If unknown runner version, then recommend the latest version for the GitLab instance
- recommended_runner_release_update(gitlab_version)
+ return add_recommended_runner_release_update(@gitlab_version, suggestions)
end
+
+ false
end
end
end