2022-03-31 18:08:39 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Gitlab
|
|
|
|
module Ci
|
|
|
|
class RunnerUpgradeCheck
|
|
|
|
include Singleton
|
|
|
|
|
|
|
|
def check_runner_upgrade_status(runner_version)
|
2022-06-30 21:09:49 +00:00
|
|
|
runner_version = ::Gitlab::VersionInfo.parse(runner_version, parse_suffix: true)
|
2022-03-31 18:08:39 +00:00
|
|
|
|
2022-07-12 18:08:46 +00:00
|
|
|
return :invalid_version unless runner_version.valid?
|
2022-03-31 18:08:39 +00:00
|
|
|
|
2022-06-23 15:09:32 +00:00
|
|
|
releases = RunnerReleases.instance.releases
|
2022-07-06 09:08:10 +00:00
|
|
|
return :error unless releases
|
2022-06-19 21:08:38 +00:00
|
|
|
|
2022-06-27 00:08:19 +00:00
|
|
|
# Recommend patch update if there's a newer release in a same minor branch as runner
|
|
|
|
releases.each do |available_release|
|
|
|
|
if available_release.same_minor_version?(runner_version) && available_release > runner_version
|
|
|
|
return :recommended
|
2022-06-22 15:09:48 +00:00
|
|
|
end
|
2022-06-27 00:08:19 +00:00
|
|
|
end
|
2022-06-19 21:08:38 +00:00
|
|
|
|
2022-06-27 00:08:19 +00:00
|
|
|
# Recommend update if outside of backport window
|
|
|
|
if outside_backport_window?(runner_version, releases)
|
|
|
|
return :recommended
|
|
|
|
end
|
2022-03-31 18:08:39 +00:00
|
|
|
|
2022-06-27 00:08:19 +00:00
|
|
|
# Consider update if there's a newer release within the currently deployed GitLab version
|
|
|
|
releases.each do |available_release|
|
|
|
|
if available_release.same_minor_version?(gitlab_version) && available_release > runner_version
|
|
|
|
return :available
|
|
|
|
end
|
|
|
|
end
|
2022-03-31 18:08:39 +00:00
|
|
|
|
2022-06-27 00:08:19 +00:00
|
|
|
:not_available
|
2022-03-31 18:08:39 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2022-06-27 00:08:19 +00:00
|
|
|
def gitlab_version
|
|
|
|
@gitlab_version ||= ::Gitlab::VersionInfo.parse(::Gitlab::VERSION)
|
|
|
|
end
|
|
|
|
|
2022-03-31 18:08:39 +00:00
|
|
|
def patch_update?(available_release, runner_version)
|
|
|
|
# https://docs.gitlab.com/ee/policy/maintenance.html#patch-releases
|
|
|
|
available_release.major == runner_version.major &&
|
|
|
|
available_release.minor == runner_version.minor &&
|
|
|
|
available_release.patch > runner_version.patch
|
|
|
|
end
|
|
|
|
|
|
|
|
def outside_backport_window?(runner_version, releases)
|
2022-07-06 09:08:10 +00:00
|
|
|
return false if releases.empty? || runner_version >= releases.last # return early if runner version is too new
|
2022-03-31 18:08:39 +00:00
|
|
|
|
2022-06-22 15:09:48 +00:00
|
|
|
latest_minor_releases = releases.map(&:without_patch).uniq
|
2022-03-31 18:08:39 +00:00
|
|
|
latest_version_position = latest_minor_releases.count - 1
|
2022-06-22 15:09:48 +00:00
|
|
|
runner_version_position = latest_minor_releases.index(runner_version.without_patch)
|
2022-03-31 18:08:39 +00:00
|
|
|
|
|
|
|
return true if runner_version_position.nil? # consider outside if version is too old
|
|
|
|
|
|
|
|
# https://docs.gitlab.com/ee/policy/maintenance.html#backporting-to-older-releases
|
|
|
|
latest_version_position - runner_version_position > 2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|