Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/ci/runner_releases.rb')
-rw-r--r--lib/gitlab/ci/runner_releases.rb67
1 files changed, 51 insertions, 16 deletions
diff --git a/lib/gitlab/ci/runner_releases.rb b/lib/gitlab/ci/runner_releases.rb
index 944c24ca128..8773ecbf09e 100644
--- a/lib/gitlab/ci/runner_releases.rb
+++ b/lib/gitlab/ci/runner_releases.rb
@@ -6,48 +6,83 @@ module Gitlab
include Singleton
RELEASES_VALIDITY_PERIOD = 1.day
- RELEASES_VALIDITY_AFTER_ERROR_PERIOD = 5.seconds
INITIAL_BACKOFF = 5.seconds
MAX_BACKOFF = 1.hour
BACKOFF_GROWTH_FACTOR = 2.0
def initialize
- reset!
+ reset_backoff!
end
# Returns a sorted list of the publicly available GitLab Runner releases
#
def releases
- return @releases unless Time.now.utc >= @expire_time
+ return if backoff_active?
+
+ Rails.cache.fetch(
+ cache_key,
+ skip_nil: true,
+ expires_in: RELEASES_VALIDITY_PERIOD,
+ race_condition_ttl: 10.seconds
+ ) do
+ response = Gitlab::HTTP.try_get(runner_releases_url)
+ @releases_by_minor = nil
+
+ unless response&.success?
+ @backoff_expire_time = next_backoff.from_now
+ break nil
+ end
+
+ reset_backoff!
+ extract_releases(response)
+ end
+ end
+
+ # Returns a hash with the latest runner version per minor release
+ #
+ def releases_by_minor
+ return unless releases
- @releases = fetch_new_releases
+ @releases_by_minor ||= releases.group_by(&:without_patch).transform_values(&:max)
end
- def reset!
- @expire_time = Time.now.utc
- @releases = nil
+ def reset_backoff!
+ @backoff_expire_time = nil
@backoff_count = 0
end
- public_class_method :instance
-
private
- def fetch_new_releases
- response = Gitlab::HTTP.try_get(::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url)
+ def runner_releases_url
+ @runner_releases_url ||= ::Gitlab::CurrentSettings.current_application_settings.public_runner_releases_url
+ end
- releases = response.success? ? extract_releases(response) : nil
- ensure
- @expire_time = (releases ? RELEASES_VALIDITY_PERIOD : next_backoff).from_now
+ def cache_key
+ runner_releases_url
+ end
+
+ def backoff_active?
+ return false unless @backoff_expire_time
+
+ Time.now.utc < @backoff_expire_time
end
def extract_releases(response)
- response.parsed_response.map { |release| parse_runner_release(release) }.sort!
+ return unless response.parsed_response.is_a?(Array)
+
+ releases = response.parsed_response
+ .map { |release| parse_runner_release(release) }
+ .select(&:valid?)
+ .sort!
+
+ return if releases.empty? && response.parsed_response.present?
+
+ releases
end
def parse_runner_release(release)
- ::Gitlab::VersionInfo.parse(release['name'].delete_prefix('v'))
+ ::Gitlab::VersionInfo.parse(release['name'], parse_suffix: true)
end
def next_backoff